use acorn_core::prelude::HashMap;
use core::hash::Hash;
use std::sync::Mutex;
#[derive(Debug)]
pub struct Cache<Key, Value> {
capacity: usize,
values: Mutex<HashMap<Key, Value>>,
}
impl<Key, Value> Cache<Key, Value>
where
Key: Eq + Hash,
Value: Clone,
{
pub fn new(capacity: usize) -> Self {
Self {
capacity,
values: Mutex::new(HashMap::new()),
}
}
pub fn get(&self, key: &Key) -> Option<Value> {
self.values.lock().ok().and_then(|values| values.get(key).cloned())
}
pub fn insert(&self, key: Key, value: Value) -> Value {
if let Ok(mut values) = self.values.lock() {
if self.capacity > 0 {
if values.len() >= self.capacity {
values.clear();
}
values.insert(key, value.clone());
}
}
value
}
}
#[cfg(test)]
mod tests;