use std::collections::{HashSet, VecDeque};
use super::common::EvictionPolicy;
pub struct FIFO<K> {
queue: VecDeque<K>,
tombstones: HashSet<K>,
}
impl<K: Eq + std::hash::Hash + Clone > FIFO<K> {
pub fn new() -> Self {
Self {
queue: VecDeque::new(),
tombstones: HashSet::new(),
}
}
}
impl<K: Eq + std::hash::Hash + Clone > EvictionPolicy<K> for FIFO<K> {
fn on_get(&mut self, _key: &K) {}
fn on_set(&mut self, key: K) {
self.queue.push_back(key);
}
fn evict(&mut self) -> Option<K> {
let mut evicted_key = None;
while let Some(key) = self.queue.pop_front() {
if self.tombstones.contains(&key) {
self.tombstones.remove(&key);
} else {
evicted_key = Some(key);
break;
}
}
evicted_key
}
fn remove(&mut self, key: K) {
self.tombstones.insert(key);
}
}