From 585d33cafa9da3716cb4f269f1831a64eb1268a1 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Tue, 17 Jan 2023 16:31:44 +0800 Subject: [PATCH] feat: add Generate for create stream --- stream/stream.go | 16 ++++++++++++++++ stream/stream_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/stream/stream.go b/stream/stream.go index f02fd03..9bf4537 100644 --- a/stream/stream.go +++ b/stream/stream.go @@ -56,6 +56,22 @@ func Of[T any](elems ...T) stream[T] { return FromSlice(elems) } +// Generate stream where each element is generated by the provided generater function +// generater function: func(args ...U) func() (item T, ok bool) {} +func Generate[T any](generator func() func() (T, bool)) stream[T] { + source := make([]T, 0) + + var zeroValue T + for next, item, ok := generator(), zeroValue, true; ok; { + item, ok = next() + if ok { + source = append(source, item) + } + } + + return FromSlice(source) +} + // FromSlice create stream from slice. func FromSlice[T any](source []T) stream[T] { return stream[T]{source: source} diff --git a/stream/stream_test.go b/stream/stream_test.go index 948ccbb..0cc41be 100644 --- a/stream/stream_test.go +++ b/stream/stream_test.go @@ -6,6 +6,31 @@ import ( "github.com/duke-git/lancet/v2/internal" ) +func TestOf(t *testing.T) { + assert := internal.NewAssert(t, "TestFromSlice") + + stream := Of(1, 2, 3) + assert.Equal([]int{1, 2, 3}, stream.ToSlice()) +} + +func TestGenerate(t *testing.T) { + assert := internal.NewAssert(t, "TestFromSlice") + + n := 0 + max := 4 + + generator := func() func() (int, bool) { + return func() (int, bool) { + n++ + return n, n < max + } + } + + stream := Generate(generator) + + assert.Equal([]int{1, 2, 3}, stream.ToSlice()) +} + func TestFromSlice(t *testing.T) { assert := internal.NewAssert(t, "TestFromSlice")