aboutsummaryrefslogtreecommitdiff
path: root/src/cachetools/fifo.py
diff options
context:
space:
mode:
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))