57 lines
1014 B
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
|
|
}
|
|
|