map.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package util
  2. import "sync"
  3. type Map[K comparable, V any] struct {
  4. sync.Map
  5. }
  6. func (m *Map[K, V]) Add(k K, v V) bool {
  7. _, loaded := m.LoadOrStore(k, v)
  8. return !loaded
  9. }
  10. func (m *Map[K, V]) Set(k K, v V) {
  11. m.Store(k, v)
  12. }
  13. func (m *Map[K, V]) Has(k K) (ok bool) {
  14. _, ok = m.Load(k)
  15. return
  16. }
  17. func (m *Map[K, V]) Len() (l int) {
  18. m.Map.Range(func(k, v interface{}) bool {
  19. l++
  20. return true
  21. })
  22. return
  23. }
  24. func (m *Map[K, V]) Get(k K) (result V) {
  25. v, ok := m.Load(k)
  26. if !ok {
  27. return
  28. }
  29. return v.(V)
  30. }
  31. func (m *Map[K, V]) Delete(k K) (v V, ok bool) {
  32. var r any
  33. if r, ok = m.Map.LoadAndDelete(k); ok {
  34. v = r.(V)
  35. }
  36. return
  37. }
  38. func (m *Map[K, V]) ToList() (r []V) {
  39. m.Map.Range(func(k, v interface{}) bool {
  40. r = append(r, v.(V))
  41. return true
  42. })
  43. return
  44. }
  45. func MapList[K comparable, V any, R any](m *Map[K, V], f func(K, V) R) (r []R) {
  46. m.Map.Range(func(k, v interface{}) bool {
  47. r = append(r, f(k.(K), v.(V)))
  48. return true
  49. })
  50. return
  51. }
  52. func (m *Map[K, V]) Range(f func(K, V)) {
  53. m.Map.Range(func(k, v interface{}) bool {
  54. f(k.(K), v.(V))
  55. return true
  56. })
  57. }