2024-01-04 17:55:26 +00:00
|
|
|
// Package set provides a simple set implementation.
|
2022-09-27 23:52:13 +00:00
|
|
|
package set
|
|
|
|
|
|
|
|
type key interface {
|
|
|
|
comparable
|
|
|
|
}
|
|
|
|
|
|
|
|
type Set[T key] struct {
|
|
|
|
mp map[T]struct{}
|
|
|
|
}
|
|
|
|
|
2022-12-03 19:55:00 +00:00
|
|
|
func Make[T key](size int) Set[T] {
|
|
|
|
return Set[T]{
|
|
|
|
mp: make(map[T]struct{}, size),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-27 23:52:13 +00:00
|
|
|
func New[T key](v ...T) Set[T] {
|
|
|
|
mp := make(map[T]struct{}, len(v))
|
|
|
|
|
|
|
|
s := Set[T]{mp}
|
|
|
|
|
|
|
|
s.Insert(v...)
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s Set[T]) Insert(v ...T) {
|
|
|
|
for _, e := range v {
|
|
|
|
s.mp[e] = struct{}{}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s Set[T]) Remove(v ...T) {
|
|
|
|
for _, e := range v {
|
|
|
|
delete(s.mp, e)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s Set[T]) Contains(v T) bool {
|
|
|
|
_, ok := s.mp[v]
|
|
|
|
return ok
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s Set[T]) ContainsAll(v ...T) bool {
|
|
|
|
for _, e := range v {
|
|
|
|
if !s.Contains(e) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s Set[T]) Slice() []T {
|
|
|
|
slice := make([]T, 0, len(s.mp))
|
|
|
|
for k := range s.mp {
|
|
|
|
slice = append(slice, k)
|
|
|
|
}
|
|
|
|
return slice
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s Set[T]) Len() int {
|
|
|
|
return len(s.mp)
|
|
|
|
}
|