gokedex/internal/pokecache/pokecache.go
2025-06-05 16:09:14 -06:00

64 lines
1.0 KiB
Go

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)
}
}
}