Documentation
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))
        }
    }
}