effect-rs 0.1.0

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

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

    let queue = Queue::new(10);

    // Consumer
    let consumer = queue.clone();
    let consume = Effect::async_effect(move || async move {
        let mut _sum = 0;
        for _ in 0..5 {
            // we use consume logic manually via recursion or loop inside async
            // Effect composition for loop is verbose, so using async block for simplicity in test
        }
        // Actually, we need to call `take` effect.
        ()
    })
    .flat_map(move |_| {
        // Just take 3 times
        consumer.take().flat_map(move |v1| {
            consumer
                .take()
                .flat_map(move |v2| consumer.take().map(move |v3| (v1, v2, v3)))
        })
    });

    // Producer
    let producer = queue.clone();
    let produce = producer
        .offer(1)
        .flat_map(move |_| producer.offer(2).flat_map(move |_| producer.offer(3)));

    let program = produce.zip_par(consume);

    let result = rt.block_on(program, ());

    match result {
        Exit::Success((_, (v1, v2, v3))) => {
            assert_eq!(v1, Some(1));
            assert_eq!(v2, Some(2));
            assert_eq!(v3, Some(3));
        }
        Exit::Failure(_) => panic!("Expected success"),
    }
}