use std::thread;
use std::time::Duration;
fn simulated_expensive_calc(intensity: u32) -> u32{
println!("Calculating...");
thread::sleep(Duration::from_secs(3));
intensity
}
fn generate_workout(intensity: u32, random_num: u32){
let mut cached_res = Cacher::new(|num| {
println!("Calculating...");
thread::sleep(Duration::from_secs(3));
num
});
if intensity < 25{
println!("Today, do {} pushups!", cached_res.value(intensity));
println!("Next, do {} situps!", cached_res.value(intensity));
}
else{
if random_num == 3{
println!("Take a break today!");
}
else{
println!("Run for {} minutes today", cached_res.value(intensity));
}
}
}
struct Cacher<T> where T: Fn(u32) -> u32,{
calculation: T,
value: Option<u32>
}
impl<T> Cacher<T> where T:Fn(u32) -> u32,{
fn new(calculation: T) -> Cacher<T>{
Cacher{
calculation,
value: None
}
}
fn value(&mut self, arg: u32) -> u32{
match self.value{
Some(v) => v,
None => {
let v = (self.calculation)(arg);
self.value = Some(v);
v
}
}
}
}
pub fn main(){
let x = vec![1,2,3];
let equal_to_x = |z| z == x;
println!("Cannot use x here: {:?}", x);
let y = vec![1, 2, 3];
assert!(equal_to_x(y));
}