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