1 use std::collections::HashMap;
2 use std::cell::RefCell;
3 use std::rc::Rc;
4 
5 use cassowary::Variable;
6 
7 #[derive(Clone, Default)]
8 struct Values(Rc<RefCell<HashMap<Variable, f64>>>);
9 
10 impl Values {
value_of(&self, var: Variable) -> f6411     fn value_of(&self, var: Variable) -> f64 {
12         *self.0.borrow().get(&var).unwrap_or(&0.0)
13     }
update_values(&self, changes: &[(Variable, f64)])14     fn update_values(&self, changes: &[(Variable, f64)]) {
15         for &(ref var, ref value) in changes {
16             println!("{:?} changed to {:?}", var, value);
17             self.0.borrow_mut().insert(*var, *value);
18         }
19     }
20 }
21 
new_values() -> (Box<Fn(Variable) -> f64>, Box<Fn(&[(Variable, f64)])>)22 pub fn new_values() -> (Box<Fn(Variable) -> f64>, Box<Fn(&[(Variable, f64)])>) {
23     let values = Values(Rc::new(RefCell::new(HashMap::new())));
24     let value_of = {
25         let values = values.clone();
26         move |v| values.value_of(v)
27     };
28     let update_values = {
29         let values = values.clone();
30         move |changes: &[_]| {
31             values.update_values(changes);
32         }
33     };
34     (Box::new(value_of), Box::new(update_values))
35 }