golang/maps.go

57 lines
1014 B
Go

// maps.go
package golang
import (
"cmp"
"slices"
)
func MapKeys[K cmp.Ordered, V any](m map[K]V, sort bool) (keys []K) {
keys = make([]K, len(m))
i := 0
for key := range m {
keys[i] = key
i++
}
if sort {
slices.Sort(keys)
}
return keys
}
func IterateSortedMap[K cmp.Ordered, V any](m map[K]V, op func(key K, value V) error) (err error) {
keys := MapKeys(m, true)
for _, key := range keys {
if err = op(key, m[key]); err != nil {
break
}
}
return
}
func IterateMap[K cmp.Ordered, V any](m map[K]V, op func(key K, value V) error) (err error) {
for key, value := range m {
if err = op(key, value); err != nil {
break
}
}
return
}
func MapListGet[K cmp.Ordered, V any](key K, maps ...map[K]V) (value V, mapIndex int) {
return MapListGetV(key, maps)
}
func MapListGetV[K cmp.Ordered, V any](key K, maps []map[K]V) (value V, mapIndex int) {
var ok bool
mapIndex = -1
for index, m := range maps {
if value, ok = m[key]; ok {
mapIndex = index
break
}
}
return
}