@@ -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
2728function 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)
3131end
3232
33+ collect_structarray (itr, fr; initializer = default_initializer) =
34+ collect_structarray (itr, fr, Base. IteratorSize (itr); initializer = initializer)
35+
3336function 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)
3640end
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)
4850end
4951
5052function 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
6870end
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