pub mod thing {
use std::collections::HashMap;
pub struct Cacher<T, K, V>
where
T: Fn(K) -> V,
K: Eq + PartialEq + std::hash::Hash + std::fmt::Display + Copy,
{
pub calculation: T,
pub value: HashMap<K, V>,
}
impl<T, K, V> Cacher<T, K, V>
where
T: Fn(K) -> V,
K: Eq + PartialEq + std::hash::Hash + std::fmt::Display + Copy,
{
pub fn new(calculation: T) -> Self {
Cacher {
calculation,
value: HashMap::new(),
}
}
pub fn obtain_or_calculate(&mut self, arg: K) -> &V {
self.value
.entry(arg)
.or_insert_with(|| (self.calculation)(arg))
}
}
}