1package csync
2
3import (
4 "encoding/json"
5 "iter"
6 "maps"
7 "sync"
8)
9
10type Map[K comparable, V any] struct {
11 inner map[K]V
12 mu sync.RWMutex
13}
14
15func NewMap[K comparable, V any]() *Map[K, V] {
16 return &Map[K, V]{
17 inner: make(map[K]V),
18 }
19}
20
21func NewMapFrom[K comparable, V any](m map[K]V) *Map[K, V] {
22 return &Map[K, V]{
23 inner: m,
24 }
25}
26
27func (m *Map[K, V]) Set(key K, value V) {
28 m.mu.Lock()
29 defer m.mu.Unlock()
30 m.inner[key] = value
31}
32
33func (m *Map[K, V]) Del(key K) {
34 m.mu.Lock()
35 defer m.mu.Unlock()
36 delete(m.inner, key)
37}
38
39func (m *Map[K, V]) Get(key K) (V, bool) {
40 m.mu.RLock()
41 defer m.mu.RUnlock()
42 v, ok := m.inner[key]
43 return v, ok
44}
45
46func (m *Map[K, V]) Len() int {
47 m.mu.RLock()
48 defer m.mu.RUnlock()
49 return len(m.inner)
50}
51
52func (m *Map[K, V]) Seq2() iter.Seq2[K, V] {
53 dst := make(map[K]V)
54 m.mu.RLock()
55 maps.Copy(dst, m.inner)
56 m.mu.RUnlock()
57 return func(yield func(K, V) bool) {
58 for k, v := range dst {
59 if !yield(k, v) {
60 return
61 }
62 }
63 }
64}
65
66var (
67 _ json.Unmarshaler = &Map[string, any]{}
68 _ json.Marshaler = &Map[string, any]{}
69)
70
71// UnmarshalJSON implements json.Unmarshaler.
72func (m *Map[K, V]) UnmarshalJSON(data []byte) error {
73 m.mu.Lock()
74 defer m.mu.Unlock()
75 m.inner = make(map[K]V)
76 return json.Unmarshal(data, &m.inner)
77}
78
79// MarshalJSON implements json.Marshaler.
80func (m *Map[K, V]) MarshalJSON() ([]byte, error) {
81 m.mu.RLock()
82 defer m.mu.RUnlock()
83 return json.Marshal(m.inner)
84}