use effect_rs::{Effect, Exit, Runtime};
#[test]
fn test_fork_join() {
let rt = Runtime::new();
let program: Effect<(), (), i32> = Effect::succeed(10).fork().flat_map(|fiber| {
Effect::async_effect(move || async move { fiber.join().await }).flat_map(Effect::done)
});
let result = rt.block_on(program, ());
match result {
Exit::Success(val) => assert_eq!(val, 10),
Exit::Failure(_) => panic!("Expected success"),
}
}
#[test]
fn test_fork_failure_propagation() {
let rt = Runtime::new();
let program: Effect<(), &'static str, ()> = Effect::fail("error").fork().flat_map(|fiber| {
Effect::async_effect(move || async move { fiber.join().await }).flat_map(Effect::done)
});
let result = rt.block_on(program, ());
match result {
Exit::Success(_) => panic!("Expected failure"),
Exit::Failure(cause) => match cause {
effect_rs::Cause::Fail(e) => assert_eq!(e, "error"),
effect_rs::Cause::Interrupt => panic!("Expected Fail, got Interrupt"),
effect_rs::Cause::Die(_) => panic!("Expected Fail, got Die"),
},
}
}