Browse Source

types/views: add Slice methods on Slice views

Updates #cleanup for change elsewhere.

Signed-off-by: Brad Fitzpatrick <[email protected]>
Brad Fitzpatrick 2 years ago
parent
commit
a2153afeeb
2 changed files with 27 additions and 0 deletions
  1. 18 0
      types/views/views.go
  2. 9 0
      types/views/views_test.go

+ 18 - 0
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.ж...)

+ 9 - 0
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)
 }