1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-04 12:52:28 +08:00

feat: add Take function to generate a chan of values taken from another chan

This commit is contained in:
dudaodong
2022-04-15 16:22:19 +08:00
parent a4900fecb4
commit f66c0938e5
2 changed files with 56 additions and 9 deletions

View File

@@ -52,3 +52,22 @@ func (c *Channel) Repeat(done <-chan any, values ...any) <-chan any {
}()
return dataStream
}
// Take return a chan whose values are tahken from another chan
func (c *Channel) Take(done <-chan any, valueStream <-chan any, number int) <-chan any {
takeStream := make(chan any)
go func() {
defer close(takeStream)
for i := 0; i < number; i++ {
select {
case <-done:
return
case takeStream <- <-valueStream:
}
}
}()
return takeStream
}

View File

@@ -16,7 +16,7 @@ func TestGenerate(t *testing.T) {
intStream := c.Generate(done, 1, 2, 3)
// for v := range intStream {
// t.Log(v)
// t.Log(v) //1, 2, 3
// }
assert.Equal(1, <-intStream)
assert.Equal(2, <-intStream)
@@ -24,18 +24,46 @@ func TestGenerate(t *testing.T) {
}
func TestRepeat(t *testing.T) {
// assert := internal.NewAssert(t, "TestRepeat")
assert := internal.NewAssert(t, "TestRepeat")
done := make(chan any)
defer close(done)
c := NewChannel()
intStream := c.Repeat(done, 1, 2)
intStream := c.Take(done, c.Repeat(done, 1, 2), 5)
for v := range intStream {
t.Log(v)
}
// assert.Equal(1, <-intStream)
// assert.Equal(2, <-intStream)
// assert.Equal(3, <-intStream)
// for v := range intStream {
// t.Log(v) //1, 2, 1, 2, 1
// }
assert.Equal(1, <-intStream)
assert.Equal(2, <-intStream)
assert.Equal(1, <-intStream)
assert.Equal(2, <-intStream)
assert.Equal(1, <-intStream)
}
func TestTake(t *testing.T) {
assert := internal.NewAssert(t, "TestRepeat")
done := make(chan any)
defer close(done)
numbers := make(chan any, 5)
numbers <- 1
numbers <- 2
numbers <- 3
numbers <- 4
numbers <- 5
defer close(numbers)
c := NewChannel()
intStream := c.Take(done, numbers, 3)
// for v := range intStream {
// t.Log(v) //1, 2, 3
// }
assert.Equal(1, <-intStream)
assert.Equal(2, <-intStream)
assert.Equal(3, <-intStream)
}