orx-parallel 4.0.0

Performant parallel computations with an expressive iterator API.
Documentation
use crate::Params;
use crate::infallible::recursive::execution::next::next;
use crate::infallible::recursive::execution::tests::tree::{Node, RANGE};
use crate::infallible::{Xap, xap_variants::Id};
use crate::runner::default_runner;
use rand::SeedableRng;
use rand_chacha::ChaCha8Rng;
use test_case::test_matrix;

#[test_matrix([2, 3, 4], [2, 3, 4], [true, false])]
fn recursive_next(depth: usize, fan_out: usize, find: bool) {
    let mut rng = ChaCha8Rng::seed_from_u64(42);
    let tree = Node::build_tree(depth, fan_out, &mut rng);

    let filter = move |x: &u64| match find {
        true => *x < RANGE.end / 2,
        false => *x > RANGE.end + 1,
    };

    let xap = Id::<&Node>::new().map(|x| x.value).filter(filter);
    let runner = default_runner();
    let params = Params::default();

    let result = next(runner, params, [&tree], xap, |x| &x.children);

    match find {
        true => assert!(result.map(|x| filter(&x)).unwrap_or(true)),
        false => assert!(result.is_none()),
    }
}

#[cfg(all(not(miri), feature = "long-tests"))]
#[test_matrix([7, 8], [8, 9], [true])]
fn recursive_next_determinism(depth: usize, fan_out: usize, find: bool) {
    let mut rng = ChaCha8Rng::seed_from_u64(42);
    let tree = Node::build_tree(depth, fan_out, &mut rng);

    let filter = move |x: &u64| match find {
        true => *x > 99 * RANGE.end / 100,
        false => *x > RANGE.end + 1,
    };

    let xap = Id::<&Node>::new().map(|x| x.value).filter(filter);
    let mut runner = default_runner();
    let params = Params::default();

    let expected = next(&mut runner, params, [&tree], xap, |x| &x.children);

    for _ in 0..1000 {
        let result = next(&mut runner, params, [&tree], xap, |x| &x.children);
        assert_eq!(expected, result);
    }
}

#[cfg(all(not(miri), feature = "long-tests"))]
#[test_matrix([7, 8], [8, 9], [true])]
fn recursive_next_determinism_with_flat_map(depth: usize, fan_out: usize, find: bool) {
    let mut rng = ChaCha8Rng::seed_from_u64(42);
    let tree = Node::build_tree(depth, fan_out, &mut rng);

    let filter = move |x: &u64| match find {
        true => *x > 99 * RANGE.end / 100,
        false => *x > RANGE.end + 1,
    };

    let xap = Id::<&Node>::new()
        .flat_map(|x| (0..10).map(|i| x.value + i))
        .filter(filter);
    let mut runner = default_runner();
    let params = Params::default();

    let expected = next(&mut runner, params, [&tree], xap, |x| &x.children);

    for _ in 0..1000 {
        let result = next(&mut runner, params, [&tree], xap, |x| &x.children);
        assert_eq!(expected, result);
    }
}