use std::{thread, time::Duration, collections::HashMap};
struct Memo<T>
where T: Fn(u32) -> u32 {
calculation: T,
map: HashMap<u32, u32>,
value: Option<u32>
}
impl<T> Memo<T>
where
T: Fn(u32) -> u32 {
fn new(calculation: T) -> Memo<T> {
Memo {
calculation,
value: None,
map: HashMap::new()
}
}
fn value(&mut self, arg: u32) -> u32 {
let cache_value = self.map.get(&arg);
match cache_value {
Some(v) => *v,
None => {
let v = (self.calculation)(arg);
println!("calculating {}", arg);
self.value = Some(v);
self.map.insert(arg, v);
v
}
}
}
}
fn main() {
let mut clo = Memo::new(|x| x * x);
println!("enter...");
thread::sleep(Duration::from_millis(100));
println!("Hello, world!");
println!("{}", clo.value(1024));
println!("{}", clo.value(104));
println!("{}", clo.value(104));
println!("{}", clo.value(1024));
}