Skip to content

Commit 4ed7f79

Browse files
authored
Allow broadcasting All and Between (#10)
1 parent 708b8ba commit 4ed7f79

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

src/DataAPI.jl

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,34 @@ struct Cols{T<:Tuple}
169169
Cols(args...) = new{typeof(args)}(args)
170170
end
171171

172+
"""
173+
BroadcastedSelector(selector)
174+
175+
Wrapper type around a `Between`, `All` or `Cols` indicating that
176+
an operation should be applied to each column included by the wrapped selector.
177+
178+
# Examples
179+
```jldoctest
180+
julia> using DataAPI
181+
182+
julia> DataAPI.Between(:a, :e) .=> sin
183+
DataAPI.BroadcastedSelector{DataAPI.Between{Symbol, Symbol}}(DataAPI.Between{Symbol, Symbol}(:a, :e)) => sin
184+
185+
julia> DataAPI.Cols(r"x") .=> [sum, prod]
186+
2-element Vector{Pair{DataAPI.BroadcastedSelector{DataAPI.Cols{Tuple{Regex}}}, _A} where _A}:
187+
DataAPI.BroadcastedSelector{DataAPI.Cols{Tuple{Regex}}}(DataAPI.Cols{Tuple{Regex}}((r"x",))) => sum
188+
DataAPI.BroadcastedSelector{DataAPI.Cols{Tuple{Regex}}}(DataAPI.Cols{Tuple{Regex}}((r"x",))) => prod
189+
```
190+
"""
191+
struct BroadcastedSelector{T}
192+
sel::T
193+
BroadcastedSelector(sel) = new{typeof(sel)}(sel)
194+
end
195+
196+
Base.Broadcast.broadcastable(x::Between) = Ref(BroadcastedSelector(x))
197+
Base.Broadcast.broadcastable(x::All) = Ref(BroadcastedSelector(x))
198+
Base.Broadcast.broadcastable(x::Cols) = Ref(BroadcastedSelector(x))
199+
172200
"""
173201
unwrap(x)
174202

test/runtests.jl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ end
6363
b = DataAPI.Between(x, y)
6464
@test b.first == (x isa Int ? x : Symbol(x))
6565
@test b.last == (y isa Int ? y : Symbol(y))
66+
67+
@test (b .=> sum) ===
68+
(DataAPI.BroadcastedSelector(DataAPI.Between(x, y)) => sum)
69+
@test (b .=> [sum, float]) ==
70+
(Ref(DataAPI.BroadcastedSelector(DataAPI.Between(x, y))) .=> [sum, float])
6671
end
6772

6873
@test_throws MethodError DataAPI.Between(true, 1)
@@ -81,6 +86,15 @@ end
8186
@test length(a.cols) == 1
8287
@test a.cols[1] isa v
8388
@test a.cols[1].cols == ()
89+
90+
@test (v() .=> sum) ===
91+
(DataAPI.BroadcastedSelector(v()) => sum)
92+
@test (v(:a) .=> sum) ===
93+
(DataAPI.BroadcastedSelector(v(:a)) => sum)
94+
@test (v((1,2,3), :b) .=> sum) ===
95+
(DataAPI.BroadcastedSelector(v((1,2,3), :b)) => sum)
96+
@test (v() .=> [sum, float]) ==
97+
(Ref(DataAPI.BroadcastedSelector(v())) .=> [sum, float])
8498
end
8599

86100
end

0 commit comments

Comments
 (0)