aboutsummaryrefslogtreecommitdiff
path: root/src/cachetools/fifo.py
diff options
context:
space:
mode:
authorThomas Kemmer <tkemmer@computer.org>2021-04-27 18:10:34 +0200
committerThomas Kemmer <tkemmer@computer.org>2021-04-27 18:10:34 +0200
commit6b56d1f2c91b145728afedb22a394bca679b82ed (patch)
tree51455545a2774bfe48a1bdbdad6830a1645d3f64 /src/cachetools/fifo.py
parent14858da844668605b128794436d4767c5ab55835 (diff)
downloadcachetools-6b56d1f2c91b145728afedb22a394bca679b82ed.tar.gz
Add src directory.
Diffstat (limited to 'src/cachetools/fifo.py')
-rw-r--r--src/cachetools/fifo.py31
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))