effect-rs 0.1.0

A high-performance, strictly-typed, functional effect system for Rust.
Documentation
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();

    // Waiter logic
    let waiter = d2.await_result();

    // Completer logic (delays then completes)
    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"),
    }
}