cache.rs
// A tiny LRU cache backed by a HashMap and a doubly-linked list.
// Built for the Kiln runtime — evicts cold entries first.
use std::collections::HashMap;
use std::hash::Hash;
#[derive(Debug)]
pub struct LruCache<K, V> {
capacity: usize,
store: HashMap<K, V>,
order: Vec<K>,
}
impl<K: Eq + Hash + Clone, V> LruCache<K, V> {
pub fn new(cap: usize) -> Self {
assert!(cap > 0, "capacity must be > 0");
Self { capacity: cap, store: HashMap::new(), order: Vec::new() }
}
pub fn put(&mut self, key: K, value: V) {
if self.store.contains_key(&key) {
self.order.retain(|k| k != &key);
} else if self.store.len() >= self.capacity {
if let Some(oldest) = self.order.first().cloned() {
self.store.remove(&oldest);
self.order.remove(0);
}
}
self.order.push(key.clone());
self.store.insert(key, value);
}
pub fn get(&mut self, key: &K) -> Option<&V> {
self.order.retain(|k| k != key);
self.order.push(key.clone());
self.store.get(key)
}
}