use taskorch::{Pool, Queue, TaskBuildNew};
fn main() {
println!("----- test task orch -----");
let mut pool = Pool::new();
let qid = pool.insert_queue(&Queue::new()).unwrap();
let submitter = pool.task_submitter(qid).unwrap();
let task = (|| println!("task='free': Hello, 1 2 3 ..")).into_task();
let _ = submitter.submit(task);
let exit = submitter
.submit(
(|a: i32, msg: &str| println!("task='exit': received ({a},{msg:?}) and EXIT"))
.into_exit_task(),
)
.take();
let b1 = (|a: i32| {
println!("task='B1': pass ('{a}') to task='exit'");
a
})
.into_task()
.bind_to(exit.input_ca::<0>());
let b1 = submitter.submit(b1).take();
let b2 = (|msg: &'static str| {
println!("task='B2': recv ('{msg}') and then pass ('{msg}') to task='exit'");
msg
})
.into_task()
.bind_to(exit.input_ca::<1>());
let b2 = submitter.submit(b2).take();
let b3 = (||())
.into_task()
.map_tuple_with(move |_: ()| {
println!("task='A': map `()=>(i32,&str)` and then pass (10,'exit') to task=['B1','B2']");
(10, "exit")
})
.bind_all_to((b1.input_ca::<0>(), b2.input_ca::<0>()));
let _ = submitter.submit(b3);
pool.spawn_thread_for(qid);
pool.join();
}