util/slicesx: add AppendNonzero

By request of @agottardo.

Updates #cleanup

Change-Id: I2f02314eb9533b1581e47b66b45b6fb8ac257bb7
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick 2025-01-22 10:05:43 -08:00 committed by Brad Fitzpatrick
parent 17022ad0e9
commit 8b65598614
4 changed files with 26 additions and 4 deletions

View File

@ -242,7 +242,7 @@ change in the future.
}
func nonNilCmds(cmds ...*ffcli.Command) []*ffcli.Command {
return slicesx.Filter(cmds[:0], cmds, func(c *ffcli.Command) bool { return c != nil })
return slicesx.AppendNonzero(cmds[:0], cmds)
}
func fatalf(format string, a ...any) {

View File

@ -95,6 +95,17 @@ func Filter[S ~[]T, T any](dst, src S, fn func(T) bool) S {
return dst
}
// AppendNonzero appends all non-zero elements of src to dst.
func AppendNonzero[S ~[]T, T comparable](dst, src S) S {
var zero T
for _, v := range src {
if v != zero {
dst = append(dst, v)
}
}
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 {

View File

@ -137,6 +137,19 @@ func TestFilterNoAllocations(t *testing.T) {
}
}
func TestAppendNonzero(t *testing.T) {
v := []string{"one", "two", "", "four"}
got := AppendNonzero(nil, v)
want := []string{"one", "two", "four"}
if !reflect.DeepEqual(got, want) {
t.Errorf("got %v; want %v", got, want)
}
got = AppendNonzero(v[:0], v)
if !reflect.DeepEqual(got, want) {
t.Errorf("got %v; want %v", got, want)
}
}
func TestAppendMatching(t *testing.T) {
v := []string{"one", "two", "three", "four"}
got := AppendMatching(v[:0], v, func(s string) bool { return len(s) > 3 })

View File

@ -289,7 +289,7 @@ func newSettingMetric(key setting.Key, scope setting.Scope, suffix string, typ c
}
func newMetric(nameParts []string, typ clientmetric.Type) metric {
name := strings.Join(slicesx.Filter([]string{internal.OS(), "syspolicy"}, nameParts, isNonEmpty), "_")
name := strings.Join(slicesx.AppendNonzero([]string{internal.OS(), "syspolicy"}, nameParts), "_")
switch {
case !ShouldReport():
return &funcMetric{name: name, typ: typ}
@ -304,8 +304,6 @@ func newMetric(nameParts []string, typ clientmetric.Type) metric {
}
}
func isNonEmpty(s string) bool { return s != "" }
func metricScopeName(scope setting.Scope) string {
switch scope {
case setting.DeviceSetting: