effect-rs 0.1.0

A high-performance, strictly-typed, functional effect system for Rust.
Documentation
use effect_rs::{Effect, Exit, Runtime, core::FiberRef};

#[test]
fn test_fiber_ref_isolation() {
    let rt = Runtime::new();

    let fiber_ref = FiberRef::new(0);

    // Parent sets to 10
    // Forks child
    // Child sees 10, sets to 20
    // Child sees 20
    // Parent sees 10 (unaffected)

    let program = fiber_ref.set(10).flat_map(move |_| {
        let fr = fiber_ref.clone();
        fiber_ref
            .get()
            .flat_map(move |val| {
                assert_eq!(val, 10);
                Effect::succeed(val)
            })
            .flat_map(move |_| {
                let _fr2 = fr.clone();
                let fr3 = fr.clone();
                // Fork should inherit 100
                Effect::succeed(100)
                    .fork()
                    .flat_map(move |fiber| {
                        Effect::async_effect(move || async move { fiber.join().await })
                            .flat_map(Effect::done)
                    })
                    .flat_map(move |_| {
                        fr3.get().flat_map(move |val| {
                            assert_eq!(val, 10, "Parent should see original value");
                            Effect::succeed(val)
                        })
                    })
            })
    });

    let result = rt.block_on(program, ());
    assert!(matches!(result, Exit::Success(10)));
}