1
2
3
4
5
6 package maps
7
8
9
10 func Keys[M ~map[K]V, K comparable, V any](m M) []K {
11 r := make([]K, 0, len(m))
12 for k := range m {
13 r = append(r, k)
14 }
15 return r
16 }
17
18
19
20 func Values[M ~map[K]V, K comparable, V any](m M) []V {
21 r := make([]V, 0, len(m))
22 for _, v := range m {
23 r = append(r, v)
24 }
25 return r
26 }
27
28
29
30 func Equal[M1, M2 ~map[K]V, K, V comparable](m1 M1, m2 M2) bool {
31 if len(m1) != len(m2) {
32 return false
33 }
34 for k, v1 := range m1 {
35 if v2, ok := m2[k]; !ok || v1 != v2 {
36 return false
37 }
38 }
39 return true
40 }
41
42
43
44 func EqualFunc[M1 ~map[K]V1, M2 ~map[K]V2, K comparable, V1, V2 any](m1 M1, m2 M2, eq func(V1, V2) bool) bool {
45 if len(m1) != len(m2) {
46 return false
47 }
48 for k, v1 := range m1 {
49 if v2, ok := m2[k]; !ok || !eq(v1, v2) {
50 return false
51 }
52 }
53 return true
54 }
55
56
57 func Clear[M ~map[K]V, K comparable, V any](m M) {
58 for k := range m {
59 delete(m, k)
60 }
61 }
62
63
64
65 func Clone[M ~map[K]V, K comparable, V any](m M) M {
66
67 if m == nil {
68 return nil
69 }
70 r := make(M, len(m))
71 for k, v := range m {
72 r[k] = v
73 }
74 return r
75 }
76
77
78
79
80
81 func Copy[M1 ~map[K]V, M2 ~map[K]V, K comparable, V any](dst M1, src M2) {
82 for k, v := range src {
83 dst[k] = v
84 }
85 }
86
87
88 func DeleteFunc[M ~map[K]V, K comparable, V any](m M, del func(K, V) bool) {
89 for k, v := range m {
90 if del(k, v) {
91 delete(m, k)
92 }
93 }
94 }
95
View as plain text