rvs 0.5.0

A library for defining and evaluating random variables using a simple DSL
Documentation
mod util;
use crate::util::*;

use std::iter;

#[test]
fn done_defaults_to_false() {
    let a = expr_to_var("Done(1)").unwrap();
    let a = a.borrow();

    assert_eq!(a.done(), false);
}

#[test]
fn done_causes_advance_to_next_subexpr() {
    let a = expr_to_var("Pattern(Done(Pattern(0, 1, 2, 3)), Done(Pattern(4, 5, 6, 7)))").unwrap();
    let mut a = a.borrow_mut();

    let expected: Vec<(u32, bool)> = (0..8)
        .zip(vec![false, true].into_iter().cycle().take(8))
        .cycle()
        .take(32)
        .map(|(value, done)| {
            let value = if value % 2 == 0 {
                value / 2
            } else {
                value / 2 + 4
            };
            (value, done)
        })
        .collect();
    let actual: Vec<(u32, bool)> = (0..32).map(|_| (a.next(), a.done())).collect();

    assert_eq!(expected, actual);
}

#[test]
fn always_done() {
    let a = expr_to_var("Done(Pattern(0, 1, 2, 3))").unwrap();
    let mut a = a.borrow_mut();

    let expected: Vec<(u32, bool)> = (0..4)
        .zip(iter::repeat(true).take(4))
        .cycle()
        .take(32)
        .collect();
    let actual: Vec<(u32, bool)> = (0..32).map(|_| (a.next(), a.done())).collect();

    assert_eq!(expected, actual);
}