mirror of
https://github.com/duke-git/lancet.git
synced 2026-02-04 12:52:28 +08:00
feat: add Generate for create stream
This commit is contained in:
@@ -56,6 +56,22 @@ func Of[T any](elems ...T) stream[T] {
|
|||||||
return FromSlice(elems)
|
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.
|
// FromSlice create stream from slice.
|
||||||
func FromSlice[T any](source []T) stream[T] {
|
func FromSlice[T any](source []T) stream[T] {
|
||||||
return stream[T]{source: source}
|
return stream[T]{source: source}
|
||||||
|
|||||||
@@ -6,6 +6,31 @@ import (
|
|||||||
"github.com/duke-git/lancet/v2/internal"
|
"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) {
|
func TestFromSlice(t *testing.T) {
|
||||||
assert := internal.NewAssert(t, "TestFromSlice")
|
assert := internal.NewAssert(t, "TestFromSlice")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user