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