| package xsync |
|
|
| import ( |
| "sync" |
| ) |
|
|
| type SyncedMap[K comparable, V any] struct { |
| mu sync.RWMutex |
| m map[K]V |
| } |
|
|
| func NewSyncedMap[K comparable, V any]() *SyncedMap[K, V] { |
| return &SyncedMap[K, V]{ |
| m: make(map[K]V), |
| } |
| } |
|
|
| func (m *SyncedMap[K, V]) Map() map[K]V { |
| m.mu.RLock() |
| defer m.mu.RUnlock() |
| return m.m |
| } |
|
|
| func (m *SyncedMap[K, V]) Get(key K) V { |
| m.mu.RLock() |
| defer m.mu.RUnlock() |
| return m.m[key] |
| } |
|
|
| func (m *SyncedMap[K, V]) Keys() []K { |
| m.mu.RLock() |
| defer m.mu.RUnlock() |
| keys := make([]K, 0, len(m.m)) |
| for k := range m.m { |
| keys = append(keys, k) |
| } |
| return keys |
| } |
|
|
| func (m *SyncedMap[K, V]) Values() []V { |
| m.mu.RLock() |
| defer m.mu.RUnlock() |
| values := make([]V, 0, len(m.m)) |
| for _, v := range m.m { |
| values = append(values, v) |
| } |
| return values |
| } |
|
|
| func (m *SyncedMap[K, V]) Len() int { |
| m.mu.RLock() |
| defer m.mu.RUnlock() |
| return len(m.m) |
| } |
|
|
| func (m *SyncedMap[K, V]) Iterate(f func(key K, value V) bool) { |
| m.mu.RLock() |
| defer m.mu.RUnlock() |
| for k, v := range m.m { |
| if !f(k, v) { |
| break |
| } |
| } |
| } |
|
|
| func (m *SyncedMap[K, V]) Set(key K, value V) { |
| m.mu.Lock() |
| m.m[key] = value |
| m.mu.Unlock() |
| } |
|
|
| func (m *SyncedMap[K, V]) Delete(key K) { |
| m.mu.Lock() |
| delete(m.m, key) |
| m.mu.Unlock() |
| } |
|
|
| func (m *SyncedMap[K, V]) Exists(key K) bool { |
| m.mu.RLock() |
| defer m.mu.RUnlock() |
| _, ok := m.m[key] |
| return ok |
| } |
|
|