diff --git a/closure/src/main.rs b/closure/src/main.rs index 650092f..fe0ddb1 100644 --- a/closure/src/main.rs +++ b/closure/src/main.rs @@ -1,3 +1,4 @@ +use std::collections::HashMap; use std::thread; use std::time::Duration; @@ -13,7 +14,7 @@ where T: Fn(u32) -> u32, { calculation: T, - value: Option, + values: HashMap, } impl Cacher @@ -23,16 +24,16 @@ where fn new(calculation: T) -> Cacher { Cacher { calculation, - value: None, + values: HashMap::new(), } } fn value(&mut self, arg: u32) -> u32 { - match self.value { - Some(v) => v, + match self.values.get(&arg) { + Some(v) => *v, None => { let v = (self.calculation)(arg); - self.value = Some(v); + self.values.insert(arg, v); v } } @@ -60,3 +61,19 @@ fn generate_workout(intensity: u32, random_number: u32) { } } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn call_with_different_values() { + let mut c = Cacher::new(|a| a); + + let v1 = c.value(1); + let v2 = c.value(2); + + assert_eq!(v1, 1); + assert_eq!(v2, 2); + } +}