a love letter to tangled (android, iOS, and a search API)
at main 57 lines 958 B view raw
1package xrpc 2 3import ( 4 "sync" 5 "time" 6) 7 8type cacheEntry[T any] struct { 9 value T 10 expiresAt time.Time 11} 12 13type ttlCache[T any] struct { 14 mu sync.RWMutex 15 entries map[string]cacheEntry[T] 16 ttl time.Duration 17} 18 19func newTTLCache[T any](ttl time.Duration) *ttlCache[T] { 20 return &ttlCache[T]{ 21 entries: make(map[string]cacheEntry[T]), 22 ttl: ttl, 23 } 24} 25 26func (c *ttlCache[T]) Get(key string) (T, bool) { 27 c.mu.RLock() 28 entry, ok := c.entries[key] 29 c.mu.RUnlock() 30 if !ok { 31 var zero T 32 return zero, false 33 } 34 if time.Now().After(entry.expiresAt) { 35 c.mu.Lock() 36 delete(c.entries, key) 37 c.mu.Unlock() 38 var zero T 39 return zero, false 40 } 41 return entry.value, true 42} 43 44func (c *ttlCache[T]) Set(key string, value T) { 45 c.mu.Lock() 46 c.entries[key] = cacheEntry[T]{ 47 value: value, 48 expiresAt: time.Now().Add(c.ttl), 49 } 50 c.mu.Unlock() 51} 52 53func (c *ttlCache[T]) Invalidate(key string) { 54 c.mu.Lock() 55 delete(c.entries, key) 56 c.mu.Unlock() 57}