v2/tools/generator/internal/readonly/readonly_map.go (77 lines of code) (raw):

/* * Copyright (c) Microsoft Corporation. * Licensed under the MIT license. */ package readonly import "golang.org/x/exp/maps" type Map[K comparable, V any] struct { inner map[K]V } func EmptyMap[K comparable, V any]() Map[K, V] { return Map[K, V]{ inner: make(map[K]V), } } func CreateMap[K comparable, V any](inner map[K]V) Map[K, V] { return Map[K, V]{ inner: maps.Clone(inner), } } func CreateMapUnsafe[K comparable, V any](inner map[K]V) Map[K, V] { return Map[K, V]{ inner: inner, } } func (m Map[K, V]) ForEach(f func(k K, v V)) { for k, v := range m.inner { f(k, v) } } func (m Map[K, V]) Len() int { return len(m.inner) } func (m Map[K, V]) Get(key K) (V, bool) { result, ok := m.inner[key] return result, ok } func (m Map[K, V]) Clone() map[K]V { return maps.Clone(m.inner) } // maps.Clone doesn’t work correctly, see: https://github.com/golang/go/issues/53087 func Clone[K comparable, V any](m map[K]V) map[K]V { r := make(map[K]V, len(m)) for k, v := range m { r[k] = v } return r } func (m Map[K, V]) With(key K, value V) Map[K, V] { result := Clone(m.inner) result[key] = value return CreateMapUnsafe(result) } func (m Map[K, V]) Without(key K) Map[K, V] { result := Clone(m.inner) delete(result, key) return CreateMapUnsafe(result) } func (m Map[K, V]) ContainsKey(key K) bool { _, ok := m.inner[key] return ok } func (m Map[K, V]) Keys() []K { return maps.Keys(m.inner) } func (m Map[K, V]) Values() []V { return maps.Values(m.inner) } func (m Map[K, V]) IsEmpty() bool { return len(m.inner) == 0 } func (m Map[K, V]) Equals(other Map[K, V], equal func(left, right V) bool) bool { if len(m.inner) != len(other.inner) { return false } for k, val := range m.inner { val2, ok := other.inner[k] if !ok || !equal(val, val2) { return false } } return true }