package shared import "sync" type TMap[K comparable, V any] struct { data map[K]V mu sync.RWMutex } func NewTMap[K comparable, V any]() TMap[K, V] { return TMap[K, V]{ data: map[K]V{}, } } func (m *TMap[K, V]) Get(k K) V { m.mu.RLock() defer m.mu.RUnlock() return m.data[k] } func (m *TMap[K, V]) GetOK(k K) (V, bool) { m.mu.RLock() defer m.mu.RUnlock() v, ok := m.data[k] return v, ok } func (m *TMap[K, V]) Set(k K, v V) { m.mu.Lock() defer m.mu.Unlock() m.data[k] = v } func (m *TMap[K, V]) Delete(k K) { m.mu.Lock() defer m.mu.Unlock() delete(m.data, k) } func (m *TMap[K, V]) ForEach(f func(k K, v V)) { m.mu.RLock() defer m.mu.RUnlock() for k, v := range m.data { f(k, v) } }