use effect_rs::{Deferred, Effect, Exit, Runtime};
use std::time::Duration;
#[test]
fn test_deferred_success() {
let rt = Runtime::new();
let deferred = Deferred::new();
let program = deferred.succeed(42).zip_par(deferred.await_result());
let result = rt.block_on(program, ());
match result {
Exit::Success((completed, val)) => {
assert!(completed);
assert_eq!(val, 42);
}
Exit::Failure(_) => panic!("Expected success"),
}
}
#[test]
fn test_deferred_wait() {
let rt = Runtime::new();
let deferred = Deferred::new();
let d2 = deferred.clone();
let waiter = d2.await_result();
let completer = Effect::async_effect(move || async move {
tokio::time::sleep(Duration::from_millis(50)).await;
()
})
.flat_map(move |_| deferred.succeed(100));
let program = completer.zip_par(waiter);
let result = rt.block_on(program, ());
match result {
Exit::Success((_, val)) => assert_eq!(val, 100),
Exit::Failure(_) => panic!("Expected success"),
}
}