1use crate::common::*;
2
3#[derive(Debug)]
4pub struct AndThen<I, F> {
5 pub(super) iter: Option<I>,
6 pub(super) f: F,
7}
8
9impl<I, F, T, U, E> Iterator for AndThen<I, F>
10where
11 I: Iterator<Item = Result<T, E>>,
12 F: FnMut(T) -> Result<U, E>,
13{
14 type Item = Result<U, E>;
15
16 fn next(&mut self) -> Option<Self::Item> {
17 let mut iter = match self.iter.take() {
18 Some(iter) => iter,
19 None => return None,
20 };
21 let input_item = match iter.next() {
22 Some(Ok(item)) => item,
23 Some(Err(err)) => {
24 return Some(Err(err));
25 }
26 None => return None,
27 };
28
29 match (self.f)(input_item) {
30 Ok(output_item) => {
31 self.iter = Some(iter);
32 Some(Ok(output_item))
33 }
34 Err(err) => Some(Err(err)),
35 }
36 }
37}