use operese_dagx::{task, DagRunner};
struct Value {
value: i32,
}
impl Value {
fn new(value: i32) -> Self {
Self { value }
}
}
#[task]
impl Value {
async fn run(&mut self) -> i32 {
println!("Computing value: {}", self.value);
self.value
}
}
struct Add {
label: String,
}
#[task]
impl Add {
async fn run(&mut self, a: &i32, b: &i32) -> i32 {
println!("{}: Computing {} + {}", self.label, a, b);
a + b
}
}
#[tokio::main]
async fn main() {
let mut dag = DagRunner::new();
let x = dag.add_task(Value::new(2)); let y = dag.add_task(Value::new(3));
let sum = dag
.add_task(Add {
label: "Sum".to_string(),
})
.depends_on((&x, &y));
println!("Running DAG...\n");
let mut output = dag
.run(|fut| async move { tokio::spawn(fut).await.unwrap() })
.await
.unwrap();
println!("\nResult: {}", output.get(sum));
assert_eq!(output.get(x), 2);
assert_eq!(output.get(y), 3);
}