ds/impl_set.go
2023-01-20 21:48:46 +01:00

62 lines
902 B
Go

package ds
type Set[T comparable] struct {
values map[T]struct{}
}
var _ Coll[int] = &Set[int]{}
func NewSet[T comparable]() *Set[T] {
return &Set[T]{}
}
func (s *Set[T]) init() {
if s.values == nil {
s.values = map[T]struct{}{}
}
}
func (s *Set[T]) Add(value T) {
s.init()
s.values[value] = struct{}{}
}
func (s *Set[T]) AddAll(values Iterable[T]) {
s.init()
values.Each(s.Add)
}
func (s *Set[T]) Remove(value T) {
s.init()
delete(s.values, value)
}
func (s *Set[T]) RemoveAll(values Iterable[T]) {
values.Each(s.Remove)
}
func (s *Set[T]) Clear() {
s.values = map[T]struct{}{}
}
func (s *Set[T]) Has(value T) bool {
s.init()
_, ok := s.values[value]
return ok
}
func (s *Set[T]) Size() int {
s.init()
return len(s.values)
}
func (s *Set[T]) Empty() bool {
return s.Size() == 0
}
func (s *Set[T]) Each(f func(value T)) {
for value := range s.values {
f(value)
}
}