diff --git a/stream/stream.go b/stream/stream.go index 47fc2e1..b4f71d8 100644 --- a/stream/stream.go +++ b/stream/stream.go @@ -10,6 +10,7 @@ import ( "bytes" "encoding/gob" + "github.com/duke-git/lancet/v2/slice" "golang.org/x/exp/constraints" ) @@ -23,7 +24,7 @@ import ( // Map(mapper func(item T) T) StreamI[T] // Peek(consumer func(item T)) StreamI[T] -// Sort(less func(a, b T) bool) StreamI[T] +// Sorted(less func(a, b T) bool) StreamI[T] // Max(less func(a, b T) bool) (T, bool) // Min(less func(a, b T) bool) (T, bool) @@ -312,6 +313,16 @@ func (s stream[T]) Range(start, end int) stream[T] { return FromSlice(source) } +// Sorted returns a stream consisting of the elements of this stream, sorted according to the provided less function. +func (s stream[T]) Sorted(less func(a, b T) bool) stream[T] { + source := []T{} + source = append(source, s.source...) + + slice.SortBy(source, less) + + return FromSlice(source) +} + // ToSlice return the elements in the stream. func (s stream[T]) ToSlice() []T { return s.source diff --git a/stream/stream_test.go b/stream/stream_test.go index 9d60d84..0f62f7b 100644 --- a/stream/stream_test.go +++ b/stream/stream_test.go @@ -303,3 +303,14 @@ func TestStream_Concat(t *testing.T) { assert.Equal([]int{1, 2, 3, 4, 5, 6}, s.ToSlice()) } + +func TestStream_Sorted(t *testing.T) { + assert := internal.NewAssert(t, "TestStream_Sorted") + + s := FromSlice([]int{4, 2, 1, 3}) + + s1 := s.Sorted(func(a, b int) bool { return a < b }) + + assert.Equal([]int{4, 2, 1, 3}, s.ToSlice()) + assert.Equal([]int{1, 2, 3, 4}, s1.ToSlice()) +}