use std::collections::HashMap;
use pldag::{Bound, Pldag};
#[tokio::main]
async fn main() {
let pldag: Pldag = Pldag::new();
pldag.set_primitive("x", (0, 1)).await.unwrap();
pldag.set_primitive("y", (0, 1)).await.unwrap();
pldag.set_primitive("z", (0, 1)).await.unwrap();
let root = pldag.set_or(vec!["x", "y", "z"]).await.unwrap();
let dag = pldag.sub_dag(vec![root.clone()]).await.unwrap();
let mut inputs: HashMap<&str, Bound> = HashMap::new();
let validated = Pldag::propagate_dag(&dag, inputs.clone()).unwrap();
println!("Root valid? {}", *validated.get(&root).unwrap() == (1, 1));
inputs.insert("x", (0, 0));
let revalidated = Pldag::propagate_dag(&pldag.dag().await.unwrap(), inputs.clone()).unwrap();
println!("Root valid? {}", *revalidated.get(&root).unwrap() == (1, 1));
inputs.insert("y", (1, 1));
inputs.insert("z", (1, 1));
let revalidated = Pldag::propagate_dag(&pldag.dag().await.unwrap(), inputs.clone()).unwrap();
println!("Root valid? {}", *revalidated.get(&root).unwrap() == (1, 1));
let pldag = Pldag::new();
pldag.set_primitive("x", (0, 1)).await.unwrap();
pldag.set_primitive("y", (0, 1)).await.unwrap();
pldag.set_primitive("z", (0, 1)).await.unwrap();
let root = pldag.set_or(vec!["x", "y", "z"]).await.unwrap();
let dag = pldag.sub_dag(vec![root.clone()]).await.unwrap();
let validated = dag.propagate(inputs).unwrap();
println!("root bound = {:?}", validated[&root]);
}