53 lines
794 B
Go
53 lines
794 B
Go
package iterator
|
|
|
|
import (
|
|
"iter"
|
|
)
|
|
|
|
type Set[T comparable] struct {
|
|
ordered []T // 用于保持顺序
|
|
m map[T]struct{}
|
|
}
|
|
|
|
func NewSet[T comparable]() *Set[T] {
|
|
return &Set[T]{make([]T, 0), make(map[T]struct{})}
|
|
}
|
|
|
|
func (s *Set[T]) Add(e T) {
|
|
if !s.Contains(e) {
|
|
s.ordered = append(s.ordered, e)
|
|
}
|
|
s.m[e] = struct{}{}
|
|
}
|
|
|
|
func (s *Set[T]) Remove(e T) {
|
|
for k, v := range s.ordered {
|
|
if v == e {
|
|
s.ordered = append(s.ordered[:k], s.ordered[k+1:]...)
|
|
break
|
|
}
|
|
}
|
|
|
|
delete(s.m, e)
|
|
}
|
|
|
|
func (s *Set[T]) Contains(e T) bool {
|
|
_, ok := s.m[e]
|
|
return ok
|
|
}
|
|
|
|
func (s *Set[T]) Len() int {
|
|
return len(s.m)
|
|
}
|
|
|
|
func (s *Set[T]) All() iter.Seq[T] {
|
|
return func(yield func(T) bool) {
|
|
// 迭代有序切片
|
|
for _, v := range s.ordered {
|
|
if !yield(v) {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|