rangetools 0.1.4

Extending the Rust Range structs found in std::ops
Documentation
use crate::{BoundedRange, LowerBound, RangeIntersection, UpperBound};

#[test]
fn next_included_included() {
    let r: BoundedRange<i32> = (0..=3).into();
    let mut it = r.into_iter();
    assert_eq!(it.next(), Some(0));
    assert_eq!(it.next(), Some(1));
    assert_eq!(it.next(), Some(2));
    assert_eq!(it.next(), Some(3));
    assert_eq!(it.next(), None);
}

#[test]
fn next_included_excluded() {
    let r: BoundedRange<i32> = (0..3).into();
    let mut it = r.into_iter();
    assert_eq!(it.next(), Some(0));
    assert_eq!(it.next(), Some(1));
    assert_eq!(it.next(), Some(2));
    assert_eq!(it.next(), None);
}

#[test]
fn next_excluded_included() {
    let r = BoundedRange::new(LowerBound::excluded(3), UpperBound::included(5));
    let mut it = r.into_iter();
    assert_eq!(it.next(), Some(4));
    assert_eq!(it.next(), Some(5));
    assert_eq!(it.next(), None);
}

#[test]
fn next_excluded_excluded() {
    let r = BoundedRange::new(LowerBound::excluded(3), UpperBound::excluded(5));
    let mut it = r.into_iter();
    assert_eq!(it.next(), Some(4));
    assert_eq!(it.next(), None);
}
#[test]
fn size_hint() {
    let r1 = BoundedRange::new(LowerBound::excluded(5), UpperBound::excluded(10));
    assert_eq!(r1.into_iter().size_hint(), (4, Some(4)));

    let r2 = BoundedRange::new(LowerBound::included(5), UpperBound::excluded(10));
    assert_eq!(r2.into_iter().size_hint(), (5, Some(5)));

    let r3 = BoundedRange::new(LowerBound::excluded(5), UpperBound::included(10));
    assert_eq!(r3.into_iter().size_hint(), (5, Some(5)));

    let r4 = BoundedRange::new(LowerBound::included(5), UpperBound::included(10));
    assert_eq!(r4.into_iter().size_hint(), (6, Some(6)));

    let r5: BoundedRange<i32> = (0..10).intersection(10..20);
    assert_eq!(r5.into_iter().size_hint(), (0, Some(0)));
}

#[test]
fn count() {
    let r1 = BoundedRange::new(LowerBound::excluded(5), UpperBound::excluded(10));
    assert_eq!(r1.into_iter().count(), 4);

    let r2 = BoundedRange::new(LowerBound::included(5), UpperBound::excluded(10));
    assert_eq!(r2.into_iter().count(), 5);

    let r3 = BoundedRange::new(LowerBound::excluded(5), UpperBound::included(10));
    assert_eq!(r3.into_iter().count(), 5);

    let r4 = BoundedRange::new(LowerBound::included(5), UpperBound::included(10));
    assert_eq!(r4.into_iter().count(), 6);

    let r5: BoundedRange<i32> = (0..10).intersection(10..20);
    assert_eq!(r5.into_iter().count(), 0);
}

#[test]
fn last() {
    let r1 = BoundedRange::new(LowerBound::excluded(5), UpperBound::excluded(10));
    assert_eq!(r1.into_iter().last(), Some(9));

    let r2 = BoundedRange::new(LowerBound::included(5), UpperBound::excluded(10));
    assert_eq!(r2.into_iter().last(), Some(9));

    let r3 = BoundedRange::new(LowerBound::excluded(5), UpperBound::included(10));
    assert_eq!(r3.into_iter().last(), Some(10));

    let r4 = BoundedRange::new(LowerBound::included(5), UpperBound::included(10));
    assert_eq!(r4.into_iter().last(), Some(10));

    let r5: BoundedRange<i32> = (0..10).intersection(10..20);
    assert_eq!(r5.into_iter().last(), None);
}

#[test]
fn nth() {
    let r1 = BoundedRange::new(LowerBound::excluded(5), UpperBound::excluded(10));
    assert_eq!(r1.into_iter().nth(1), Some(7));

    let r2 = BoundedRange::new(LowerBound::included(5), UpperBound::excluded(10));
    assert_eq!(r2.into_iter().nth(1), Some(6));

    let r3 = BoundedRange::new(LowerBound::excluded(5), UpperBound::included(10));
    assert_eq!(r3.into_iter().nth(10), None);

    let r4 = BoundedRange::new(LowerBound::included(5), UpperBound::included(10));
    assert_eq!(r4.into_iter().nth(10), None);

    let r5: BoundedRange<i32> = (0..10).intersection(10..20);
    assert_eq!(r5.into_iter().nth(0), None);
}

#[test]
fn min() {
    let r1 = BoundedRange::new(LowerBound::excluded(5), UpperBound::excluded(10));
    assert_eq!(r1.into_iter().min(), Some(6));

    let r2 = BoundedRange::new(LowerBound::included(5), UpperBound::excluded(10));
    assert_eq!(r2.into_iter().min(), Some(5));

    let r3 = BoundedRange::new(LowerBound::excluded(5), UpperBound::included(10));
    assert_eq!(r3.into_iter().min(), Some(6));

    let r4 = BoundedRange::new(LowerBound::included(5), UpperBound::included(10));
    assert_eq!(r4.into_iter().min(), Some(5));

    let r5: BoundedRange<i32> = (0..10).intersection(10..20);
    assert_eq!(r5.into_iter().min(), None);
}

#[test]
fn max() {
    let r1 = BoundedRange::new(LowerBound::excluded(5), UpperBound::excluded(10));
    assert_eq!(r1.into_iter().max(), Some(9));

    let r2 = BoundedRange::new(LowerBound::included(5), UpperBound::excluded(10));
    assert_eq!(r2.into_iter().max(), Some(9));

    let r3 = BoundedRange::new(LowerBound::excluded(5), UpperBound::included(10));
    assert_eq!(r3.into_iter().max(), Some(10));

    let r4 = BoundedRange::new(LowerBound::included(5), UpperBound::included(10));
    assert_eq!(r4.into_iter().max(), Some(10));

    let r5: BoundedRange<i32> = (0..10).intersection(10..20);
    assert_eq!(r5.into_iter().max(), None);
}

#[test]
fn next_back() {
    let r1 = BoundedRange::new(LowerBound::excluded(5), UpperBound::excluded(7));
    let mut i1 = r1.into_iter();
    assert_eq!(i1.next_back(), Some(6));
    assert_eq!(i1.next_back(), None);

    let r2 = BoundedRange::new(LowerBound::included(5), UpperBound::excluded(7));
    let mut i2 = r2.into_iter();
    assert_eq!(i2.next_back(), Some(6));
    assert_eq!(i2.next_back(), Some(5));
    assert_eq!(i2.next_back(), None);

    let r3 = BoundedRange::new(LowerBound::excluded(5), UpperBound::included(7));
    let mut i3 = r3.into_iter();
    assert_eq!(i3.next_back(), Some(7));
    assert_eq!(i3.next_back(), Some(6));
    assert_eq!(i3.next_back(), None);

    let r4 = BoundedRange::new(LowerBound::included(5), UpperBound::included(7));
    let mut i4 = r4.into_iter();
    assert_eq!(i4.next_back(), Some(7));
    assert_eq!(i4.next_back(), Some(6));
    assert_eq!(i4.next_back(), Some(5));
    assert_eq!(i4.next_back(), None);

    let r5: BoundedRange<i32> = (0..10).intersection(10..20);
    assert_eq!(r5.into_iter().next_back(), None);
}

#[test]
fn nth_back() {
    let r1 = BoundedRange::new(LowerBound::excluded(5), UpperBound::excluded(10));
    assert_eq!(r1.into_iter().nth_back(1), Some(8));

    let r2 = BoundedRange::new(LowerBound::included(5), UpperBound::excluded(10));
    assert_eq!(r2.into_iter().nth_back(2), Some(7));

    let r3 = BoundedRange::new(LowerBound::excluded(5), UpperBound::included(10));
    assert_eq!(r3.into_iter().nth_back(10), None);

    let r4 = BoundedRange::new(LowerBound::included(5), UpperBound::included(10));
    assert_eq!(r4.into_iter().nth_back(10), None);

    let r5: BoundedRange<i32> = (0..10).intersection(10..20);
    assert_eq!(r5.into_iter().nth_back(0), None);
}