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.
72 lines
1.7 KiB
72 lines
1.7 KiB
package cache
|
|
|
|
import "sync"
|
|
|
|
// Cache is a Generic sync.Map structure.
|
|
type Cache[K comparable, V any] struct {
|
|
m sync.Map
|
|
}
|
|
|
|
func NewCache[K comparable, V any]() *Cache[K, V] {
|
|
return &Cache[K, V]{}
|
|
}
|
|
|
|
// Load returns the value stored in the map for a key, or nil if no value is present.
|
|
func (c *Cache[K, V]) Load(key K) (value V, ok bool) {
|
|
rawValue, ok := c.m.Load(key)
|
|
if !ok {
|
|
return
|
|
}
|
|
return rawValue.(V), ok
|
|
}
|
|
|
|
// Store sets the value for a key.
|
|
func (c *Cache[K, V]) Store(key K, value V) {
|
|
c.m.Store(key, value)
|
|
}
|
|
|
|
// StoreAll sets all value by f's key.
|
|
func (c *Cache[K, V]) StoreAll(f func(value V) K, values []V) {
|
|
for _, v := range values {
|
|
c.m.Store(f(v), v)
|
|
}
|
|
}
|
|
|
|
// LoadOrStore returns the existing value for the key if present.
|
|
func (c *Cache[K, V]) LoadOrStore(key K, value V) (actual V, loaded bool) {
|
|
rawValue, loaded := c.m.LoadOrStore(key, value)
|
|
return rawValue.(V), loaded
|
|
}
|
|
|
|
// Delete deletes the value for a key.
|
|
func (c *Cache[K, V]) Delete(key K) {
|
|
c.m.Delete(key)
|
|
}
|
|
|
|
// DeleteAll deletes all values.
|
|
func (c *Cache[K, V]) DeleteAll() {
|
|
c.m.Range(func(key, value interface{}) bool {
|
|
c.m.Delete(key)
|
|
return true
|
|
})
|
|
}
|
|
|
|
// RangeAll returns all values in the map.
|
|
func (c *Cache[K, V]) RangeAll() (values []V) {
|
|
c.m.Range(func(rawKey, rawValue interface{}) bool {
|
|
values = append(values, rawValue.(V))
|
|
return true
|
|
})
|
|
return values
|
|
}
|
|
|
|
// RangeCon returns values in the map that satisfy condition f.
|
|
func (c *Cache[K, V]) RangeCon(f func(key K, value V) bool) (values []V) {
|
|
c.m.Range(func(rawKey, rawValue interface{}) bool {
|
|
if f(rawKey.(K), rawValue.(V)) {
|
|
values = append(values, rawValue.(V))
|
|
}
|
|
return true
|
|
})
|
|
return values
|
|
}
|
|
|