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.
62 lines
1.0 KiB
62 lines
1.0 KiB
package cache
|
|
|
|
import (
|
|
"errors"
|
|
cmap "github.com/orcaman/concurrent-map/v2"
|
|
)
|
|
|
|
type MapCache[V any] struct {
|
|
m *cmap.ConcurrentMap[string, V]
|
|
}
|
|
|
|
var KeyNotFound = errors.New("key not found")
|
|
|
|
func NewMapCache[V any]() *MapCache[V] {
|
|
m := cmap.New[V]()
|
|
return &MapCache[V]{
|
|
m: &m,
|
|
}
|
|
}
|
|
|
|
func (c *MapCache[V]) Set(key string, value V) {
|
|
c.m.Set(key, value)
|
|
}
|
|
|
|
func (c *MapCache[V]) Get(key string) (V, bool) {
|
|
v, ok := c.m.Get(key)
|
|
if ok {
|
|
return v, ok
|
|
} else {
|
|
var zero V
|
|
return zero, ok
|
|
}
|
|
}
|
|
|
|
func (c *MapCache[V]) Update(
|
|
key string, value V,
|
|
f func(exist bool, valueInMap V, newValue V) V,
|
|
) V {
|
|
return c.m.Upsert(key, value, f)
|
|
}
|
|
|
|
func (c *MapCache[V]) Remove(key string) {
|
|
c.m.Remove(key)
|
|
}
|
|
|
|
func (c *MapCache[V]) Iter(f func(key string, v V)) {
|
|
c.m.IterCb(f)
|
|
}
|
|
|
|
func (c *MapCache[V]) Count() int {
|
|
return c.m.Count()
|
|
}
|
|
|
|
func (c *MapCache[V]) Clear() {
|
|
keys := make([]string, 0, c.m.Count())
|
|
c.Iter(func(key string, v V) {
|
|
keys = append(keys, key)
|
|
})
|
|
for _, key := range keys {
|
|
c.m.Remove(key)
|
|
}
|
|
}
|
|
|