Skip to content

Commit 079a597

Browse files
authored
feat: filter channel
1 parent 1362921 commit 079a597

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

channels/channels.go

+16
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,19 @@ func Drain[T any](input <-chan T) {
5555
}
5656
}()
5757
}
58+
59+
// Filter filters the channel with the given function.
60+
func Filter[T any](input <-chan T, fn func(T) bool) <-chan T {
61+
c := make(chan T)
62+
63+
go func() {
64+
defer close(c)
65+
for v := range input {
66+
if fn(v) {
67+
c <- v
68+
}
69+
}
70+
}()
71+
72+
return c
73+
}

channels/channels_test.go

+22
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,25 @@ func TestDrain(t *testing.T) {
4141

4242
require.Empty(t, in, 0)
4343
}
44+
45+
func TestFilter(t *testing.T) {
46+
in := make(chan int)
47+
out := Filter(in, func(v int) bool {
48+
return v%2 == 0
49+
})
50+
51+
go func() {
52+
in <- 1
53+
in <- 2
54+
in <- 3
55+
close(in)
56+
}()
57+
58+
el := []int{}
59+
60+
for v := range out {
61+
el = append(el, v)
62+
}
63+
64+
assert.Equal(t, []int{2}, el)
65+
}

0 commit comments

Comments
 (0)