d2_iterators/
gen_range.rs1use 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}