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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
use crate::common::*; #[derive(Debug)] pub struct TryFlatten<I, J> { pub(super) iter: Option<I>, pub(super) sub_iter: Option<J>, } impl<I, J, T, U, E> Iterator for TryFlatten<I, J> where I: Iterator<Item = Result<T, E>>, J: Iterator<Item = U>, T: IntoIterator<Item = U, IntoIter = J>, { 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 mut sub_iter = match self.sub_iter.take() { Some(sub_iter) => sub_iter, None => { let item = match iter.next() { Some(Ok(item)) => item, Some(Err(err)) => { return Some(Err(err)); } None => { return None; } }; item.into_iter() } }; loop { match sub_iter.next() { Some(item) => { self.iter = Some(iter); self.sub_iter = Some(sub_iter); return Some(Ok(item)); } None => { let item = match iter.next() { Some(Ok(item)) => item, Some(Err(err)) => { return Some(Err(err)); } None => { return None; } }; sub_iter = item.into_iter(); } } } } }