a love letter to tangled (android, iOS, and a search API)
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}