113 lines
1.8 KiB
Go
113 lines
1.8 KiB
Go
package maps
|
|
|
|
// The type describing unique map
|
|
// where you can quickly get both
|
|
// value by key and vice versa.
|
|
type Uniq[K, V comparable] interface {
|
|
Map[K, V]
|
|
GetByValue(V) K
|
|
}
|
|
|
|
type uniqMap[K, V comparable] struct {
|
|
store map[K] V
|
|
rstore map[V] K
|
|
}
|
|
|
|
// The function returns map type where
|
|
// you can get, set and delete by value
|
|
// since it store everything as ONLY entity
|
|
// both for keys and values way.
|
|
// Use only when you do not care about the order.
|
|
func NewUniq[K, V comparable]() Uniq[K, V] {
|
|
return &uniqMap[K, V]{
|
|
map[K] V{},
|
|
map[V] K{},
|
|
}
|
|
}
|
|
|
|
func (m *uniqMap[K, V]) Empty() bool {
|
|
return len(m.store) == 0
|
|
}
|
|
|
|
func (m *uniqMap[K, V]) Clear() {
|
|
m.store = map[K] V{}
|
|
m.rstore = map[V] K{}
|
|
}
|
|
|
|
func (m *uniqMap[K, V]) Has(k K) bool {
|
|
_, ok := m.store[k]
|
|
return ok
|
|
}
|
|
|
|
func (m *uniqMap[K, V]) Set(k K, v V) {
|
|
m.store[k] = v
|
|
m.rstore[v] = k
|
|
}
|
|
|
|
func (m *uniqMap[K, V]) Del(k K) {
|
|
v := m.store[k]
|
|
delete(m.store, k)
|
|
delete(m.rstore, v)
|
|
}
|
|
|
|
func (m *uniqMap[K, V]) Get(k K) (V) {
|
|
v := m.store[k]
|
|
return v
|
|
}
|
|
|
|
func (m *uniqMap[K, V]) Got(k K) (V, bool) {
|
|
v, ok := m.store[k]
|
|
return v, ok
|
|
}
|
|
|
|
func (m *uniqMap[K, V]) Chan() chan V {
|
|
ret := make(chan V)
|
|
go func() {
|
|
for _, v := range m.store {
|
|
ret <- v
|
|
}
|
|
close(ret)
|
|
}()
|
|
return ret
|
|
}
|
|
|
|
func (m *uniqMap[K, V]) Keys() []K {
|
|
ret := make([]K, len(m.store))
|
|
i := 0
|
|
for k := range m.store {
|
|
ret[i] = k
|
|
i++
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func (m *uniqMap[K, V]) KeyChan() chan K {
|
|
ret := make(chan K)
|
|
go func() {
|
|
for k := range m.store {
|
|
ret <- k
|
|
}
|
|
close(ret)
|
|
}()
|
|
return ret
|
|
}
|
|
|
|
func (m *uniqMap[K, V]) Values() []V {
|
|
ret := make([]V, len(m.store))
|
|
i := 0
|
|
for _, v := range m.store {
|
|
ret[i] = v
|
|
i++
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func (m *uniqMap[K, V]) Size() int {
|
|
return len(m.store)
|
|
}
|
|
|
|
func (m *uniqMap[K, V]) GetByValue(v V) (K) {
|
|
k := m.rstore[v]
|
|
return k
|
|
}
|
|
|