fx-rs 0.1.1-dev0

Algebraic Effects inspired by Kyo and Fx.go
Documentation
use crate::Fx;

use super::{Item, Stream};

#[test]
fn test_stream_empty_fold() {
    let stream = Stream::empty();
    let folded = stream
        .fold(|_acc: usize, _item: String| Fx::pure(Item::Next(999)))
        .provide_left(10)
        .eval();
    assert_eq!(folded, 10)
}

#[test]
fn test_stream_once_fold() {
    let stream = Stream::single("33".to_owned());
    let folded = stream
        .fold(|acc: usize, item: String| {
            let val = acc + item.parse::<usize>().unwrap_or(666);
            Fx::pure(Item::Done(val))
        })
        .provide_left(10)
        .eval();
    assert_eq!(folded, 43)
}

#[test]
fn test_stream_cons_fold_done_early() {
    let stream = Stream::cons("12".to_owned(), Stream::single("33".to_owned()));
    let folded = stream
        .fold(|acc: usize, item: String| {
            let val = acc + item.parse::<usize>().unwrap_or(666);
            Fx::pure(Item::Done(val))
        })
        .provide_left(10)
        .eval();
    assert_eq!(folded, 22)
}

#[test]
fn test_stream_cons_fold() {
    let stream = Stream::cons("12".to_owned(), Stream::single("33".to_owned()));
    let folded = stream
        .fold(|acc: usize, item: String| {
            let val = acc + item.parse::<usize>().unwrap_or(666);
            Fx::pure(Item::Next(val))
        })
        .provide_left(10)
        .eval();
    assert_eq!(folded, 55)
}