orx-iterable 1.3.0

Defines and implements Iterable, Collection and CollectionMut traits to represent types that can be iterated over multiple times.
Documentation
mod common_testers;
use common_testers::{test_it, test_it_val};
mod custom_iterables;
use std::collections::{BTreeSet, HashSet, LinkedList, VecDeque};

#[test]
fn std_collections() {
    let values = || vec![1, 3, 7];

    test_it(values(), &[1, 3, 7]);
    test_it(values(), &vec![1, 3, 7]);
    test_it(values(), &VecDeque::from_iter([1, 3, 7].into_iter()));
    test_it(values(), &LinkedList::from_iter([1, 3, 7].into_iter()));
    test_it(values(), &HashSet::<_>::from_iter([1, 3, 7].into_iter()));
    test_it(values(), &BTreeSet::<_>::from_iter([1, 3, 7].into_iter()));

    test_it(vec![10], &Some(10));
    test_it(vec![], &None);

    test_it(vec![10], &Result::<_, String>::Ok(10));
    test_it(vec![], &Result::<_, String>::Err("error".to_string()));
}

#[test]
fn custom_collection() {
    let col = custom_iterables::EvensThenOdds {
        evens: vec![4, 12, 8, 2],
        odds: vec![1, 7],
    };

    test_it(vec![4, 12, 8, 2, 1, 7], &col);
}

#[test]
fn slice() {
    let vec = vec![1, 3, 7, 8];
    let slice = vec.as_slice();
    test_it(vec![1, 3, 7, 8], slice);
}

#[test]
fn range() {
    test_it_val(vec![1, 2, 3, 4], 1..5usize);
}

// obj

#[cfg(feature = "std")]
#[test]
fn obj_std_collections() {
    use common_testers::obj_test_it;

    let values = || vec![1, 3, 7];

    obj_test_it(values(), &&[1, 3, 7]);
    obj_test_it(values(), &&vec![1, 3, 7]);
    obj_test_it(values(), &&VecDeque::from_iter([1, 3, 7].into_iter()));
    obj_test_it(values(), &&LinkedList::from_iter([1, 3, 7].into_iter()));
    obj_test_it(values(), &&HashSet::<_>::from_iter([1, 3, 7].into_iter()));
    obj_test_it(values(), &&BTreeSet::<_>::from_iter([1, 3, 7].into_iter()));

    obj_test_it(vec![10], &&Some(10));
    obj_test_it(vec![], &&None);

    obj_test_it(vec![10], &&Result::<_, String>::Ok(10));
    obj_test_it(vec![], &&Result::<_, String>::Err("error".to_string()));
}

#[cfg(feature = "std")]
#[test]
fn obj_custom_collection() {
    use common_testers::obj_test_it;

    let col = custom_iterables::EvensThenOdds {
        evens: vec![4, 12, 8, 2],
        odds: vec![1, 7],
    };

    obj_test_it(vec![4, 12, 8, 2, 1, 7], &&col);
}

#[cfg(feature = "std")]
#[test]
fn obj_slice() {
    use common_testers::obj_test_it;

    let vec = vec![1, 3, 7, 8];
    let slice = vec.as_slice();
    obj_test_it(vec![1, 3, 7, 8], &slice);
}

#[cfg(feature = "std")]
#[test]
fn obj_range() {
    use common_testers::obj_test_it_val;

    obj_test_it_val(vec![1, 2, 3, 4], &(1..5usize));
}