use effect_rs::{Effect, EffectStream, Exit, Runtime};
fn process_item(n: i32) -> Effect<(), (), i32> {
Effect::sync(move || {
let start = std::time::Instant::now();
while start.elapsed().as_micros() < 500 {}
n * 2
})
}
fn main() {
let rt = Runtime::new();
let data: Vec<i32> = (0..1000).collect();
let stream = EffectStream::<(), (), i32>::from_iter(data);
println!("Starting Pipeline...");
let start = std::time::Instant::now();
let program = stream
.filter(|n| n % 2 == 0)
.map_par(10, |n| process_item(n)) .buffer(100)
.run_collect();
let res = rt.block_on(program, ());
match res {
Exit::Success(items) => {
let duration = start.elapsed();
println!("Pipeline Completed in {:?}", duration);
println!("Processed {} items", items.len());
println!("Sum: {}", items.iter().sum::<i32>());
let expected_sum = 499000;
if items.iter().sum::<i32>() == expected_sum {
println!("SUCCESS: Result is correct.");
} else {
println!(
"FAILURE: Expected {}, got {}",
expected_sum,
items.iter().sum::<i32>()
);
}
}
Exit::Failure(c) => println!("Pipeline Failed: {:?}", c),
}
}