loopable 0.1.0

Demo upload: do not use this crate
Documentation

//pub mod gen_range;

use std::ops::AddAssign;

// define trait as combintion of other traits
//  so don't need to list all when using it
pub trait Rangeable: AddAssign + PartialOrd + Copy {}

// specify that this new 'trait' is implemented for 
//  any type supporting the required traits
impl<T: AddAssign + PartialOrd + Copy> Rangeable for T{}


pub struct GenRangeIterator<T> {
    curr: T,
    stop: T,
    step: T,
}


impl<T: Rangeable> GenRangeIterator<T> {
    pub fn new(start: T, stop: T, step: T) -> Self {
        GenRangeIterator {
            curr: start,
            stop,
            step,
        }
    }
}


impl<T: Rangeable> Iterator for GenRangeIterator<T> {
    type Item = T;

    // next - includes start, excludes stop end point
    fn next(&mut self) -> Option<Self::Item> {
        if self.curr >= self.stop {
            return None;
        }
        let res = self.curr;

        self.curr += self.step;
        Some(res)
    }


}


#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_works() {
        assert_eq!(2 + 2, 4);
    }

    #[test]
    fn iter_test() {
        let my_iter = GenRangeIterator::new(2.0, 12.0, 2.0);

        let mut sum = 0.0;
        for s in my_iter {
            println!("s, sum = {}, {}", s, sum);
            sum += s;
        }
        assert_eq!(sum, 30.0, "Test 1");
        
    }

    // Test for Combinators
    #[test]
    fn filter() {
        // apply filter to only get even values
        //   filter creates a new iterator in lazy way 
        let v: i32 = GenRangeIterator::new(3, 13, 3)
                  .filter(|x| x % 2 == 0).sum();
        
        
        assert_eq!(v, 6+12, "Test 1");
          

    }
}