From a4900fecb4ebcd99c6168be4a2a4c1ab38f7478b Mon Sep 17 00:00:00 2001 From: dudaodong Date: Fri, 15 Apr 2022 16:08:14 +0800 Subject: [PATCH] feat: add Repeate function to generate a chan of repeate values --- concurrency/channel.go | 26 +++++++++++++++++++++++--- concurrency/channel_test.go | 19 ++++++++++++++++++- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/concurrency/channel.go b/concurrency/channel.go index 86cdf6e..e45408f 100644 --- a/concurrency/channel.go +++ b/concurrency/channel.go @@ -14,14 +14,14 @@ func NewChannel() *Channel { return &Channel{} } -// Generate a data of type any chan -func (c *Channel) Generate(done <-chan any, datas ...any) <-chan any { +// Generate a data of type any chan, put param `values` into the chan +func (c *Channel) Generate(done <-chan any, values ...any) <-chan any { dataStream := make(chan any) go func() { defer close(dataStream) - for _, v := range datas { + for _, v := range values { select { case <-done: return @@ -32,3 +32,23 @@ func (c *Channel) Generate(done <-chan any, datas ...any) <-chan any { return dataStream } + +// Repeat return a data of type any chan, put param `values` into the chan repeatly, +// until close the `done` chan +func (c *Channel) Repeat(done <-chan any, values ...any) <-chan any { + dataStream := make(chan any) + + go func() { + defer close(dataStream) + for { + for _, v := range values { + select { + case <-done: + return + case dataStream <- v: + } + } + } + }() + return dataStream +} diff --git a/concurrency/channel_test.go b/concurrency/channel_test.go index c1d3396..2f1334e 100644 --- a/concurrency/channel_test.go +++ b/concurrency/channel_test.go @@ -7,7 +7,7 @@ import ( ) func TestGenerate(t *testing.T) { - assert := internal.NewAssert(t, "TestToChar") + assert := internal.NewAssert(t, "TestGenerate") done := make(chan any) defer close(done) @@ -22,3 +22,20 @@ func TestGenerate(t *testing.T) { assert.Equal(2, <-intStream) assert.Equal(3, <-intStream) } + +func TestRepeat(t *testing.T) { + // assert := internal.NewAssert(t, "TestRepeat") + + done := make(chan any) + defer close(done) + + c := NewChannel() + intStream := c.Repeat(done, 1, 2) + + for v := range intStream { + t.Log(v) + } + // assert.Equal(1, <-intStream) + // assert.Equal(2, <-intStream) + // assert.Equal(3, <-intStream) +}