gut/generics/set.go

47 lines
864 B
Go
Raw Normal View History

2024-02-05 23:04:14 +01:00
package generics
type Set[T comparable] map[T]struct{}
// New produces a new set containing the given values.
func NewSet[T comparable](vals ...T) Set[T] {
s := Set[T](make(map[T]struct{}))
for _, val := range vals {
s.Add(val)
}
return Set[T](s)
}
// Add adds values to the set.
func (s Set[T]) Add(vals ...T) {
for _, val := range vals {
s[val] = struct{}{}
}
}
// Check if a value is already present in the set.
func (s Set[T]) Has(val T) bool {
_, ok := s[val]
return ok
}
// Removes a value from the set.
func (s Set[T]) Remove(vals ...T) {
for _, val := range vals {
delete(s, val)
}
}
// Number of values in the set.
func (s Set[T]) Length() int {
return len(s)
}
// Get a slice of values in the set.
func (s Set[T]) Values() []T {
values := make([]T, 0, len(s))
for k := range s {
values = append(values, k)
}
return values
}