diff --git a/src/DataAPI.jl b/src/DataAPI.jl index 7fbbd29..0924732 100644 --- a/src/DataAPI.jl +++ b/src/DataAPI.jl @@ -169,6 +169,34 @@ struct Cols{T<:Tuple} Cols(args...) = new{typeof(args)}(args) end +""" + BroadcastedSelector(selector) + +Wrapper type around a `Between`, `All` or `Cols` indicating that +an operation should be applied to each column included by the wrapped selector. + +# Examples +```jldoctest +julia> using DataAPI + +julia> DataAPI.Between(:a, :e) .=> sin +DataAPI.BroadcastedSelector{DataAPI.Between{Symbol, Symbol}}(DataAPI.Between{Symbol, Symbol}(:a, :e)) => sin + +julia> DataAPI.Cols(r"x") .=> [sum, prod] +2-element Vector{Pair{DataAPI.BroadcastedSelector{DataAPI.Cols{Tuple{Regex}}}, _A} where _A}: + DataAPI.BroadcastedSelector{DataAPI.Cols{Tuple{Regex}}}(DataAPI.Cols{Tuple{Regex}}((r"x",))) => sum + DataAPI.BroadcastedSelector{DataAPI.Cols{Tuple{Regex}}}(DataAPI.Cols{Tuple{Regex}}((r"x",))) => prod +``` +""" +struct BroadcastedSelector{T} + sel::T + BroadcastedSelector(sel) = new{typeof(sel)}(sel) +end + +Base.Broadcast.broadcastable(x::Between) = Ref(BroadcastedSelector(x)) +Base.Broadcast.broadcastable(x::All) = Ref(BroadcastedSelector(x)) +Base.Broadcast.broadcastable(x::Cols) = Ref(BroadcastedSelector(x)) + """ unwrap(x) diff --git a/test/runtests.jl b/test/runtests.jl index b62734c..a086310 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -63,6 +63,11 @@ end b = DataAPI.Between(x, y) @test b.first == (x isa Int ? x : Symbol(x)) @test b.last == (y isa Int ? y : Symbol(y)) + + @test (b .=> sum) === + (DataAPI.BroadcastedSelector(DataAPI.Between(x, y)) => sum) + @test (b .=> [sum, float]) == + (Ref(DataAPI.BroadcastedSelector(DataAPI.Between(x, y))) .=> [sum, float]) end @test_throws MethodError DataAPI.Between(true, 1) @@ -81,6 +86,15 @@ end @test length(a.cols) == 1 @test a.cols[1] isa v @test a.cols[1].cols == () + + @test (v() .=> sum) === + (DataAPI.BroadcastedSelector(v()) => sum) + @test (v(:a) .=> sum) === + (DataAPI.BroadcastedSelector(v(:a)) => sum) + @test (v((1,2,3), :b) .=> sum) === + (DataAPI.BroadcastedSelector(v((1,2,3), :b)) => sum) + @test (v() .=> [sum, float]) == + (Ref(DataAPI.BroadcastedSelector(v())) .=> [sum, float]) end end