| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- // Copyright 2021 The Go Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- // Package maps defines various functions useful with maps of any type.
- package maps
- import "maps"
- // TODO(adonovan): when https://go.dev/issue/32816 is accepted, all of
- // these functions except Keys and Values should be annotated
- // (provisionally with "//go:fix inline") so that tools can safely and
- // automatically replace calls to exp/maps with calls to std maps by
- // inlining them.
- // Keys returns the keys of the map m.
- // The keys will be in an indeterminate order.
- func Keys[M ~map[K]V, K comparable, V any](m M) []K {
- // The simplest true equivalent using std is:
- // return slices.AppendSeq(make([]K, 0, len(m)), maps.Keys(m)).
- r := make([]K, 0, len(m))
- for k := range m {
- r = append(r, k)
- }
- return r
- }
- // Values returns the values of the map m.
- // The values will be in an indeterminate order.
- func Values[M ~map[K]V, K comparable, V any](m M) []V {
- // The simplest true equivalent using std is:
- // return slices.AppendSeq(make([]V, 0, len(m)), maps.Values(m)).
- r := make([]V, 0, len(m))
- for _, v := range m {
- r = append(r, v)
- }
- return r
- }
- // Equal reports whether two maps contain the same key/value pairs.
- // Values are compared using ==.
- func Equal[M1, M2 ~map[K]V, K, V comparable](m1 M1, m2 M2) bool {
- return maps.Equal(m1, m2)
- }
- // EqualFunc is like Equal, but compares values using eq.
- // Keys are still compared with ==.
- 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 {
- return maps.EqualFunc(m1, m2, eq)
- }
- // Clear removes all entries from m, leaving it empty.
- func Clear[M ~map[K]V, K comparable, V any](m M) {
- clear(m)
- }
- // Clone returns a copy of m. This is a shallow clone:
- // the new keys and values are set using ordinary assignment.
- func Clone[M ~map[K]V, K comparable, V any](m M) M {
- return maps.Clone(m)
- }
- // Copy copies all key/value pairs in src adding them to dst.
- // When a key in src is already present in dst,
- // the value in dst will be overwritten by the value associated
- // with the key in src.
- func Copy[M1 ~map[K]V, M2 ~map[K]V, K comparable, V any](dst M1, src M2) {
- maps.Copy(dst, src)
- }
- // DeleteFunc deletes any key/value pairs from m for which del returns true.
- func DeleteFunc[M ~map[K]V, K comparable, V any](m M, del func(K, V) bool) {
- maps.DeleteFunc(m, del)
- }
|