mirror of
https://github.com/tailscale/tailscale.git
synced 2025-02-16 18:08:40 +00:00
util/set: add SetOfFunc
Fixes #12901 Signed-off-by: Marwan Sulaiman <marwan@tailscale.com>
This commit is contained in:
parent
57856fc0d5
commit
2d15835bb3
@ -17,6 +17,21 @@ func SetOf[T comparable](slice []T) Set[T] {
|
|||||||
return Of(slice...)
|
return Of(slice...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetOfFunc returns a set based on the given slice and func. It is helpful
|
||||||
|
// when you want to turn a slice of a non-comparable type to a comparable aspect of it.
|
||||||
|
// For example, to turn a slice of "users" to a set by their user ID field you can do something like:
|
||||||
|
/*
|
||||||
|
users := []*User{...}
|
||||||
|
userIDs := SetOfFunc(users, func(u *User) string { return u.ID }) // returns set.Set[string]
|
||||||
|
*/
|
||||||
|
func SetOfFunc[T any, K comparable](slice []T, f func(T) K) Set[K] {
|
||||||
|
s := make(Set[K])
|
||||||
|
for _, e := range slice {
|
||||||
|
s.Add(f(e))
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
// Of returns a new set constructed from the elements in slice.
|
// Of returns a new set constructed from the elements in slice.
|
||||||
func Of[T comparable](slice ...T) Set[T] {
|
func Of[T comparable](slice ...T) Set[T] {
|
||||||
s := make(Set[T])
|
s := make(Set[T])
|
||||||
|
@ -64,6 +64,22 @@ func TestSetOf(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSetOfFunc(t *testing.T) {
|
||||||
|
type T struct {
|
||||||
|
ID string
|
||||||
|
}
|
||||||
|
ts := []*T{{"one"}, {"two"}, {"three"}, {"four"}}
|
||||||
|
s := SetOfFunc(ts, func(t *T) string { return t.ID })
|
||||||
|
if s.Len() != 4 {
|
||||||
|
t.Errorf("wrong len %d; want 4", s.Len())
|
||||||
|
}
|
||||||
|
for _, e := range []string{"one", "two", "three", "four"} {
|
||||||
|
if !s.Contains(e) {
|
||||||
|
t.Errorf("should contain %s", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestEqual(t *testing.T) {
|
func TestEqual(t *testing.T) {
|
||||||
type test struct {
|
type test struct {
|
||||||
name string
|
name string
|
||||||
|
Loading…
x
Reference in New Issue
Block a user