Skip to content

Commit 248cd6c

Browse files
alystnalimilan
authored andcommitted
mergelevels(): more robust "fast path" detection (JuliaData#118)
no levels merging is required if all non-empty levels are the same
1 parent fa57ad2 commit 248cd6c

File tree

1 file changed

+7
-6
lines changed

1 file changed

+7
-6
lines changed

src/array.jl

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -340,14 +340,15 @@ Base.fill!(A::CategoricalArray, v::Any) =
340340

341341
function mergelevels(ordered, levels...)
342342
T = Base.promote_eltype(levels...)
343-
res = Array{T}(uninitialized, 0)
343+
res = Vector{T}(uninitialized, 0)
344344

345-
# Fast path in case all levels are equal
346-
if all(l -> l == levels[1], levels[2:end])
347-
append!(res, levels[1])
345+
nonempty_lv = findfirst(!isempty, levels)
346+
if nonempty_lv == 0
347+
# no levels
348348
return res, ordered
349-
elseif sum(l -> !isempty(l), levels) == 1
350-
append!(res, levels[findfirst(l -> !isempty(l), levels)])
349+
elseif all(l -> isempty(l) || l == levels[nonempty_lv], levels)
350+
# Fast path if all non-empty levels are equal
351+
append!(res, levels[nonempty_lv])
351352
return res, ordered
352353
end
353354

0 commit comments

Comments
 (0)