diff --git a/util/set/set.go b/util/set/set.go index e631904a9..6adb5182f 100644 --- a/util/set/set.go +++ b/util/set/set.go @@ -4,6 +4,21 @@ // Package set contains set types. package set +// Set is a set of T. +type Set[T comparable] map[T]struct{} + +// Add adds e to the set. +func (s Set[T]) Add(e T) { s[e] = struct{}{} } + +// Contains reports whether s contains e. +func (s Set[T]) Contains(e T) bool { + _, ok := s[e] + return ok +} + +// Len reports the number of items in s. +func (s Set[T]) Len() int { return len(s) } + // HandleSet is a set of T. // // It is not safe for concurrent use. diff --git a/util/set/set_test.go b/util/set/set_test.go new file mode 100644 index 000000000..7a920ed88 --- /dev/null +++ b/util/set/set_test.go @@ -0,0 +1,24 @@ +// Copyright (c) Tailscale Inc & AUTHORS +// SPDX-License-Identifier: BSD-3-Clause + +package set + +import "testing" + +func TestSet(t *testing.T) { + s := Set[int]{} + s.Add(1) + s.Add(2) + if !s.Contains(1) { + t.Error("missing 1") + } + if !s.Contains(2) { + t.Error("missing 2") + } + if s.Contains(3) { + t.Error("shouldn't have 3") + } + if s.Len() != 2 { + t.Errorf("wrong len %d; want 2", s.Len()) + } +}