9292
9393for (T, S) in [(:KeyedVecOrMat , :KeyedVecOrMat ), # KeyedArray gives ambiguities
9494 (:KeyedVecOrMat , :AbstractVecOrMat ), (:AbstractVecOrMat , :KeyedVecOrMat ),
95- (:NdaKaVoM , :NdaKaVoM ), # These are needed because hcat(NamedDimsArray...) relies on similar()
95+ (:NdaKaVoM , :NdaKaVoM ),
9696 (:NdaKaVoM , :KeyedVecOrMat ), (:KeyedVecOrMat , :NdaKaVoM ),
97- (:NdaKaVoM , :AbstractVecOrMat ), (:AbstractVecOrMat , :NdaKaVoM ) ]
97+ (:NdaKaVoM , :AbstractVecOrMat ), (:AbstractVecOrMat , :NdaKaVoM ),
98+ ]
9899
99100 @eval function Base. vcat (A:: $T , B:: $S , Cs:: AbstractVecOrMat... )
100101 data = vcat (keyless (A), keyless (B), keyless .(Cs)... )
@@ -118,13 +119,23 @@ for (T, S) in [ (:KeyedArray, :KeyedArray),
118119 (:KeyedArray , :NamedDimsArray ), (:NamedDimsArray , :KeyedArray ),
119120 (:NdaKa , :NdaKa ),
120121 (:NdaKa , :KeyedArray ), (:KeyedArray , :NdaKa ),
121- (:NdaKa , :AbstractArray ), (:AbstractArray , :NdaKa ) ]
122+ (:NdaKa , :AbstractArray ), (:AbstractArray , :NdaKa ),
123+ ]
122124
123125 @eval function Base. cat (A:: $T , B:: $S , Cs:: AbstractArray... ; dims)
124- # numerical_dims = hasnames(A) || hasnames(B) ? ... todo!
125- data = cat (keyless (A), keyless (B), keyless .(Cs)... ; dims= dims)
126+ numerical_dims, data = if any (hasnames .((A, B, Cs... )))
127+ old_names = NamedDims. unify_names_longest (dimnames (A), dimnames (B), dimnames .(Cs)... )
128+ new_names = NamedDims. expand_dimnames (old_names, dims)
129+ α = NamedDims. dim (new_names, dims)
130+ β = cat (keyless (A), keyless (B), keyless .(Cs)... ; dims= dims)
131+ α, β
132+ else
133+ α = val_strip (dims)
134+ β = cat (keyless (A), keyless (B), keyless .(Cs)... ; dims= numerical_dims)
135+ α, β
136+ end
126137 new_keys = ntuple (ndims (data)) do d
127- if d in dims
138+ if d in numerical_dims
128139 key_vcat (keys_or_axes (A,d), keys_or_axes (B,d), keys_or_axes .(Cs,d)... )
129140 else
130141 unify_one (keys_or_axes (A,d), keys_or_axes (B,d), keys_or_axes .(Cs,d)... )
@@ -134,6 +145,8 @@ for (T, S) in [ (:KeyedArray, :KeyedArray),
134145 end
135146
136147end
148+ val_strip (dims:: Val{d} ) where {d} = d
149+ val_strip (dims) = dims
137150key_vcat (a:: AbstractVector , b:: AbstractVector ) = vcat (a,b)
138151key_vcat (a:: Base.OneTo , b:: Base.OneTo ) = Base. OneTo (a. stop + b. stop)
139152key_vcat (a,b,cs... ) = key_vcat (key_vcat (a,b),cs... )
0 commit comments