slicetools 0.3.0

Add extra iterators to slices.
Documentation
use super::CartesianProductMut;
use ::StreamerMut;

#[test]
fn slices_when_at_least_one_is_empty() {
    let s1: &mut [i32] = &mut [];
    let s2: &mut [i32] = &mut [];

    {
        let mut it = CartesianProductMut::new(s1, s2);
        assert_eq!(it.next(), None);
    }
    
    let s1 = &mut [0];
    {    
        let mut it = CartesianProductMut::new(s1, s2);
        assert_eq!(it.next(), None);
    }

    {
        let mut it = CartesianProductMut::new(s2, s1);
        assert_eq!(it.next(), None);
    }
}

#[test]
fn slices_with_1_item_each() {
    let s1 = &mut [0];
    let s2 = &mut ['a'];
    let mut it = CartesianProductMut::new(s1, s2);

    assert_eq!(it.next(), Some((&mut 0, &mut 'a')));
    assert_eq!(it.next(), None);
}

#[test]
fn slices_when_one_have_only_1_item() {
    let s1 = &mut [0, 1, 2];
    let s2 = &mut ['a'];

    {
        let mut it = CartesianProductMut::new(s1, s2);
        assert_eq!(it.next(), Some((&mut 0, &mut 'a')));
        assert_eq!(it.next(), Some((&mut 1, &mut 'a')));
        assert_eq!(it.next(), Some((&mut 2, &mut 'a')));
        assert_eq!(it.next(), None);
    }

    {
        let mut it = CartesianProductMut::new(s2, s1);
        assert_eq!(it.next(), Some((&mut 'a', &mut 0)));
        assert_eq!(it.next(), Some((&mut 'a', &mut 1)));
        assert_eq!(it.next(), Some((&mut 'a', &mut 2)));
        assert_eq!(it.next(), None);
    }
}

#[test]
fn slices_with_multiple_items() {
    let s1 = &mut [0, 1, 2];
    let s2 = &mut ['a', 'b'];

    {
        let mut it = CartesianProductMut::new(s1, s2);
        assert_eq!(it.next(), Some((&mut 0, &mut 'a')));
        assert_eq!(it.next(), Some((&mut 0, &mut 'b')));
        assert_eq!(it.next(), Some((&mut 1, &mut 'a')));
        assert_eq!(it.next(), Some((&mut 1, &mut 'b')));
        assert_eq!(it.next(), Some((&mut 2, &mut 'a')));
        assert_eq!(it.next(), Some((&mut 2, &mut 'b')));
        assert_eq!(it.next(), None);
    }

    {
        let mut it = CartesianProductMut::new(s2, s1);
        assert_eq!(it.next(), Some((&mut 'a', &mut 0)));
        assert_eq!(it.next(), Some((&mut 'a', &mut 1)));
        assert_eq!(it.next(), Some((&mut 'a', &mut 2)));
        assert_eq!(it.next(), Some((&mut 'b', &mut 0)));
        assert_eq!(it.next(), Some((&mut 'b', &mut 1)));
        assert_eq!(it.next(), Some((&mut 'b', &mut 2)));
        assert_eq!(it.next(), None);
    }
}