diff options
| author | Brad Fitzpatrick <bradfitz@tailscale.com> | 2024-04-30 16:36:41 -0700 |
|---|---|---|
| committer | Brad Fitzpatrick <brad@danga.com> | 2024-04-30 16:47:21 -0700 |
| commit | 7455e027e9e1a4a95f48dc7f7e980146e8b00a2d (patch) | |
| tree | 1de4c1361f79ba480f21e2a4e58ad01622081104 | |
| parent | fe009c134e5b6a0fe91a002122ebfb821e772895 (diff) | |
| download | tailscale-7455e027e9e1a4a95f48dc7f7e980146e8b00a2d.tar.xz tailscale-7455e027e9e1a4a95f48dc7f7e980146e8b00a2d.zip | |
util/slicesx: add AppendMatching
We had this in a different repo, but moving it here, as this a more
fitting package.
Updates #cleanup
Change-Id: I5fb9b10e465932aeef5841c67deba4d77d473d57
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
| -rw-r--r-- | util/slicesx/slicesx.go | 10 | ||||
| -rw-r--r-- | util/slicesx/slicesx_test.go | 15 |
2 files changed, 25 insertions, 0 deletions
diff --git a/util/slicesx/slicesx.go b/util/slicesx/slicesx.go index d72722ce0..6896c1f3c 100644 --- a/util/slicesx/slicesx.go +++ b/util/slicesx/slicesx.go @@ -91,3 +91,13 @@ func Filter[S ~[]T, T any](dst, src S, fn func(T) bool) S { } return dst } + +// AppendMatching appends elements in ps to dst if f(x) is true. +func AppendMatching[T any](dst, ps []T, f func(T) bool) []T { + for _, p := range ps { + if f(p) { + dst = append(dst, p) + } + } + return dst +} diff --git a/util/slicesx/slicesx_test.go b/util/slicesx/slicesx_test.go index 46bd666c3..854fe824d 100644 --- a/util/slicesx/slicesx_test.go +++ b/util/slicesx/slicesx_test.go @@ -136,3 +136,18 @@ func TestFilterNoAllocations(t *testing.T) { t.Fatalf("got %.4f allocs, want 1", allocs) } } + +func TestAppendMatching(t *testing.T) { + v := []string{"one", "two", "three", "four"} + got := AppendMatching(v[:0], v, func(s string) bool { return len(s) > 3 }) + + want := []string{"three", "four"} + if !reflect.DeepEqual(got, want) { + t.Errorf("got %v; want %v", got, want) + } + + wantOrigMem := []string{"three", "four", "three", "four"} + if !reflect.DeepEqual(v, wantOrigMem) { + t.Errorf("got %v; want %v", v, wantOrigMem) + } +} |
