This commit is contained in:
59
set.go
Normal file
59
set.go
Normal file
@@ -0,0 +1,59 @@
|
||||
package aoc
|
||||
|
||||
import "golang.org/x/exp/maps"
|
||||
|
||||
type set[T comparable] map[T]struct{}
|
||||
|
||||
func Set[T comparable](arr ...T) set[T] {
|
||||
m := make(set[T], len(arr))
|
||||
for _, a := range arr {
|
||||
m[a] = struct{}{}
|
||||
}
|
||||
return m
|
||||
}
|
||||
func (m *set[T]) Add(a T) {
|
||||
(*m)[a] = struct{}{}
|
||||
}
|
||||
func (m *set[T]) Items() []T {
|
||||
return maps.Keys(*m)
|
||||
}
|
||||
func (m *set[T]) Has(a T) bool {
|
||||
var ok bool
|
||||
_, ok = (*m)[a]
|
||||
return ok
|
||||
}
|
||||
|
||||
type defaultMap[K comparable, V any] struct {
|
||||
m map[K]V
|
||||
d V
|
||||
}
|
||||
|
||||
func DefaultMap[K comparable, V any](d V) *defaultMap[K, V] {
|
||||
return &defaultMap[K, V]{
|
||||
make(map[K]V),
|
||||
d,
|
||||
}
|
||||
}
|
||||
|
||||
func (m *defaultMap[K, V]) Set(k K, v V) {
|
||||
m.m[k] = v
|
||||
}
|
||||
func (m *defaultMap[K, V]) Get(k K) (V, bool) {
|
||||
if v, ok := m.m[k]; ok {
|
||||
return v, true
|
||||
}
|
||||
return m.d, false
|
||||
}
|
||||
|
||||
type pair[K, V any] struct {
|
||||
K K
|
||||
V V
|
||||
}
|
||||
|
||||
func (m *defaultMap[K, V]) Items() []pair[K, V] {
|
||||
var items = make([]pair[K, V], 0, len(m.m))
|
||||
for k, v := range m.m {
|
||||
items = append(items, pair[K, V]{k, v})
|
||||
}
|
||||
return items
|
||||
}
|
||||
Reference in New Issue
Block a user