From a2153afeebc202e2e40f8416cbd6e506bc8c9fd3 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Tue, 20 Jun 2023 20:12:25 -0700 Subject: [PATCH] types/views: add Slice methods on Slice views Updates #cleanup for change elsewhere. Signed-off-by: Brad Fitzpatrick --- types/views/views.go | 18 ++++++++++++++++++ types/views/views_test.go | 9 +++++++++ 2 files changed, 27 insertions(+) diff --git a/types/views/views.go b/types/views/views.go index e155fc868..edcd85189 100644 --- a/types/views/views.go +++ b/types/views/views.go @@ -75,6 +75,15 @@ func (v SliceView[T, V]) Len() int { return len(v.ж) } // At returns a View of the element at index `i` of the slice. func (v SliceView[T, V]) At(i int) V { return v.ж[i].View() } +// SliceFrom returns v[i:]. +func (v SliceView[T, V]) SliceFrom(i int) SliceView[T, V] { return SliceView[T, V]{v.ж[i:]} } + +// SliceTo returns v[:i] +func (v SliceView[T, V]) SliceTo(i int) SliceView[T, V] { return SliceView[T, V]{v.ж[:i]} } + +// Slice returns v[i:j] +func (v SliceView[T, V]) Slice(i, j int) SliceView[T, V] { return SliceView[T, V]{v.ж[i:j]} } + // AppendTo appends the underlying slice values to dst. func (v SliceView[T, V]) AppendTo(dst []V) []V { for _, x := range v.ж { @@ -122,6 +131,15 @@ func (v Slice[T]) Len() int { return len(v.ж) } // At returns the element at index `i` of the slice. func (v Slice[T]) At(i int) T { return v.ж[i] } +// SliceFrom returns v[i:]. +func (v Slice[T]) SliceFrom(i int) Slice[T] { return Slice[T]{v.ж[i:]} } + +// SliceTo returns v[:i] +func (v Slice[T]) SliceTo(i int) Slice[T] { return Slice[T]{v.ж[:i]} } + +// Slice returns v[i:j] +func (v Slice[T]) Slice(i, j int) Slice[T] { return Slice[T]{v.ж[i:j]} } + // AppendTo appends the underlying slice values to dst. func (v Slice[T]) AppendTo(dst []T) []T { return append(dst, v.ж...) diff --git a/types/views/views_test.go b/types/views/views_test.go index 129cabd17..536372bcd 100644 --- a/types/views/views_test.go +++ b/types/views/views_test.go @@ -128,4 +128,13 @@ func TestViewUtils(t *testing.T) { c.Check(SliceEqualAnyOrder(v, SliceOf([]string{"bar", "foo"})), qt.Equals, true) c.Check(SliceEqualAnyOrder(v, SliceOf([]string{"foo"})), qt.Equals, false) c.Check(SliceEqualAnyOrder(SliceOf([]string{"a", "a", "b"}), SliceOf([]string{"a", "b", "b"})), qt.Equals, false) + + c.Check(SliceEqualAnyOrder( + SliceOf([]string{"a", "b", "c"}).SliceFrom(1), + SliceOf([]string{"b", "c"})), + qt.Equals, true) + c.Check(SliceEqualAnyOrder( + SliceOf([]string{"a", "b", "c"}).Slice(1, 2), + SliceOf([]string{"b", "c"}).SliceTo(1)), + qt.Equals, true) }