iterator_ext/
try_flatten.rs1use crate::common::*;
2
3#[derive(Debug)]
4pub struct TryFlatten<I, J> {
5 pub(super) iter: Option<I>,
6 pub(super) sub_iter: Option<J>,
7}
8
9impl<I, J, T, U, E> Iterator for TryFlatten<I, J>
10where
11 I: Iterator<Item = Result<T, E>>,
12 J: Iterator<Item = U>,
13 T: IntoIterator<Item = U, IntoIter = J>,
14{
15 type Item = Result<U, E>;
16
17 fn next(&mut self) -> Option<Self::Item> {
18 let mut iter = match self.iter.take() {
19 Some(iter) => iter,
20 None => return None,
21 };
22
23 let mut sub_iter = match self.sub_iter.take() {
24 Some(sub_iter) => sub_iter,
25 None => {
26 let item = match iter.next() {
27 Some(Ok(item)) => item,
28 Some(Err(err)) => {
29 return Some(Err(err));
30 }
31 None => {
32 return None;
33 }
34 };
35 item.into_iter()
36 }
37 };
38
39 loop {
40 match sub_iter.next() {
41 Some(item) => {
42 self.iter = Some(iter);
43 self.sub_iter = Some(sub_iter);
44 return Some(Ok(item));
45 }
46 None => {
47 let item = match iter.next() {
48 Some(Ok(item)) => item,
49 Some(Err(err)) => {
50 return Some(Err(err));
51 }
52 None => {
53 return None;
54 }
55 };
56 sub_iter = item.into_iter();
57 }
58 }
59 }
60 }
61}