From 5f4c9bfdd668c2076103336e2547436c7228ff75 Mon Sep 17 00:00:00 2001 From: Arseniy Zhizhelev Date: Wed, 8 Feb 2023 00:05:49 +0300 Subject: [PATCH] feat: add slice.Remove --- README.md | 1 + slice/slice.go | 6 ++++++ slice/slice_test.go | 7 +++++++ 3 files changed, 14 insertions(+) diff --git a/README.md b/README.md index 27fb37b..886e399 100644 --- a/README.md +++ b/README.md @@ -468,6 +468,7 @@ Some utilities that are convenient when working with slices. - `slice.Reduce[A any](as []A, f func(A, A) A) A` - Reduce aggregates all elements pairwise. Only works for non empty slices. - `slice.Filter[A any](as []A, p func(a A) bool) (res []A)` - `slice.FilterNot[A any](as []A, p func(a A) bool) (res []A)` - same as `Filter`, but inverses the predicate `p`. +- `slice.Remove[A comparable](as []A, r []A) (res []A)` - Remove removes any elements in r from as. - `slice.Partition[A any](as []A, p fun.Predicate[A]) (resT []A, resF []A)` - Partition separates elements in as according to the predicate. - `slice.Exists[A any](p fun.Predicate[A]) fun.Predicate[[]A]` - Exists returns a predicate on slices. The predicate is true if there is an element that satisfy the given element-wise predicate. It's false for an empty slice. - `slice.Forall[A any](p fun.Predicate[A]) fun.Predicate[[]A]` - Forall returns a predicate on slices. The predicate is true if all elements satisfy the given element-wise predicate. It's true for an empty slice. diff --git a/slice/slice.go b/slice/slice.go index 078b97d..a490f63 100644 --- a/slice/slice.go +++ b/slice/slice.go @@ -280,3 +280,9 @@ func Reverse[A any](as []A) (res []A) { } return } + +// Remove removes any elements in r from as. +func Remove[A comparable](as []A, r []A) (res []A) { + sr := ToSet(r) + return FilterNot(as, set.Contains(sr)) +} diff --git a/slice/slice_test.go b/slice/slice_test.go index 94af042..02d881f 100644 --- a/slice/slice_test.go +++ b/slice/slice_test.go @@ -119,3 +119,10 @@ func TestReverse(t *testing.T) { znats2 := slice.Range(0, 2) assert.ElementsMatch(t, []int{1, 0}, slice.Reverse(znats2)) } + +func TestRemove(t *testing.T) { + znats10 := slice.Range(0, 10) + znats5 := slice.Range(0, 5) + znats510 := slice.Range(5, 10) + assert.ElementsMatch(t, znats510, slice.Remove(znats10, znats5)) +}