more_itertools/augmenting/
ncycles.rs

1use 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}