more_itertools/combining/
interleave_longest.rs

1use std::collections::VecDeque;
2
3use crate::error::Error;
4
5
6pub struct InterleaveLongest<T> {
7    buf: VecDeque<T>,
8    buf2: VecDeque<Option<T>>,
9    iter_vec: Vec<Box<dyn Iterator<Item = Result<T,Error>>>>,
10    iter_finished: bool,
11    fillnone: bool,
12    fillvalue: Option<T>
13}
14
15impl<T> Iterator for InterleaveLongest<T> 
16where
17T: Clone
18{
19    type Item = Result<T,Error>;
20
21    fn next(&mut self) -> Option<Self::Item> {
22        loop {
23            if self.iter_finished {
24                return None;
25            }
26
27            if self.buf.len() > 0 {
28                let ret = self.buf.pop_front().unwrap();
29                return Some(Ok(ret));
30            }
31
32            assert_eq!(0, self.buf2.len());
33
34            for i in self.iter_vec.iter_mut() {
35                match i.next() {
36                    None => {
37                        self.buf2.push_back(None);
38                    },
39                    Some(v) => {
40                        match v {
41                            Ok(ok_v) => {
42                                self.buf2.push_back(Some(ok_v));
43                            },
44                            Err(err_v) => { // upstream error
45                                self.iter_finished = true;
46                                return Some(Err(err_v));
47                            }
48                        } 
49                    }
50                }
51            }
52
53            if self.buf2.iter().all(|x| match x {
54                None => { return true; },
55                Some(_) => { return false; }
56            }) {
57                self.iter_finished = true;
58            } else {
59                while self.buf2.len() > 0 {
60                    match self.buf2.pop_front() {
61                        None => {
62                            
63                        },
64                        Some(v) => {
65                            if !v.is_none() {
66                                self.buf.push_back(v.unwrap());
67                            } else {
68                                if self.fillnone {
69                                    self.buf.push_back(self.fillvalue.as_ref().unwrap().clone());
70                                }
71                            }
72                        }
73                    }
74                }
75            }
76        }   
77    }
78}
79
80pub fn interleave_longest<T>(iter_vec: Vec<Box<dyn Iterator<Item = Result<T,Error>>>>, fillvalue: Option<T>) -> Box<dyn Iterator<Item = Result<T,Error>>> 
81where T: Clone + 'static
82{
83    let fillnone;
84    match fillvalue {
85        None => { fillnone = false },
86        Some(_) => { fillnone = true }
87    }
88
89    Box::new(InterleaveLongest {
90        buf: VecDeque::new(),
91        buf2: VecDeque::new(),
92        iter_vec,
93        iter_finished: false,
94        fillnone: fillnone,
95        fillvalue
96    })
97}
98
99#[cfg(test)]
100mod tests {
101    use crate::{error, utils::{extract_value_from_result_vec, generate_okok_iterator, generate_okokerr_iterator}};
102
103    use super::*;
104
105    #[test]
106    fn test1() {
107        let mut v = Vec::new();
108        v.push(generate_okok_iterator(vec![1,2,3]));
109        v.push(generate_okok_iterator(vec![4,5]));
110        v.push(generate_okok_iterator(vec![6,7,8]));
111
112        let ret = interleave_longest(v, None).collect::<Vec<_>>();
113        assert_eq!(vec![1, 4, 6, 2, 5, 7, 3, 8], extract_value_from_result_vec(ret).0);
114        //println!("{:?}", ret);
115
116
117        let mut v = Vec::new();
118        v.push(generate_okok_iterator(vec![1,2,3]));
119        v.push(generate_okok_iterator(vec![4,5]));
120        v.push(generate_okok_iterator(vec![6,7,8]));
121
122        let ret = interleave_longest(v, Some(0)).collect::<Vec<_>>();
123        assert_eq!(vec![1, 4, 6, 2, 5, 7, 3, 0, 8], extract_value_from_result_vec(ret).0);
124        //println!("{:?}", ret);
125
126        let mut v = Vec::new();
127        v.push(generate_okok_iterator(vec![1,2,3]));
128        v.push(generate_okokerr_iterator(vec![4,5], error::overflow_error("[test]".to_string())));
129        v.push(generate_okok_iterator(vec![6,7,8]));
130
131        let ret = interleave_longest(v, None).collect::<Vec<_>>();
132        let ret1 = extract_value_from_result_vec(ret);
133        assert_eq!(vec![1, 4, 6, 2, 5, 7], ret1.0);
134        assert_eq!(error::Kind::OverflowError, ret1.1.unwrap().kind());
135    }
136}