@@ -2,6 +2,14 @@ using Base.Sort, Base.Order
22
33fastpermute! (v:: AbstractArray , p:: AbstractVector ) = copyto! (v, v[p])
44fastpermute! (v:: StructArray , p:: AbstractVector ) = permute! (v, p)
5+ fastpermute! (v:: PooledArray , p:: AbstractVector ) = permute! (v, p)
6+
7+ optimize_isequal (v:: AbstractArray ) = v
8+ optimize_isequal (v:: PooledArray ) = v. refs
9+ optimize_isequal (v:: StructArray{<:Union{Tuple, NamedTuple}} ) = StructArray (map (optimize_isequal, fieldarrays (v)))
10+
11+ pool (v:: AbstractArray , condition = ! isbitstype∘ eltype) = condition (v) ? convert (PooledArray, v) : v
12+ pool (v:: StructArray , condition = ! isbitstype∘ eltype) = replace_storage (t -> pool (t, condition), v)
513
614function Base. permute! (c:: StructArray , p:: AbstractVector )
715 foreachfield (v -> fastpermute! (v, p), c)
@@ -76,7 +84,7 @@ function refine_perm!(p, cols, c, x, y′, lo, hi)
7684 order = Perm (Forward, y′)
7785 y = something (forward_vec (order), y′)
7886 nc = length (cols)
79- for (_, idxs) in TiedIndices (x , p, lo: hi)
87+ for (_, idxs) in TiedIndices (optimize_isequal (x) , p, lo: hi)
8088 i, i1 = extrema (idxs)
8189 if i1 > i
8290 sort_sub_by! (p, i, i1, y, order, temp)
0 commit comments