more_itertools/combining/
interleave_longest.rs1use 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) => { 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 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 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}