more_itertools/selecting/
tail.rs1use 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}