from __future__ import annotations import time from dataclasses import dataclass from typing import Generic, TypeVar T = TypeVar("T") @dataclass class CacheItem(Generic[T]): value: T expires_at: float class TTLCache(Generic[T]): def __init__(self) -> None: self._store: dict[str, CacheItem[T]] = {} def get(self, key: str) -> T | None: item = self._store.get(key) if item is None: return None if item.expires_at < time.time(): self._store.pop(key, None) return None return item.value def set(self, key: str, value: T, ttl_seconds: int) -> None: self._store[key] = CacheItem(value=value, expires_at=time.time() + ttl_seconds)