use std::collections::{HashMap, VecDeque};
pub struct LruCache<K, V> {
capacity: usize,
map: HashMap<K, V>,
order: VecDeque<K>,
}
impl<K, V> LruCache<K, V>
where
K: Eq + std::hash::Hash + Clone,
V: Clone,
{
pub fn new(capacity: usize) -> Self {
Self {
capacity,
map: HashMap::with_capacity(capacity),
order: VecDeque::with_capacity(capacity),
}
}
pub fn get(&mut self, key: &K) -> Option<V> {
if self.map.contains_key(key) {
self.order.retain(|k| k != key);
self.order.push_back(key.clone());
self.map.get(key).cloned()
} else {
None
}
}
pub fn put(&mut self, key: K, value: V) {
if self.map.contains_key(&key) {
self.order.retain(|k| k != &key);
} else if self.map.len() == self.capacity {
if let Some(oldest) = self.order.pop_front() {
self.map.remove(&oldest);
}
}
self.order.push_back(key.clone());
self.map.insert(key, value);
}
}