62 lines
902 B
Go
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)
|
||
|
}
|
||
|
}
|