@@ -1520,12 +1520,28 @@ end
15201520
15211521Base. map (f, A:: AbstractRaggedVectorOfArray ) = map (f, A. u)
15221522
1523- function Base. mapreduce (f, op, A:: AbstractRaggedVectorOfArray ; kwargs... )
1524- # For full reduction (no kwargs): safely recurse over u to handle ragged inner shapes.
1525- # The view-based approach uses size(A.u[1]) for all columns, which fails when inner
1526- # arrays are themselves ragged with different column counts.
1523+ # Named functor used by the nested-ragged mapreduce to ensure type-stable dispatch.
1524+ struct _RaggedMapReduce{F, Op}
1525+ f:: F
1526+ op:: Op
1527+ end
1528+ @inline (w:: _RaggedMapReduce )(u) = mapreduce (w. f, w. op, u)
1529+
1530+ # When inner elements are themselves ragged, the view-based approach fails: view uses
1531+ # size(A.u[1]) for every column, causing BoundsErrors when inner shapes differ.
1532+ # We recurse element-by-element instead. Dispatching on the type of A.u (rather than
1533+ # using an if-check at runtime) keeps inference type-stable down to Julia 1.10.
1534+ function Base. mapreduce (
1535+ f, op,
1536+ A:: AbstractRaggedVectorOfArray{T, N, <:AbstractVector{<:AbstractRaggedVectorOfArray}} ;
1537+ kwargs...
1538+ ) where {T, N}
15271539 isempty (kwargs) || return mapreduce (f, op, view (A, ntuple (_ -> :, ndims (A))... ); kwargs... )
1528- return mapreduce (u -> mapreduce (f, op, u), op, A. u)
1540+ return mapreduce (_RaggedMapReduce (f, op), op, A. u)
1541+ end
1542+
1543+ function Base. mapreduce (f, op, A:: AbstractRaggedVectorOfArray ; kwargs... )
1544+ return mapreduce (f, op, view (A, ntuple (_ -> :, ndims (A))... ); kwargs... )
15291545end
15301546function Base. mapreduce (
15311547 f, op, A:: AbstractRaggedVectorOfArray{T, 1, <:AbstractVector{T}} ; kwargs...
0 commit comments