map.go 982 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package compatible
  2. import "sync"
  3. // Map is a generics sync.Map
  4. type Map[K comparable, V any] struct {
  5. m sync.Map
  6. }
  7. func (m *Map[K, V]) Len() int {
  8. var count int
  9. m.m.Range(func(key, value any) bool {
  10. count++
  11. return true
  12. })
  13. return count
  14. }
  15. func (m *Map[K, V]) Load(key K) (V, bool) {
  16. v, ok := m.m.Load(key)
  17. if !ok {
  18. return *new(V), false
  19. }
  20. return v.(V), ok
  21. }
  22. func (m *Map[K, V]) Store(key K, value V) {
  23. m.m.Store(key, value)
  24. }
  25. func (m *Map[K, V]) Delete(key K) {
  26. m.m.Delete(key)
  27. }
  28. func (m *Map[K, V]) Range(f func(key K, value V) bool) {
  29. m.m.Range(func(key, value any) bool {
  30. return f(key.(K), value.(V))
  31. })
  32. }
  33. func (m *Map[K, V]) LoadOrStore(key K, value V) (V, bool) {
  34. v, ok := m.m.LoadOrStore(key, value)
  35. return v.(V), ok
  36. }
  37. func (m *Map[K, V]) LoadAndDelete(key K) (V, bool) {
  38. v, ok := m.m.LoadAndDelete(key)
  39. if !ok {
  40. return *new(V), false
  41. }
  42. return v.(V), ok
  43. }
  44. func New[K comparable, V any]() *Map[K, V] {
  45. return &Map[K, V]{m: sync.Map{}}
  46. }