import collections import threading import typing from collections.abc import Iterable, Iterator, MutableMapping from .func import locked __all__ = ['LRU'] K = typing.TypeVar('K') V = typing.TypeVar('V') class LRU(MutableMapping[K, V], typing.Generic[K, V]): """ Implementation of a length-limited O(1) LRU map. Original Copyright 2003 Josiah Carlson, later rebuilt on OrderedDict and added typing. """ def __init__(self, count: int, pairs: Iterable[tuple[K, V]] = ()): self._lock = threading.RLock() self.count = max(count, 1) self.d: collections.OrderedDict[K, V] = collections.OrderedDict() for key, value in pairs: self[key] = value @locked def __contains__(self, obj: K) -> bool: return obj in self.d @locked def __getitem__(self, obj: K) -> V: a = self.d[obj] self.d.move_to_end(obj, last=False) return a @locked def __setitem__(self, obj: K, val: V): self.d[obj] = val self.d.move_to_end(obj, last=False) while len(self.d) > self.count: self.d.popitem(last=True) @locked def __delitem__(self, obj: K): del self.d[obj] @locked def __len__(self) -> int: return len(self.d) @locked def __iter__(self) -> Iterator[K]: return iter(self.d) @locked def pop(self, key: K) -> V: return self.d.pop(key) @locked def clear(self): self.d.clear()