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 }