use effect_rs::{Effect, Exit, Queue, Runtime};
#[test]
fn test_queue_production_consumption() {
let rt = Runtime::new();
let queue = Queue::new(10);
let consumer = queue.clone();
let consume = Effect::async_effect(move || async move {
let mut _sum = 0;
for _ in 0..5 {
}
()
})
.flat_map(move |_| {
consumer.take().flat_map(move |v1| {
consumer
.take()
.flat_map(move |v2| consumer.take().map(move |v3| (v1, v2, v3)))
})
});
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"),
}
}