Просмотр исходного кода

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 <[email protected]>
Brad Fitzpatrick 1 год назад
Родитель
Сommit
7455e027e9
2 измененных файлов с 25 добавлено и 0 удалено
  1. 10 0
      util/slicesx/slicesx.go
  2. 15 0
      util/slicesx/slicesx_test.go

+ 10 - 0
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
+}

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