use std::process::ExitCode;
use go_lib::{chan::chan, go, sync::WaitGroup};
use std::sync::Arc;
fn main() -> ExitCode {
let all_passed = go_lib::run(|| {
const N: usize = 5;
let (tx, rx) = chan::<(usize, bool)>(N);
let wg = Arc::new(WaitGroup::new());
for id in 0..N {
let tx = tx.clone();
let wg2 = Arc::clone(&wg);
wg.add(1);
go!(move || {
let ok = run_task(id);
tx.send((id, ok));
wg2.done();
});
}
wg.wait();
let mut failures = 0_usize;
for _ in 0..N {
if let Some((id, ok)) = rx.recv() {
println!(" task {id}: {}", if ok { "ok" } else { "FAIL" });
if !ok { failures += 1; }
}
}
println!("{}/{N} tasks passed", N - failures);
failures == 0 });
if all_passed { ExitCode::SUCCESS } else { ExitCode::FAILURE }
}
fn run_task(id: usize) -> bool {
id % 2 == 0
}