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