slice-utils 2.2.1

A collection of slice utils, like itertools.
Documentation
use crate::{Slice, SliceBorrowed, SliceOwned};

#[test]
fn debug_impl() {
    assert_eq!(
        format!(
            "{:?} {:?}",
            SliceOwned::map([1, 2, 3], |x| x * x),
            [1, 2, 3].cycle()
        ),
        "[1, 4, 9] [1, 2, 3, ...]"
    );
}

#[test]
fn mutability() {
    let mut slice = [1, 2, 3];
    let mut cycle = (&mut slice).cycle();
    cycle[2] = 0;

    assert_eq!(slice, [1, 2, 0]);
}

#[test]
#[should_panic = "index out of bounds: the len is 4 but the index is 4"]
fn index() {
    let mut slice = [1, 2, 3].cycle();
    assert_eq!(slice[3], 1);
    slice[7] = 4;
    assert_eq!(slice[7], 4);

    let slice = [1, 2, 3, 4].slice(..).unwrap();
    let _ = slice[4];
}

#[test]
fn slices() {
    fn foo<S: SliceBorrowed<Output = i32>>(s: S) {
        assert_eq!(s.get(0), Some(&1));
    }

    fn bar<S: SliceOwned<Output = i32>>(s: S) {
        assert_eq!(s.cycle().get_owned(4), Some(2));
    }

    #[allow(clippy::needless_borrows_for_generic_args)]
    {
        foo([1, 2, 3]);
        bar([1, 2, 3]);
    }

    assert_eq!((&[1, 2, 3]).rev().get(0), Some(&3));
}

#[test]
fn ranges() {
    let range = 1..5;
    assert_eq!(range.get_owned(0), Some(1));
    assert_eq!(range.get_owned(3), Some(4));
    assert_eq!(range.get_owned(4), None);
    assert_eq!(Slice::rev(range).get_owned(0), Some(4));
}