package pokecache import ( "sync" "time" ) type Cache struct { entries map[string]cacheEntry mux *sync.RWMutex } type cacheEntry struct { createdAt time.Time val []byte } func NewCache(interval time.Duration) Cache { cache := Cache{ entries: make(map[string]cacheEntry), mux: &sync.RWMutex{}, } go cache.reapLoop(interval) return cache } func (c *Cache) Add(key string, value []byte) { c.mux.Lock() defer c.mux.Unlock() c.entries[key] = cacheEntry{ createdAt: time.Now().UTC(), val: value, } } func (c *Cache) Get(key string) ([]byte, bool) { c.mux.RLock() defer c.mux.RUnlock() val, ok := c.entries[key] return val.val, ok } func (c *Cache) reapLoop(interval time.Duration) { ticker := time.NewTicker(interval) for range ticker.C { c.reap(time.Now().UTC(), interval) } } func (c *Cache) reap(now time.Time, last time.Duration) { c.mux.Lock() defer c.mux.Unlock() for k, v := range c.entries { if v.createdAt.Before(now.Add(-last)) { delete(c.entries, k) } } }