|
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 |
|
} |
|
|