d2_iterators/
gen_range.rs

1use std::ops::AddAssign;
2
3pub trait Rangeable:AddAssign+PartialOrd + Copy {}
4
5impl<T:AddAssign + PartialOrd + Copy> Rangeable for T{}
6
7
8pub struct GenRangeIterator<T:Rangeable> {
9    curr: T,
10    stop: T,
11    step: T,
12}
13
14impl<T:Rangeable> GenRangeIterator<T> {
15    pub fn new(start: T, stop: T, step: T) -> Self {
16        GenRangeIterator {
17            curr: start,
18            stop,
19            step,
20        }
21    }
22}
23
24impl <T:Rangeable> Iterator for GenRangeIterator<T> {
25    type Item = T;
26    fn next(&mut self) -> Option<Self::Item> {
27        if self.curr >= self.stop {
28            return None;
29        }
30        let res = self.curr;
31        self.curr += self.step;
32        Some(res)
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39    #[test]
40    fn gen_test1() {
41        let mut m = 0.;
42        let it = GenRangeIterator::new(5., 12., 2.5);
43        for s in it {
44            m += s;
45        }
46        assert_eq!(m, 5. + 7.5 + 10.);
47    }
48
49    #[test]
50    fn filter() {
51        let v:i32 = GenRangeIterator::new(3,13,3).filter(|x| x % 2 == 0).sum();
52        assert_eq!(v,6+12);
53    }
54}