orx-parallel 4.0.0

Performant parallel computations with an expressive iterator API.
Documentation
use crate::IntoParIter;
use crate::infallible::xap_variants::Id;
use crate::infallible::{Xap, XapIter};
use alloc::vec::Vec;

#[test]
fn xap_iter_matches_one_to_one_flat_map() {
    let xap = Id::<usize>::new();

    let values: Vec<_> = XapIter::new(0..4, xap).collect();
    let expected: Vec<_> = (0..4).flat_map(|x| xap.xap(x)).collect();

    assert_eq!(values, expected);

    let values: Vec<_> = (0..4).into_par().into_iter().collect();
    assert_eq!(values, expected);
}

#[test]
fn xap_iter_matches_zero_or_one_flat_map() {
    let xap = Id::<usize>::new().filter_map(|x| (x % 2 == 0).then_some(x + 10));

    let values: Vec<_> = XapIter::new(0..5, xap).collect();
    let expected: Vec<_> = (0..5).flat_map(|x| xap.xap(x)).collect();

    assert_eq!(values, expected);
}

#[test]
fn xap_iter_matches_many_flat_map() {
    let xap = Id::<usize>::new().flat_map(|x| [x, x + 10]);

    let values: Vec<_> = XapIter::new(0..4, xap).collect();
    let expected: Vec<_> = (0..4).flat_map(|x| xap.xap(x)).collect();

    assert_eq!(values, expected);
}