more_itertools/windowing/
sliding_window.rs

1use std::fmt::Debug;
2
3use super::windowed::windowed;
4use crate::error::Error;
5
6pub struct SlidingWindow<T>
7where 
8T: Clone + Debug + 'static
9{
10    iter: Box<dyn Iterator<Item=Result<Vec<T>, Error>>>
11}
12
13impl<T> Iterator for SlidingWindow<T> 
14where 
15T: Clone + Debug + 'static
16{
17    type Item = Result<Vec<T>, Error>;
18
19    fn next(&mut self) -> Option<Self::Item> {
20        return self.iter.next();
21    }
22}
23
24pub fn sliding_windowed<T>(iter: Box<dyn Iterator<Item=Result<T,Error>>>, n: usize) -> Box<dyn Iterator<Item=Result<Vec<T>, Error>>> 
25where
26T: Clone + Debug + 'static
27{
28    let ret = windowed(iter, n, 1);
29
30    return ret;
31}
32
33
34#[cfg(test)]
35mod tests {
36
37    use crate::utils::generate_okok_iterator;
38
39    use super::*;
40
41    #[test]
42    fn test1() {
43        let v = vec![0,1,2,3,4,5];
44
45        let mut w = sliding_windowed(generate_okok_iterator(v), 4);
46        match w.next().unwrap() {
47            Ok(v) => { assert_eq!(vec![0,1,2,3], v); }
48            Err(_) => { assert!(false); }
49        }
50        match w.next().unwrap() {
51            Ok(v) => { assert_eq!(vec![1,2,3,4], v); }
52            Err(_) => { assert!(false); }
53        }
54        match w.next().unwrap() {
55            Ok(v) => { assert_eq!(vec![2,3,4,5], v); }
56            Err(_) => { assert!(false); }
57        }
58        match w.next() {
59            Some(_) => { assert!(false); }
60            None => { assert!(true); }
61        }
62    }
63
64    #[test]
65    fn test2() {
66        let v = vec![0,1,2];
67        let mut w = sliding_windowed(generate_okok_iterator(v), 4);
68        match w.next() {
69            Some(_) => { assert!(false); }
70            None => { assert!(true); }
71        }
72    }
73}