You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

106 lines
1.5 KiB

package util
import (
"sync"
"time"
)
type RwMap[K comparable, V any] struct {
sync.RWMutex
Map map[K]V
}
func NewRwMap[K comparable, V any]() *RwMap[K, V] {
return &RwMap[K, V]{
Map: make(map[K]V),
}
}
func (m *RwMap[K, V]) Add(k K, v V) bool {
m.Lock()
defer m.Unlock()
if _, ok := m.Map[k]; ok {
return false
}
m.Map[k] = v
return true
}
func (m *RwMap[K, V]) Set(k K, v V) {
m.Lock()
m.Map[k] = v
m.Unlock()
}
func (m *RwMap[K, V]) Has(k K) (ok bool) {
m.RLock()
defer m.RUnlock()
_, ok = m.Map[k]
return
}
func (m *RwMap[K, V]) Len() int {
return len(m.Map)
}
func (m *RwMap[K, V]) Get(k K) (V, bool) {
m.RLock()
defer m.RUnlock()
v, ok := m.Map[k]
return v, ok
}
func (m *RwMap[K, V]) Delete(k K) (v V, ok bool) {
m.RLock()
v, ok = m.Map[k]
m.RUnlock()
if ok {
m.Lock()
delete(m.Map, k)
m.Unlock()
}
return
}
func (m *RwMap[K, V]) ToList() (r []V) {
m.RLock()
defer m.RUnlock()
for _, s := range m.Map {
r = append(r, s)
}
return
}
func MapList[K comparable, V any, R any](m *RwMap[K, V], f func(K, V) R) (r []R) {
m.RLock()
defer m.RUnlock()
for k, v := range m.Map {
r = append(r, f(k, v))
}
return
}
func (m *RwMap[K, V]) Range(f func(K, V)) {
m.RLock()
defer m.RUnlock()
for k, v := range m.Map {
f(k, v)
}
}
func (m *RwMap[K, V]) RangeInterval(f func(K, V), d time.Duration) {
m.RLock()
defer m.RUnlock()
for k, v := range m.Map {
f(k, v)
time.Sleep(d)
}
}
func (m *RwMap[K, V]) ModifyRange(f func(K, V)) {
m.Lock()
defer m.Unlock()
for k, v := range m.Map {
f(k, v)
}
}