From c0f4fa031a208cd2723da07f2374c5e29710cc3f Mon Sep 17 00:00:00 2001 From: Michael Abbott <32575566+mcabbott@users.noreply.github.com> Date: Mon, 19 Aug 2019 21:16:06 -0400 Subject: [PATCH 1/4] filter(f, tuple) --- base/tuple.jl | 15 +++++++++++++++ test/tuple.jl | 9 +++++++++ 2 files changed, 24 insertions(+) diff --git a/base/tuple.jl b/base/tuple.jl index 7e8c6804bc496..2ff7f6ba1552a 100644 --- a/base/tuple.jl +++ b/base/tuple.jl @@ -249,6 +249,21 @@ _totuple(::Type{Tuple}, itr, s...) = (collect(Iterators.rest(itr,s...))...,) end +## filter ## + +filter(f, t::Tuple) = _filter(f, t, ()) +function _filter(f, t::Tuple, r::Tuple) + @_inline_meta + if f(first(t)) + _filter(f, tail(t), (r..., first(t))) + else + _filter(f, tail(t), r) + end +end +_filter(f, t::Tuple{}, r::Tuple) = r +# use Array for long tuples +filter(f, t::Any16) = Tuple(filter(f, collect(t))) + ## comparison ## isequal(t1::Tuple, t2::Tuple) = (length(t1) == length(t2)) && _isequal(t1, t2) diff --git a/test/tuple.jl b/test/tuple.jl index 26d5d5f58d953..178aae69c4600 100644 --- a/test/tuple.jl +++ b/test/tuple.jl @@ -247,6 +247,15 @@ end @test_throws ArgumentError mapfoldl(abs, =>, ()) end +@testset "filter" begin + @test filter(isodd, (1,2,3)) == (1, 3) + @test filter(isequal(2), (true, 2.0, 3)) === (2.0,) + @test filter(i -> true, ()) == () + @test filter(identity, (true,)) === (true,) + longtuple = ntuple(identity, 20) + @test filter(iseven, longtuple) == ntuple(i->2i, 10) +end + @testset "comparison and hash" begin @test isequal((), ()) @test isequal((1,2,3), (1,2,3)) From bba183718e96df85bd701822eca187a98e3a7b2b Mon Sep 17 00:00:00 2001 From: Michael Abbott <32575566+mcabbott@users.noreply.github.com> Date: Tue, 20 Aug 2019 00:07:38 -0400 Subject: [PATCH 2/4] one test --- base/tuple.jl | 4 ++-- test/tuple.jl | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/base/tuple.jl b/base/tuple.jl index 2ff7f6ba1552a..4de4683852577 100644 --- a/base/tuple.jl +++ b/base/tuple.jl @@ -255,9 +255,9 @@ filter(f, t::Tuple) = _filter(f, t, ()) function _filter(f, t::Tuple, r::Tuple) @_inline_meta if f(first(t)) - _filter(f, tail(t), (r..., first(t))) + return _filter(f, tail(t), (r..., first(t))) else - _filter(f, tail(t), r) + return _filter(f, tail(t), r) end end _filter(f, t::Tuple{}, r::Tuple) = r diff --git a/test/tuple.jl b/test/tuple.jl index 178aae69c4600..746fc297b1e9c 100644 --- a/test/tuple.jl +++ b/test/tuple.jl @@ -254,6 +254,7 @@ end @test filter(identity, (true,)) === (true,) longtuple = ntuple(identity, 20) @test filter(iseven, longtuple) == ntuple(i->2i, 10) + @test filter(x -> x<2, (longtuple..., 1.5)) === (1, 1.5) end @testset "comparison and hash" begin From eac113af06b34a7edadde2a9401cfc8766e23aad Mon Sep 17 00:00:00 2001 From: Michael Abbott <32575566+mcabbott@users.noreply.github.com> Date: Thu, 26 Sep 2019 16:09:34 +0200 Subject: [PATCH 3/4] afoldl magic one-line Co-authored-by: Takafumi Arakaki --- base/tuple.jl | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/base/tuple.jl b/base/tuple.jl index 4de4683852577..298c4d5246925 100644 --- a/base/tuple.jl +++ b/base/tuple.jl @@ -251,16 +251,8 @@ end ## filter ## -filter(f, t::Tuple) = _filter(f, t, ()) -function _filter(f, t::Tuple, r::Tuple) - @_inline_meta - if f(first(t)) - return _filter(f, tail(t), (r..., first(t))) - else - return _filter(f, tail(t), r) - end -end -_filter(f, t::Tuple{}, r::Tuple) = r +filter(f, xs::Tuple) = afoldl((ys, x) -> f(x) ? (ys..., x) : ys, (), xs...) + # use Array for long tuples filter(f, t::Any16) = Tuple(filter(f, collect(t))) From d913e8009b555a8031c7065ff9e59c8fafebfe73 Mon Sep 17 00:00:00 2001 From: Michael Abbott <32575566+mcabbott@users.noreply.github.com> Date: Thu, 26 Sep 2019 16:17:09 +0200 Subject: [PATCH 4/4] add news, for 1.4 --- NEWS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS.md b/NEWS.md index c09785c4f4f48..0ff86742a037d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -24,6 +24,7 @@ New library functions Standard library changes ------------------------ +* `filter` can now act on a `Tuple` ([#32968]). #### Libdl