more_itertools/augmenting/
count_cycle.rs

1use crate::sequence::{create_seq_from_iterator, Sequence};
2
3pub struct CountCycle<T> 
4where
5T: Clone
6{
7    seq: Box<dyn Sequence<T>>,
8    n: usize,
9    cur_num: usize,
10    cur_iter_idx: usize
11}
12
13impl<T> Iterator for CountCycle<T>
14where 
15T: Clone
16{
17    type Item = (usize, T);
18
19    fn next(&mut self) -> Option<Self::Item> {
20        if self.seq.len() == 0 {
21            return None;
22        }
23
24        if self.cur_num == self.n {
25            return None;
26        }
27
28        if self.cur_iter_idx == self.seq.len() {
29            self.cur_num += 1;
30            self.cur_iter_idx = 0;
31        }
32
33        if self.cur_num == self.n {
34            return None;
35        }
36
37        let ret = (self.cur_num, self.seq.get(self.cur_iter_idx).unwrap().clone());
38        self.cur_iter_idx += 1;
39
40        return Some(ret);
41    }
42}
43
44pub fn count_cycle<T: 'static>(iter: Box<dyn Iterator<Item=T>>, n: usize) -> Box<dyn Iterator<Item=(usize,T)>> 
45where
46T: Clone
47{
48    let cc = CountCycle {
49        seq: create_seq_from_iterator(iter),
50        n: n,
51        cur_num: 0,
52        cur_iter_idx: 0
53    };
54
55    return Box::new(cc);
56}
57
58#[cfg(test)]
59mod tests {
60    use crate::itertools::iter::iter_from_vec;
61
62    use super::*;
63
64    #[test]
65    fn test1() {
66        let v = vec!['A', 'B'];
67        let mut cc = count_cycle(iter_from_vec(v), 3);
68
69        assert_eq!(Some((0, 'A')), cc.next());
70        assert_eq!(Some((0, 'B')), cc.next());
71        assert_eq!(Some((1, 'A')), cc.next());
72        assert_eq!(Some((1, 'B')), cc.next());
73        assert_eq!(Some((2, 'A')), cc.next());
74        assert_eq!(Some((2, 'B')), cc.next());
75        assert_eq!(None, cc.next());
76        assert_eq!(None, cc.next());
77
78
79        let v = Vec::<char>::new();
80        let mut cc = count_cycle(iter_from_vec(v), 3);
81        assert_eq!(None, cc.next());
82    }
83}