/// Trait for only yielding the next item in the Iterator if it tests true for some predicate pub trait NextIf: Iterator + Clone { /// Yield next item if `pred` returns `true`. /// If `pred` returns `false` the Iterator is not advanced. #[must_use] fn next_if(&mut self, pred: F) -> Option where F: FnOnce(&Self::Item) -> bool, { let old = self.clone(); match self.next() { Some(item) => { if pred(&item) { Some(item) } else { *self = old; None } } None => None, } } /// Yield next item if `pred` returns `Some(T)`. /// If `pred` returns `None` the Iterator is not advanced. #[must_use] fn next_if_map(&mut self, pred: F) -> Option where F: FnOnce(Self::Item) -> Option, { let old = self.clone(); match self.next() { Some(item) => match pred(item) { None => { *self = old; None } some => some, }, None => None, } } } impl NextIf for T where T: Iterator + Clone {} pub trait AdvanceWhile: Iterator + Clone { /// Advance the iterator while `pred` returns true. fn advance_while(&mut self, mut pred: F) where F: FnMut(&Self::Item) -> bool, { loop { match self.next_if(&mut pred) { Some(_) => {} None => break, } } } } impl AdvanceWhile for T where T: Iterator + Clone {}