d2_iterators/
lib.rs

1
2mod gen_range;
3
4mod combi;
5
6pub struct RangeIterator {
7    curr: i32,
8    stop: i32,
9    step: i32,
10}
11
12impl RangeIterator {
13    pub fn new(start: i32, stop: i32, step: i32) -> Self {
14        RangeIterator {
15            curr: start,
16            stop,
17            step,
18        }
19    }
20}
21
22impl Iterator for RangeIterator {
23    type Item = i32;
24
25    // next - includes start, excludes stop end point
26    fn next(&mut self) -> Option<Self::Item> {
27        if self.curr >= self.stop {
28            return None;
29        }
30        let res = self.curr;
31
32        self.curr += self.step;
33        Some(res)
34    }
35
36
37}
38
39
40
41
42#[cfg(test)]
43mod tests {
44    use super::RangeIterator;
45
46    use itertools::Itertools;
47
48
49
50    #[test]
51    fn it_works() {
52        assert_eq!(2 + 2, 4);
53    }
54
55    #[test]
56    fn iter_test() {
57        let my_iter = RangeIterator::new(2, 12, 2);
58
59        let mut sum = 0;
60        for s in my_iter {
61            println!("s, sum = {}, {}", s, sum);
62            sum += s;
63        }
64        assert_eq!(sum, 30, "Test 1");
65        
66    }
67
68    #[test]
69    fn tup_test() {
70        let mut v = Vec::new();
71        for (a, b) in (1..5).tuples() {
72            v.push((a, b));
73        }
74        assert_eq!(v, vec![(1, 2), (3, 4)]);
75        
76    
77let mut it = (1..7).tuples();
78assert_eq!(Some((1, 2, 3)), it.next());
79assert_eq!(Some((4, 5, 6)), it.next());
80assert_eq!(None, it.next());
81
82// this requires a type hint
83let it = (1..7).tuples::<(_, _, _)>();
84itertools::assert_equal(it, vec![(1, 2, 3), (4, 5, 6)]);
85
86// you can also specify the complete type
87use itertools::Tuples;
88use std::ops::Range;
89
90let it: Tuples<Range<u32>, (u32, u32, u32)> = (1..7).tuples();
91itertools::assert_equal(it, vec![(1, 2, 3), (4, 5, 6)]);
92    }
93}