diff --git a/eviction_policies.py b/eviction_policies.py index d7dbf45..db89bc5 100644 --- a/eviction_policies.py +++ b/eviction_policies.py @@ -1,6 +1,7 @@ from abc import ABC, abstractmethod from typing import Generic, TypeVar from collections import OrderedDict +import random K = TypeVar('K') @@ -55,4 +56,37 @@ def remove(self, key: K) -> None: self.stack.remove(key) def evict(self) -> K: - return self.stack.pop() \ No newline at end of file + return self.stack.pop() + +class RandomEvictionPolicy(EvictionPolicy[K]): + def __init__(self): + self.items = set() + + def add(self, key: K) -> None: + self.items.add(key) + + def remove(self, key: K) -> None: + self.items.discard(key) + + def evict(self) -> K: + if not self.items: + raise IndexError("Eviction called on empty policy.") + key = random.choice(list(self.items)) + self.items.remove(key) + return key + +class MRUEvictionPolicy(EvictionPolicy[K]): + def __init__(self): + self.order = OrderedDict() + + def add(self, key: K) -> None: + if key in self.order: + del self.order[key] + self.order[key] = None + + def remove(self, key: K) -> None: + self.order.pop(key, None) + + def evict(self) -> K: + return self.order.popitem(last=True)[0] +