diff options
Diffstat (limited to 'src/cachetools/fifo.py')
-rw-r--r-- | src/cachetools/fifo.py | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/cachetools/fifo.py b/src/cachetools/fifo.py new file mode 100644 index 0000000..e7c377e --- /dev/null +++ b/src/cachetools/fifo.py @@ -0,0 +1,31 @@ +import collections + +from .cache import Cache + + +class FIFOCache(Cache): + """First In First Out (FIFO) cache implementation.""" + + def __init__(self, maxsize, getsizeof=None): + Cache.__init__(self, maxsize, getsizeof) + self.__order = collections.OrderedDict() + + def __setitem__(self, key, value, cache_setitem=Cache.__setitem__): + cache_setitem(self, key, value) + try: + self.__order.move_to_end(key) + except KeyError: + self.__order[key] = None + + def __delitem__(self, key, cache_delitem=Cache.__delitem__): + cache_delitem(self, key) + del self.__order[key] + + def popitem(self): + """Remove and return the `(key, value)` pair first inserted.""" + try: + key = next(iter(self.__order)) + except StopIteration: + raise KeyError("%s is empty" % type(self).__name__) from None + else: + return (key, self.pop(key)) |