Skip to content

Commit d93e4b2

Browse files
authored
allow collect_structarray from a given starting point (#61)
1 parent 077d849 commit d93e4b2

File tree

1 file changed

+13
-13
lines changed

1 file changed

+13
-13
lines changed

src/collect.jl

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,30 +21,32 @@ ArrayInitializer(unwrap = t->false) = ArrayInitializer(unwrap, default_array)
2121

2222
(s::ArrayInitializer)(S, d) = s.unwrap(S) ? buildfromschema(typ -> s(typ, d), S) : s.default_array(S, d)
2323

24+
_reshape(v, itr) = _reshape(v, itr, Base.IteratorSize(itr))
2425
_reshape(v, itr, ::Base.HasShape) = reshape(v, axes(itr))
2526
_reshape(v, itr, ::Union{Base.HasLength, Base.SizeUnknown}) = v
2627

2728
function collect_structarray(itr; initializer = default_initializer)
28-
sz = Base.IteratorSize(itr)
29-
v = collect_structarray(itr, sz, initializer = initializer)
30-
_reshape(v, itr, sz)
29+
fr = iterate(itr)
30+
fr === nothing ? collect_empty_structarray(itr; initializer = initializer) : collect_structarray(itr, fr; initializer = initializer)
3131
end
3232

33+
collect_structarray(itr, fr; initializer = default_initializer) =
34+
collect_structarray(itr, fr, Base.IteratorSize(itr); initializer = initializer)
35+
3336
function collect_empty_structarray(itr::T; initializer = default_initializer) where {T}
3437
S = Core.Compiler.return_type(first, Tuple{T})
35-
initializer(S, (0,))
38+
res = initializer(S, (0,))
39+
_reshape(res, itr)
3640
end
3741

38-
function collect_structarray(itr, ::Union{Base.HasShape, Base.HasLength};
42+
function collect_structarray(itr, elem, sz::Union{Base.HasShape, Base.HasLength};
3943
initializer = default_initializer)
40-
41-
st = iterate(itr)
42-
st === nothing && return collect_empty_structarray(itr, initializer = initializer)
43-
el, i = st
44+
el, i = elem
4445
S = typeof(el)
4546
dest = initializer(S, (length(itr),))
4647
dest[1] = el
47-
collect_to_structarray!(dest, itr, 2, i)
48+
v = collect_to_structarray!(dest, itr, 2, i)
49+
_reshape(v, itr, sz)
4850
end
4951

5052
function collect_to_structarray!(dest::AbstractArray{T}, itr, offs, st) where {T}
@@ -67,9 +69,7 @@ function collect_to_structarray!(dest::AbstractArray{T}, itr, offs, st) where {T
6769
return dest
6870
end
6971

70-
function collect_structarray(itr, ::Base.SizeUnknown; initializer = default_initializer)
71-
elem = iterate(itr)
72-
elem === nothing && return collect_empty_structarray(itr; initializer = initializer)
72+
function collect_structarray(itr, elem, ::Base.SizeUnknown; initializer = default_initializer)
7373
el, st = elem
7474
dest = initializer(typeof(el), (1,))
7575
dest[1] = el

0 commit comments

Comments
 (0)