pkg/internal/syncmap/syncmap.go (42 lines of code) (raw):
// syncmap implements a simple generic, synchronized map.
package syncmap
import (
"sync"
"golang.org/x/exp/maps"
)
type SyncMap[K comparable, V any] struct {
data map[K]V
lock sync.RWMutex
}
func New[K comparable, V any]() *SyncMap[K, V] {
return &SyncMap[K, V]{
data: make(map[K]V),
}
}
func (c *SyncMap[K, V]) Put(key K, value V) {
c.lock.Lock()
defer c.lock.Unlock()
c.data[key] = value
}
func (c *SyncMap[K, V]) Get(key K) (V, bool) {
c.lock.RLock()
defer c.lock.RUnlock()
val, ok := c.data[key]
return val, ok
}
func (c *SyncMap[K, V]) Remove(key K) {
c.lock.Lock()
defer c.lock.Unlock()
delete(c.data, key)
}
func (c *SyncMap[K, V]) Keys() []K {
c.lock.RLock()
defer c.lock.RUnlock()
return maps.Keys(c.data)
}
func (c *SyncMap[K, V]) ForEach(f func(k K, v V)) {
c.lock.RLock()
defer c.lock.RUnlock()
for k, v := range c.data {
f(k, v)
}
}