effect-rs 0.1.0

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

#[test]
fn test_stream_iter_collect() {
    let rt = Runtime::new();
    let stream = EffectStream::<(), (), i32>::from_iter(vec![1, 2, 3]);
    let program = stream.map(|i| i * 2).run_collect();

    let res = rt.block_on(program, ());
    match res {
        Exit::Success(vec) => assert_eq!(vec, vec![2, 4, 6]),
        Exit::Failure(_) => panic!("Stream failed"),
    }
}

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

    let s1 = EffectStream::<(), (), i32>::from_iter(vec![1, 2]);
    let s2 = EffectStream::<(), (), i32>::from_iter(vec![3, 4]);

    let program = s1.merge(s2).run_collect();

    let res = rt.block_on(program, ());
    match res {
        Exit::Success(mut items) => {
            items.sort(); // Merge order is nondeterministic
            assert_eq!(items, vec![1, 2, 3, 4]);
        }
        _ => panic!("Stream failed"),
    }
}

#[test]
fn test_stream_map_par() {
    let rt = Runtime::new();
    let data: Vec<i32> = (0..10).collect();

    let stream = EffectStream::<(), (), i32>::from_iter(data);

    // Map par with concurrency 4
    let program = stream
        .map_par(4, |n| {
            Effect::succeed(n * 2).delay(tokio::time::Duration::from_millis(10)) // Simulate work
        })
        .run_collect();

    let res = rt.block_on(program, ());
    match res {
        Exit::Success(mut items) => {
            items.sort();
            assert_eq!(items, vec![0, 2, 4, 6, 8, 10, 12, 14, 16, 18]);
        }
        _ => panic!("Map par failed"),
    }
}