more_itertools/augmenting/
ncycles.rs1use crate::sequence::Sequence;
2
3
4pub struct Ncycles<T> {
5 seq: Box<dyn Sequence<T>>,
6 n: usize,
7 cur: usize,
8 loop_cnt: usize
9}
10
11impl <T> Iterator for Ncycles<T>
12where
13T: Clone
14{
15 type Item = T;
16
17 fn next(&mut self) -> Option<Self::Item> {
18 if self.seq.len() == 0 || self.cur >= self.seq.len() {
19 return None;
20 }
21
22 if self.loop_cnt >= self.n {
23 return None;
24 }
25
26 let ret = self.seq.get(self.cur).unwrap().clone();
27
28 self.cur += 1;
29
30 if self.cur >= self.seq.len() {
31 self.cur = 0;
32 self.loop_cnt += 1;
33 }
34
35 return Some(ret);
36 }
37}
38
39pub fn ncycles<T>(seq: Box<dyn Sequence<T>>, n: usize) -> Box<dyn Iterator<Item = T>>
40where T: Clone + 'static
41{
42 return Box::new(Ncycles {
43 seq,
44 n,
45 cur:0,
46 loop_cnt: 0
47 });
48}
49
50#[cfg(test)]
51mod tests {
52 use crate::sequence::create_seq_from_vec;
53
54 use super::*;
55
56 #[test]
57 fn test1() {
58 let v = vec!['A', 'B'];
59 let nc = ncycles(create_seq_from_vec(v), 3);
60 assert_eq!(vec!['A', 'B', 'A', 'B', 'A', 'B'], nc.collect::<Vec<_>>());
61
62 let v = Vec::<char>::new();
63 let nc = ncycles(create_seq_from_vec(v), 3);
64 assert_eq!(Vec::<char>::new(), nc.collect::<Vec<_>>());
65 }
66}