diff --git a/src/core.jl b/src/core.jl index 3b93930..2b43ad2 100644 --- a/src/core.jl +++ b/src/core.jl @@ -516,6 +516,7 @@ immutable Unsupported <: AxisTrait end """ axistrait(ax::Axis) -> Type{<:AxisTrait} + axistrait{T}(::Type{T}) -> Type{<:AxisTrait} Returns the indexing type of an `Axis`, any subtype of `AxisTrait`. The default is `Unsupported`, meaning there is no special indexing behaviour for this axis @@ -528,13 +529,16 @@ User-defined axis types can be added along with custom indexing behaviors by def methods of this function. Here is the example of adding a custom Dimensional axis: ```julia -AxisArrays.axistrait(v::MyCustomAxis) = AxisArrays.Dimensional +AxisArrays.axistrait(::Type{MyCustomAxis}) = AxisArrays.Dimensional ``` """ -axistrait(::Any) = Unsupported -axistrait(ax::Axis) = axistrait(ax.val) -axistrait{T<:Union{Number, Dates.AbstractTime}}(::AbstractVector{T}) = Dimensional -axistrait{T<:Union{Symbol, AbstractString}}(::AbstractVector{T}) = Categorical +axistrait{T}(::T) = axistrait(T) +axistrait{T}(::Type{T}) = Unsupported +axistrait{name, T}(::Type{Axis{name, T}}) = axistrait(T) +axistrait{T<:AbstractVector}(::Type{T}) = _axistrait_el(eltype(T)) +_axistrait_el{T<:Union{Number, Dates.AbstractTime}}(::Type{T}) = Dimensional +_axistrait_el{T<:Union{Symbol, AbstractString}}(::Type{T}) = Categorical +_axistrait_el{T}(::Type{T}) = Unsupported checkaxis(ax::Axis) = checkaxis(ax.val) checkaxis(ax) = checkaxis(axistrait(ax), ax) diff --git a/src/sortedvector.jl b/src/sortedvector.jl index 4338769..72ee992 100644 --- a/src/sortedvector.jl +++ b/src/sortedvector.jl @@ -65,7 +65,7 @@ Base.size(v::SortedVector) = size(v.data) Base.size(v::SortedVector, i) = size(v.data, i) Base.indices(v::SortedVector) = indices(v.data) -axistrait(::SortedVector) = Dimensional +axistrait{T}(::Type{SortedVector{T}}) = Dimensional checkaxis(::SortedVector) = nothing diff --git a/test/core.jl b/test/core.jl index bf12b7b..a2fdf10 100644 --- a/test/core.jl +++ b/test/core.jl @@ -187,9 +187,13 @@ A = @inferred(AxisArray(vals, Axis{:Timestamp}(dt-Dates.Hour(2):Dates.Hour(1):dt @test A[dt, :].data == vals[3, :] @test AxisArrays.axistrait(A.axes[1]) == AxisArrays.Dimensional +@test AxisArrays.axistrait(typeof(A.axes[1])) == AxisArrays.Dimensional @test AxisArrays.axistrait(A.axes[1].val) == AxisArrays.Dimensional +@test AxisArrays.axistrait(typeof(A.axes[1].val)) == AxisArrays.Dimensional @test AxisArrays.axistrait(A.axes[2]) == AxisArrays.Categorical +@test AxisArrays.axistrait(typeof(A.axes[2])) == AxisArrays.Categorical @test AxisArrays.axistrait(A.axes[2].val) == AxisArrays.Categorical +@test AxisArrays.axistrait(typeof(A.axes[2].val)) == AxisArrays.Categorical @test_throws ArgumentError AxisArrays.checkaxis(Axis{:x}(10:-1:1)) @test_throws ArgumentError AxisArrays.checkaxis(10:-1:1)