codekingpro/portable-devtools
114k
1// Copyright 2021 The Go Authors. All rights reserved.2// Use of this source code is governed by a BSD-style3// license that can be found in the LICENSE file.4 5package a6 7// SliceEqual reports whether two slices are equal: the same length and all8// elements equal. All floating point NaNs are considered equal.9func SliceEqual[Elem comparable](s1, s2 []Elem) bool {10 if len(s1) != len(s2) {11 return false12 }13 for i, v1 := range s1 {14 v2 := s2[i]15 if v1 != v2 {16 isNaN := func(f Elem) bool { return f != f }17 if !isNaN(v1) || !isNaN(v2) {18 return false19 }20 }21 }22 return true23}24 25// Keys returns the keys of the map m.26// The keys will be an indeterminate order.27func Keys[K comparable, V any](m map[K]V) []K {28 r := make([]K, 0, len(m))29 for k := range m {30 r = append(r, k)31 }32 return r33}34 35// Values returns the values of the map m.36// The values will be in an indeterminate order.37func Values[K comparable, V any](m map[K]V) []V {38 r := make([]V, 0, len(m))39 for _, v := range m {40 r = append(r, v)41 }42 return r43}44 45// Equal reports whether two maps contain the same key/value pairs.46// Values are compared using ==.47func Equal[K, V comparable](m1, m2 map[K]V) bool {48 if len(m1) != len(m2) {49 return false50 }51 for k, v1 := range m1 {52 if v2, ok := m2[k]; !ok || v1 != v2 {53 return false54 }55 }56 return true57}58 59// Copy returns a copy of m.60func Copy[K comparable, V any](m map[K]V) map[K]V {61 r := make(map[K]V, len(m))62 for k, v := range m {63 r[k] = v64 }65 return r66}67 68// Add adds all key/value pairs in m2 to m1. Keys in m2 that are already69// present in m1 will be overwritten with the value in m2.70func Add[K comparable, V any](m1, m2 map[K]V) {71 for k, v := range m2 {72 m1[k] = v73 }74}75 76// Sub removes all keys in m2 from m1. Keys in m2 that are not present77// in m1 are ignored. The values in m2 are ignored.78func Sub[K comparable, V any](m1, m2 map[K]V) {79 for k := range m2 {80 delete(m1, k)81 }82}83 84// Intersect removes all keys from m1 that are not present in m2.85// Keys in m2 that are not in m1 are ignored. The values in m2 are ignored.86func Intersect[K comparable, V any](m1, m2 map[K]V) {87 for k := range m1 {88 if _, ok := m2[k]; !ok {89 delete(m1, k)90 }91 }92}93 94// Filter deletes any key/value pairs from m for which f returns false.95func Filter[K comparable, V any](m map[K]V, f func(K, V) bool) {96 for k, v := range m {97 if !f(k, v) {98 delete(m, k)99 }100 }101}102 103// TransformValues applies f to each value in m. The keys remain unchanged.104func TransformValues[K comparable, V any](m map[K]V, f func(V) V) {105 for k, v := range m {106 m[k] = f(v)107 }108}109 