maps.go

 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}