more_itertools/selecting/
tail.rs

1use std::collections::VecDeque;
2
3pub struct Tail<T>
4{
5    buf: VecDeque<T>,
6    iter: Box<dyn Iterator<Item = T>>,
7    n: usize
8}
9
10impl<T> Iterator for Tail<T> 
11{
12    type Item = T;
13
14    fn next(&mut self) -> Option<Self::Item> {
15        if self.n == 0 {
16            return None;
17        }
18        loop {
19            let nv = self.iter.next();
20            match nv {
21                None => {
22                    return self.buf.pop_front();                  
23                },
24                Some(v) => {
25                    if self.buf.len() == self.n {
26                        self.buf.pop_front();
27                    }
28                    self.buf.push_back(v);
29                }
30            }
31        }
32    }
33}
34
35pub fn tail<T>(iter: Box<dyn Iterator<Item = T>>, n: usize) -> Box<dyn Iterator<Item = T>>
36where
37T: 'static
38{
39    Box::new(Tail {
40        buf: VecDeque::new(),
41        iter,
42        n
43    })
44}
45
46#[cfg(test)]
47mod tests {
48
49    use crate::itertools::iter::iter_from_vec;
50
51    use super::*;
52
53    #[test]
54    fn test1() {
55        let v = vec![1,2,3,4,5];
56
57        let mut t = tail(iter_from_vec(v), 3);
58        assert_eq!(Some(3), t.next());
59        assert_eq!(Some(4), t.next());
60        assert_eq!(Some(5), t.next());
61        assert_eq!(None, t.next());
62
63
64        let v = vec![1,2,3,4,5];
65
66        let mut t = tail(iter_from_vec(v), 7);
67        assert_eq!(Some(1), t.next());
68        assert_eq!(Some(2), t.next());
69        assert_eq!(Some(3), t.next());
70        assert_eq!(Some(4), t.next());
71        assert_eq!(Some(5), t.next());
72        assert_eq!(None, t.next());
73    }
74}