58 lines
769 B
Go
58 lines
769 B
Go
package set
|
|
|
|
import "iter"
|
|
|
|
type Set[T comparable] map[T]bool
|
|
|
|
func (s Set[T]) Add(items ...T) {
|
|
for _, item := range items {
|
|
s[item] = true
|
|
}
|
|
}
|
|
|
|
func (s Set[T]) Has(item T) bool {
|
|
return s[item]
|
|
}
|
|
|
|
func (s Set[T]) Remove(items ...T) {
|
|
for _, item := range items {
|
|
delete(s, item)
|
|
}
|
|
}
|
|
|
|
func (s Set[T]) Merge(o Set[T]) {
|
|
for item := range o {
|
|
s.Add(item)
|
|
}
|
|
}
|
|
|
|
func (s Set[T]) ToList() []T {
|
|
list := []T{}
|
|
|
|
for item := range s {
|
|
list = append(list, item)
|
|
}
|
|
|
|
return list
|
|
}
|
|
|
|
func (s Set[T]) Items() iter.Seq[T] {
|
|
return func(yield func(T) bool) {
|
|
for item := range s {
|
|
if !yield(item) {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func New[T comparable](items ...T) Set[T] {
|
|
result := Set[T]{}
|
|
|
|
for _, item := range items {
|
|
result.Add(item)
|
|
}
|
|
|
|
return result
|
|
}
|