-
Notifications
You must be signed in to change notification settings - Fork 1
/
maps.go
43 lines (39 loc) · 1021 Bytes
/
maps.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package slice
// Keys returns a slice with all keys from a map.
func Keys[K comparable, V any](m map[K]V) []K {
keys := make([]K, 0, len(m))
for k := range m {
keys = append(keys, k)
}
return keys
}
// Values returns a slice with all keys from a map.
func Values[K comparable, V any](m map[K]V) []V {
vals := make([]V, 0, len(m))
for _, v := range m {
vals = append(vals, v)
}
return vals
}
// FromMap builds a slice []T from a map[K]V.
// To build a map from a slice use ToMap.
// Please bear in mind that go maps are unordered and the resulting slice will reflect that.
func FromMap[K comparable, V, T any](m map[K]V, f func(K, V) T) []T {
slice := make([]T, len(m))
i := 0
for k, v := range m {
slice[i] = f(k, v)
i++
}
return slice
}
// ToMap builds a map[K]V from a slice.
// To build a slice from a map use FromMap.
func ToMap[K comparable, V, T any](slice []T, f func(T) (K, V)) map[K]V {
m := make(map[K]V, len(slice))
for _, t := range slice {
k, v := f(t)
m[k] = v
}
return m
}