use std::collections::BTreeMap;
use std::sync::Arc;
use kip::{eval_batch, parse, MapResolver, RegistryBuilder, Value};
struct SheetRow {
name: String,
src: String,
}
fn main() {
let registry = RegistryBuilder::from_seed().freeze();
let level0 = vec![
SheetRow {
name: "L".into(),
src: "40 ft".into(),
},
SheetRow {
name: "w".into(),
src: "12 in".into(),
},
];
let level1 = vec![SheetRow {
name: "M".into(),
src: "2 kip * L".into(),
}];
let mut bindings: BTreeMap<String, Value> = BTreeMap::new();
for level in [level0, level1] {
let mut resolver = MapResolver::new();
for (name, value) in &bindings {
resolver.insert(name.clone(), value.clone());
}
let parsed: Vec<Arc<kip::Expr>> = level
.iter()
.map(|row| parse(&row.src, ®istry).expect("parse"))
.collect();
let refs: Vec<_> = parsed.iter().map(|e| e.as_ref()).collect();
let results = eval_batch(refs, ®istry, &resolver);
for (row, result) in level.iter().zip(results) {
let value = result.expect("eval");
println!("{} = {:?}", row.name, value);
bindings.insert(row.name.clone(), value);
}
}
let _ = bindings; }