mirror of
https://github.com/duke-git/lancet.git
synced 2026-02-15 18:22:27 +08:00
feat: add Take function to generate a chan of values taken from another chan
This commit is contained in:
@@ -52,3 +52,22 @@ func (c *Channel) Repeat(done <-chan any, values ...any) <-chan any {
|
|||||||
}()
|
}()
|
||||||
return dataStream
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ func TestGenerate(t *testing.T) {
|
|||||||
intStream := c.Generate(done, 1, 2, 3)
|
intStream := c.Generate(done, 1, 2, 3)
|
||||||
|
|
||||||
// for v := range intStream {
|
// for v := range intStream {
|
||||||
// t.Log(v)
|
// t.Log(v) //1, 2, 3
|
||||||
// }
|
// }
|
||||||
assert.Equal(1, <-intStream)
|
assert.Equal(1, <-intStream)
|
||||||
assert.Equal(2, <-intStream)
|
assert.Equal(2, <-intStream)
|
||||||
@@ -24,18 +24,46 @@ func TestGenerate(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRepeat(t *testing.T) {
|
func TestRepeat(t *testing.T) {
|
||||||
// assert := internal.NewAssert(t, "TestRepeat")
|
assert := internal.NewAssert(t, "TestRepeat")
|
||||||
|
|
||||||
done := make(chan any)
|
done := make(chan any)
|
||||||
defer close(done)
|
defer close(done)
|
||||||
|
|
||||||
c := NewChannel()
|
c := NewChannel()
|
||||||
intStream := c.Repeat(done, 1, 2)
|
intStream := c.Take(done, c.Repeat(done, 1, 2), 5)
|
||||||
|
|
||||||
for v := range intStream {
|
// for v := range intStream {
|
||||||
t.Log(v)
|
// t.Log(v) //1, 2, 1, 2, 1
|
||||||
}
|
// }
|
||||||
// assert.Equal(1, <-intStream)
|
assert.Equal(1, <-intStream)
|
||||||
// assert.Equal(2, <-intStream)
|
assert.Equal(2, <-intStream)
|
||||||
// assert.Equal(3, <-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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user