more_itertools/augmenting/
count_cycle.rs1use 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}