use std::collections::HashMap;
use std::hash::Hash;
pub struct Memoize<A, R, F> {
func: F,
cache: HashMap<A, R>,
}
impl<A: Eq + Hash + Clone, R: Clone, F: FnMut(&A) -> R> Memoize<A, R, F> {
#[must_use]
pub fn new(func: F) -> Self {
Self {
func,
cache: HashMap::new(),
}
}
pub fn call(&mut self, arg: A) -> R {
if let Some(result) = self.cache.get(&arg) {
return result.clone();
}
let result = (self.func)(&arg);
self.cache.insert(arg, result.clone());
result
}
#[must_use]
pub fn len(&self) -> usize {
self.cache.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.cache.is_empty()
}
pub fn clear(&mut self) {
self.cache.clear();
}
}
#[cfg(test)]
#[path = "memoize.test.rs"]
mod tests;
#[cfg(test)]
#[path = "memoize.spec.rs"]
mod spec;