|
| 1 | +#= |
| 2 | +
|
| 3 | +This is an experiment, with returning something very similar to a KeyedArray from axes(A). |
| 4 | +The reason to do so is that things like similar(C, axes(A,1), axes(B,2)) could propagate keys. |
| 5 | +However right now axes(A,1) !isa Base.OneTo results in lots of OffsetArrays... |
| 6 | +
|
| 7 | +=# |
| 8 | + |
| 9 | +struct KeyedUnitRange{T,AT,KT} <: AbstractUnitRange{T} |
| 10 | + data::AT |
| 11 | + keys::KT |
| 12 | + function KeyedUnitRange(data::AT, keys::KT) where {AT<:AbstractUnitRange{T}, KT<:AbstractVector} where {T} |
| 13 | + new{T,AT,KT}(data, keys) |
| 14 | + end |
| 15 | +end |
| 16 | + |
| 17 | +Base.parent(A::KeyedUnitRange) = getfield(A, :data) |
| 18 | +keyless(A::KeyedUnitRange) = parent(A) |
| 19 | + |
| 20 | +for f in [:size, :first, :last, :IndexStyle] |
| 21 | + @eval Base.$f(A::KeyedUnitRange) = $f(parent(A)) |
| 22 | +end |
| 23 | + |
| 24 | +Base.getindex(A::KeyedUnitRange, inds::Integer) = getindex(parent(A), inds) |
| 25 | + |
| 26 | +axiskeys(A::KeyedUnitRange) = tuple(getfield(A, :keys)) |
| 27 | +axiskeys(A::KeyedUnitRange, d::Integer) = d==1 ? getfield(A, :keys) : Base.OneTo(1) |
| 28 | + |
| 29 | + |
| 30 | +# getkey(A::AbstractKeyedArray{<:Any,1}, key) = findfirst(isequal(key), axiskeys(A)[1]) |
| 31 | + |
| 32 | +function Base.axes(A::KeyedArray) |
| 33 | + ntuple(ndims(A)) do d |
| 34 | + KeyedUnitRange(axes(parent(A),d), axiskeys(A, d)) |
| 35 | + end |
| 36 | +end |
| 37 | + |
| 38 | +KeyedUnion{T} = Union{KeyedArray{T}, KeyedUnitRange{T}} |
| 39 | + |
| 40 | +Base.summary(io::IO, x::KeyedUnion) = _summary(io, x) |
| 41 | +Base.summary(io::IO, A::NamedDimsArray{L,T,N,<:KeyedUnion}) where {L,T,N} = _summary(io, A) |
| 42 | +showtype(io::IO, ::KeyedUnitRange) = print(io, "KeyedUnitRange(...)") |
| 43 | + |
| 44 | +function Base.show(io::IO, m::MIME"text/plain", x::KeyedUnitRange) |
| 45 | + summary(io, x) |
| 46 | + println(io, ":") |
| 47 | + keyed_print_matrix(io, x) |
| 48 | +end |
| 49 | + |
| 50 | +function Base.show(io::IO, x::KeyedUnitRange) |
| 51 | + print(io, "KeyedUnitRange(", keyless(x), ", ", axiskeys(x,1), ")") |
| 52 | +end |
0 commit comments