iterator_ext/
and_then.rs

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}