From 422022c74d51522980c2084d726f35e563a1d9b4 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Tue, 7 Feb 2023 10:36:07 +0800 Subject: [PATCH] feat: add Range for stream --- stream/stream.go | 25 +++++++++++++++++++++++++ stream/stream_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/stream/stream.go b/stream/stream.go index 2ee77b4..9f78627 100644 --- a/stream/stream.go +++ b/stream/stream.go @@ -277,6 +277,31 @@ func (s stream[T]) Reverse() stream[T] { return FromSlice(source) } +// Range returns a stream whose elements are in the range from start(included) to end(excluded) original stream. +func (s stream[T]) Range(start, end int) stream[T] { + if start < 0 { + start = 0 + } + if end < 0 { + end = 0 + } + if start >= end { + return FromSlice([]T{}) + } + + source := make([]T, 0) + + if end > len(s.source) { + end = len(s.source) + } + + for i := start; i < end; i++ { + source = append(source, s.source[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 7226e2b..ac84ea7 100644 --- a/stream/stream_test.go +++ b/stream/stream_test.go @@ -268,3 +268,27 @@ func TestStream_Reverse(t *testing.T) { assert.Equal([]int{3, 2, 1}, rs.ToSlice()) } + +func TestStream_Range(t *testing.T) { + assert := internal.NewAssert(t, "TestStream_Range") + + s := FromSlice([]int{1, 2, 3}) + + s1 := s.Range(-1, 0) + assert.Equal([]int{}, s1.ToSlice()) + + s2 := s.Range(0, -1) + assert.Equal([]int{}, s2.ToSlice()) + + s3 := s.Range(0, 0) + assert.Equal([]int{}, s3.ToSlice()) + + s4 := s.Range(1, 1) + assert.Equal([]int{}, s4.ToSlice()) + + s5 := s.Range(0, 1) + assert.Equal([]int{1}, s5.ToSlice()) + + s6 := s.Range(0, 4) + assert.Equal([]int{1, 2, 3}, s6.ToSlice()) +}