File size: 956 Bytes
45b1179
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from dataclasses import dataclass
from time import monotonic
from typing import Any


@dataclass
class _CacheEntry:
    value: Any
    expires_at: float


class SimpleTTLCache:
    def __init__(self, default_ttl_seconds: int = 60) -> None:
        self._default_ttl_seconds = default_ttl_seconds
        self._values: dict[str, _CacheEntry] = {}

    def get(self, key: str) -> Any | None:
        entry = self._values.get(key)
        if entry is None:
            return None
        if entry.expires_at <= monotonic():
            self._values.pop(key, None)
            return None
        return entry.value

    def set(self, key: str, value: Any, ttl_seconds: int | None = None) -> None:
        ttl = ttl_seconds if ttl_seconds is not None else self._default_ttl_seconds
        self._values[key] = _CacheEntry(
            value=value,
            expires_at=monotonic() + ttl,
        )

    def clear(self) -> None:
        self._values.clear()