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
use crate::common::*; #[derive(Debug)] pub struct TryFilter<I, F> { pub(super) iter: Option<I>, pub(super) f: F, } impl<I, T, E, F> Iterator for TryFilter<I, F> where I: Iterator<Item = Result<T, E>>, F: FnMut(&T) -> Result<bool, E>, { type Item = Result<T, E>; fn next(&mut self) -> Option<Self::Item> { let mut iter = match self.iter.take() { Some(iter) => iter, None => return None, }; loop { 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(true) => { self.iter = Some(iter); return Some(Ok(input_item)); } Ok(false) => {} Err(err) => { return Some(Err(err)); } } } } }