35 lines
No EOL
984 B
Rust
35 lines
No EOL
984 B
Rust
use std::collections::HashMap;
|
|
use std::cell::RefCell;
|
|
use std::rc::Rc;
|
|
|
|
use cassowary::Variable;
|
|
|
|
#[derive(Clone, Default)]
|
|
struct Values(Rc<RefCell<HashMap<Variable, f64>>>);
|
|
|
|
impl Values {
|
|
fn value_of(&self, var: Variable) -> f64 {
|
|
*self.0.borrow().get(&var).unwrap_or(&0.0)
|
|
}
|
|
fn update_values(&self, changes: &[(Variable, f64)]) {
|
|
for &(ref var, ref value) in changes {
|
|
println!("{:?} changed to {:?}", var, value);
|
|
self.0.borrow_mut().insert(*var, *value);
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn new_values() -> (Box<Fn(Variable) -> f64>, Box<Fn(&[(Variable, f64)])>) {
|
|
let values = Values(Rc::new(RefCell::new(HashMap::new())));
|
|
let value_of = {
|
|
let values = values.clone();
|
|
move |v| values.value_of(v)
|
|
};
|
|
let update_values = {
|
|
let values = values.clone();
|
|
move |changes: &[_]| {
|
|
values.update_values(changes);
|
|
}
|
|
};
|
|
(Box::new(value_of), Box::new(update_values))
|
|
} |