101 lines
1.8 KiB
Go
101 lines
1.8 KiB
Go
package extypes
|
|
|
|
import "reflect"
|
|
|
|
type HashMap[K comparable, V any] map[K]V
|
|
|
|
func NewMapFrom[K comparable, V any](m map[K]V) HashMap[K, V] {
|
|
out := make(HashMap[K, V])
|
|
for k, v := range m {
|
|
out[k] = v
|
|
}
|
|
return out
|
|
}
|
|
func (m HashMap[K, V]) Len() int { return len(m) }
|
|
func (m HashMap[K, V]) Add(key K, val V) HashMap[K, V] {
|
|
m[key] = val
|
|
return m
|
|
}
|
|
func (m HashMap[K, V]) Remove(key K) HashMap[K, V] {
|
|
delete(m, key)
|
|
return m
|
|
}
|
|
func (m HashMap[K, V]) Get(key K) V { return m[key] }
|
|
func (m HashMap[K, V]) GetOrDefault(key K, def V) V {
|
|
v, ok := m[key]
|
|
if !ok {
|
|
return def
|
|
}
|
|
return v
|
|
}
|
|
func (m HashMap[K, V]) Contains(key K) bool {
|
|
_, ok := m[key]
|
|
return ok
|
|
}
|
|
func (m HashMap[K, V]) IndexKey(key K) int {
|
|
index := 0
|
|
for k, _ := range m {
|
|
if k == key {
|
|
return index
|
|
}
|
|
index++
|
|
}
|
|
return -1
|
|
}
|
|
func (m HashMap[K, V]) IndexValue(value V) int {
|
|
index := 0
|
|
for _, v := range m {
|
|
if reflect.DeepEqual(value, v) {
|
|
return index
|
|
}
|
|
index++
|
|
}
|
|
return -1
|
|
}
|
|
func (m HashMap[K, V]) Keys() []K {
|
|
keys := make([]K, 0, m.Len())
|
|
for k := range m {
|
|
keys = append(keys, k)
|
|
}
|
|
return keys
|
|
}
|
|
func (m HashMap[K, V]) Values() []V {
|
|
values := make([]V, 0, m.Len())
|
|
for _, v := range m {
|
|
values = append(values, v)
|
|
}
|
|
return values
|
|
}
|
|
func (m HashMap[K, V]) Items() ([]K, []V) {
|
|
keys := make(Slice[K], 0, m.Len())
|
|
values := make(Slice[V], 0, m.Len())
|
|
for k, v := range m {
|
|
keys = keys.Push(k)
|
|
values = values.Push(v)
|
|
}
|
|
return keys, values
|
|
}
|
|
|
|
func (m HashMap[K, V]) Filter(f func(K, V) bool) HashMap[K, V] {
|
|
out := make(HashMap[K, V])
|
|
for k, v := range m {
|
|
if !f(k, v) {
|
|
continue
|
|
}
|
|
out[k] = v
|
|
}
|
|
return out
|
|
}
|
|
func (m HashMap[K, V]) ForEach(f func(K, V)) HashMap[K, V] {
|
|
for k, v := range m {
|
|
f(k, v)
|
|
}
|
|
return m
|
|
}
|
|
func (m HashMap[K, V]) Map(f func(K, V) V) HashMap[K, V] {
|
|
for k, v := range m {
|
|
m[k] = f(k, v)
|
|
}
|
|
return m
|
|
}
|