summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@tailscale.com>2024-04-30 16:36:41 -0700
committerBrad Fitzpatrick <brad@danga.com>2024-04-30 16:47:21 -0700
commit7455e027e9e1a4a95f48dc7f7e980146e8b00a2d (patch)
tree1de4c1361f79ba480f21e2a4e58ad01622081104
parentfe009c134e5b6a0fe91a002122ebfb821e772895 (diff)
downloadtailscale-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.go10
-rw-r--r--util/slicesx/slicesx_test.go15
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)
+ }
+}