Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::collections::HashMap;
- struct Cacher<T, I, O> where I: std::hash::Hash, I: std::cmp::Eq, T: Fn(&I) -> O {
- func: T,
- map: HashMap<I, O>,
- }
- impl<T, I, O> Cacher<T, I, O> where I: std::hash::Hash, I: std::cmp::Eq, T: Fn(&I) -> O {
- fn new(calc: T) -> Cacher<T, I, O> {
- Cacher{
- func: calc,
- map: HashMap::new()}
- }
- fn value(&mut self, v: I) -> O {
- let c = self.map.get(&v);
- match c {
- Some(a) => *a,
- None => {
- // println!("Calculating for {}", v);
- let r = (self.func)(&v);
- self.map.insert(v, r);
- r
- }
- }
- }
- }
- fn main() {
- let mut v = Cacher::new(|x| x + 1);
- println!("{}", &mut v.value(1));
- println!("{}", &mut v.value(1));
- println!("{}", &mut v.value(2));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement