anode 0.1.0

Concurrency library for Rust.
Documentation
use std::ops::Range;
use crate::inf_iterator::RangeCycle;
use super::{BoundedIterator, InfIterator, IntoInfIterator};

pub struct RangeInfIterator {
    range: Range<usize>,
    pos: usize
}

impl InfIterator for RangeInfIterator {
    type Item = usize;

    fn next(&mut self) -> Self::Item {
        let val = self.range.start + self.pos;

        let m = self.range.end - self.range.start - 1;
        if self.pos < m {
            self.pos += 1;
        } else {
            self.pos = 0;
        }

        val
    }
}

impl IntoInfIterator for Range<u64> {
    type Item = u64;
    type IntoInfIter = RangeCycle<u64>;

    fn into_inf_iter(self) -> Self::IntoInfIter {
        RangeCycle::new(self)
    }
}

#[test]
fn mod_cycle_inf() {
    let range = 5..6;
    let mut range_it = range.into_inf_iter();
    assert_eq!(5, range_it.next());
    assert_eq!(5, range_it.next());
    assert_eq!(5, range_it.next());

    let range = 5..7;
    let mut range_it = range.into_inf_iter();
    assert_eq!(5, range_it.next());
    assert_eq!(6, range_it.next());
    assert_eq!(5, range_it.next());
    assert_eq!(6, range_it.next());

    let range = u64::MAX-3..u64::MAX;
    let mut range_it = range.into_inf_iter();
    assert_eq!(u64::MAX - 3, range_it.next());
    assert_eq!(u64::MAX - 2, range_it.next());
    assert_eq!(u64::MAX - 1, range_it.next());
    assert_eq!(u64::MAX - 3, range_it.next());
}

#[test]
fn mod_cycle_bounded() {
    let range = 5..6;
    let mut range_it: BoundedIterator<_> = range.into_inf_iter().into();
    assert_eq!(Some(5), range_it.next());
    assert_eq!(Some(5), range_it.next());
    assert_eq!(Some(5), range_it.next());

    let range = 5..7;
    let mut range_it: BoundedIterator<_> = range.into_inf_iter().into();
    assert_eq!(Some(5), range_it.next());
    assert_eq!(Some(6), range_it.next());
    assert_eq!(Some(5), range_it.next());
    assert_eq!(Some(6), range_it.next());
}