From 3e7911269624b347d69ab19b79de701291d62e9a Mon Sep 17 00:00:00 2001 From: rjbasitali Date: Wed, 6 Apr 2022 15:19:15 +0500 Subject: [PATCH] eviction callback --- delete_expired.go | 5 ++++- my_cache.go | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/delete_expired.go b/delete_expired.go index 8c51817..77a3959 100644 --- a/delete_expired.go +++ b/delete_expired.go @@ -8,10 +8,13 @@ func (cache *myCache) deleteExpired() { now := time.Now().UnixNano() for k, v := range cache.items { - if cache.decisionFunc != nil && !cache.decisionFunc(v) { + if cache.decisionFunc != nil && !cache.decisionFunc(v.data) { continue } if v.expiration > 0 && now > v.expiration { + if cache.onEviction != nil { + cache.onEviction(k, v.data) + } delete(cache.items, k) } } diff --git a/my_cache.go b/my_cache.go index 4264bf0..29019e2 100644 --- a/my_cache.go +++ b/my_cache.go @@ -11,6 +11,7 @@ type myCache struct { items map[string]*value expireAfter int64 decisionFunc func(v interface{}) bool + onEviction func(k string, v interface{}) } func NewCache() Cache { @@ -19,11 +20,13 @@ func NewCache() Cache { } } -func NewCacheWithSweeper(interval, expireAfter time.Duration, decisionFunc func(v interface{}) bool) Cache { +func NewCacheWithSweeper(interval, expireAfter time.Duration, + decisionFunc func(v interface{}) bool, onEviction func(k string, v interface{})) Cache { c := &myCache{ items: make(map[string]*value), expireAfter: expireAfter.Nanoseconds(), decisionFunc: decisionFunc, + onEviction: onEviction, } if interval > 0 && expireAfter > 0 {