more_itertools/windowing/
sliding_window.rs1use 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}