diff --git a/stream/stream.go b/stream/stream.go index b70c85e..2ee77b4 100644 --- a/stream/stream.go +++ b/stream/stream.go @@ -43,7 +43,7 @@ import ( // // part of methods custom extension // Reverse() StreamI[T] -// Range(start, end int64) StreamI[T] +// Range(start, end int) StreamI[T] // Concat(streams ...StreamI[T]) StreamI[T] // } @@ -255,6 +255,28 @@ func (s stream[T]) Count() int { return len(s.source) } +// FindFirst returns the first element of this stream and true, or zero value and false if the stream is empty. +func (s stream[T]) FindFirst() (T, bool) { + var result T + + if s.source == nil || len(s.source) == 0 { + return result, false + } + + return s.source[0], true +} + +// Reverse returns a stream whose elements are reverse order of given stream. +func (s stream[T]) Reverse() stream[T] { + l := len(s.source) + source := make([]T, l) + + for i := 0; i < l; i++ { + source[i] = s.source[l-1-i] + } + 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 45f68b1..7226e2b 100644 --- a/stream/stream_test.go +++ b/stream/stream_test.go @@ -247,3 +247,24 @@ func TestStream_Reduce(t *testing.T) { assert.Equal(6, result) } + +func TestStream_FindFirst(t *testing.T) { + assert := internal.NewAssert(t, "TestStream_FindFirst") + + stream := FromSlice([]int{1, 2, 3}) + + result, ok := stream.FindFirst() + + assert.Equal(1, result) + assert.Equal(true, ok) +} + +func TestStream_Reverse(t *testing.T) { + assert := internal.NewAssert(t, "TestStream_Reverse") + + s := FromSlice([]int{1, 2, 3}) + + rs := s.Reverse() + + assert.Equal([]int{3, 2, 1}, rs.ToSlice()) +}