1
0
mirror of https://github.com/charlienet/go-mixed.git synced 2025-07-18 16:42:41 +08:00
Files
go-mixed/collections/generics/hashset.go
2022-03-27 10:23:14 +08:00

70 lines
1.2 KiB
Go

package generics
type Set[T comparable] map[T]struct{}
func NewHashSet[T comparable](values ...T) Set[T] {
set := make(Set[T], len(values))
set.Add(values...)
return set
}
func (s Set[T]) Add(values ...T) {
for _, v := range values {
s[v] = struct{}{}
}
}
func (s Set[T]) Contain(value T) bool {
_, ok := s[value]
return ok
}
func (s Set[T]) Clone() Set[T] {
set := NewHashSet[T]()
set.Add(s.Values()...)
return set
}
func (s Set[T]) Iterate(fn func(value T)) {
for v := range s {
fn(v)
}
}
// Union creates a new set contain all element of set s and other
func (s Set[T]) Union(other Set[T]) Set[T] {
set := s.Clone()
set.Add(other.Values()...)
return set
}
// Intersection creates a new set whose element both be contained in set s and other
func (s Set[T]) Intersection(other Set[T]) Set[T] {
set := NewHashSet[T]()
s.Iterate(func(value T) {
if other.Contain(value) {
set.Add(value)
}
})
return set
}
func (s Set[T]) Values() []T {
values := make([]T, 0, s.Size())
s.Iterate(func(value T) {
values = append(values, value)
})
return values
}
func (s Set[T]) IsEmpty() bool {
return len(s) == 0
}
func (s Set[T]) Size() int {
return len(s)
}