}
type mapExceededItem[V any] struct {
- data *V
+ data V
exceeded time.Time
wait sync.RWMutex
}
return
}
-func (t *MapExceeded[K, V]) Store(k K, v *V, dur time.Duration) {
+func (t *MapExceeded[K, V]) Store(k K, v V, dur time.Duration) {
t.m.Store(k, &mapExceededItem[V]{
data: v,
exceeded: time.Now().Add(dur),
})
}
-func (t *MapExceeded[K, V]) Load(k K) (*V, bool) {
+func (t *MapExceeded[K, V]) Load(k K) (v V, ok bool) {
if v, ok := t.m.LoadV(k).(*mapExceededItem[V]); ok {
if v.exceeded.After(time.Now()) {
return v.data, true
}
t.Delete(k)
}
- return nil, false
+ return
}
func (t *MapExceeded[K, V]) Range(f func(key K, value *V) bool) {
t.m.Delete(k)
}
-func (t *MapExceeded[K, V]) LoadOrStore(k K) (vr *V, loaded bool, store func(v1 *V, dur time.Duration)) {
- store = func(v1 *V, dur time.Duration) {}
+func (t *MapExceeded[K, V]) LoadOrStore(k K) (vr V, loaded bool, store func(v1 V, dur time.Duration)) {
+ store = func(v1 V, dur time.Duration) {}
var actual any
actual, loaded = t.m.LoadOrStore(k, &mapExceededItem[V]{})
v := actual.(*mapExceededItem[V])
return
}
if !loaded || (loaded && !exp.IsZero()) {
- store = func(v1 *V, dur time.Duration) {
+ store = func(v1 V, dur time.Duration) {
v.wait.Lock()
v.data = v1
v.exceeded = time.Now().Add(dur)
}
func TestMapExceeded1(t *testing.T) {
- var m MapExceeded[string, []byte]
+ var m MapExceeded[string, *[]byte]
var data = []byte("1")
m.Store("1", &data, time.Second)
if b, ok := m.Load("1"); !ok || 0 != bytes.Compare(*b, []byte("1")) {
}
func TestMapExceeded2(t *testing.T) {
- var m MapExceeded[string, []byte]
+ var m MapExceeded[string, *[]byte]
var data = []byte("1")
if v, loaded, f := m.LoadOrStore("1"); v != nil || loaded {
t.Fatal()
}
func TestMapExceeded3(t *testing.T) {
- var m MapExceeded[string, []byte]
+ var m MapExceeded[string, *[]byte]
var data = []byte("1")
if v, loaded, f := m.LoadOrStore("1"); v != nil || loaded {
t.Fatal()