effect-rs 0.1.0

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