@@ -353,8 +353,6 @@ function Base.setindex!(
353353 value:: DenseAxisArray{T,N} ,
354354 args... ,
355355) where {T,N}
356- @show args
357- @show Base. to_index (A, args)
358356 for key in Base. product (args... )
359357 A[key... ] = value[key... ]
360358 end
@@ -583,22 +581,30 @@ Base.repeat(x::DenseAxisArray; kwargs...) = repeat(x.data; kwargs...)
583581
584582_get_subaxis (:: Colon , b) = b
585583
586- function _get_subaxis (a, b)
584+ function _get_subaxis (a:: AbstractVector , b)
587585 for ai in a
588586 if ! (ai in b)
589587 throw (KeyError (ai))
590588 end
591589 end
592590 return a
593591end
592+
593+ function _get_subaxis (a:: T , b:: AbstractVector{T} ) where {T}
594+ if ! (a in b)
595+ throw (KeyError (a))
596+ end
597+ return a
598+ end
599+
594600struct DenseAxisArrayView{T,N,D,A} <: AbstractArray{T,N}
595601 data:: D
596602 axes:: A
597603 function DenseAxisArrayView (
598604 x:: Containers.DenseAxisArray{T,N} ,
599605 args... ,
600606 ) where {T,N}
601- axis = tuple ([ _get_subaxis (a, b) for (a, b) in zip ( args, axes (x))] . .. )
607+ axis = _get_subaxis .( args, axes (x))
602608 return new {T,N,typeof(x),typeof(axis)} (x, axis)
603609 end
604610end
@@ -612,15 +618,20 @@ Base.size(x::DenseAxisArrayView) = length.(x.axes)
612618Base. axes (x:: DenseAxisArrayView ) = x. axes
613619
614620function Base. getindex (x:: DenseAxisArrayView , args... )
615- return getindex (x. data, args... )
621+ y = _get_subaxis .(args, x. axes)
622+ return getindex (x. data, y... )
616623end
617624
625+ Base. getindex (a:: DenseAxisArrayView , k:: DenseAxisArrayKey ) = a[k. I... ]
626+
618627function Base. setindex! (x:: DenseAxisArrayView , args... )
619628 return setindex! (x. data, args... )
620629end
621630
622631function Base. eachindex (A:: DenseAxisArrayView )
623- return DenseAxisArrayKey .(Base. product (A. axes... ))
632+ # Return a generator so that we lazily evaluate the product instead of
633+ # collecting into a vector.
634+ return (DenseAxisArrayKey (k) for k in Base. product (A. axes... ))
624635end
625636
626637Base. show (io:: IO , x:: DenseAxisArrayView ) = print (io, x. data)
0 commit comments