// // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. // use filter::Filter; pub struct FilteredIterator(F, I) where F: Filter, I: Iterator; impl Iterator for FilteredIterator where F: Filter, I: Iterator { type Item = T; fn next(&mut self) -> Option { while let Some(next) = self.1.next() { if self.0.filter(&next) { return Some(next); } } None } } pub trait FilterWith> : Iterator + Sized { fn filter_with(self, f: F) -> FilteredIterator; } impl> FilterWith for I where I: Iterator { fn filter_with(self, f: F) -> FilteredIterator { FilteredIterator(f, self) } } pub struct FilterOksIter(I, F) where F: Filter, I: Iterator>; impl Iterator for FilterOksIter where F: Filter, I: Iterator> { type Item = Result; fn next(&mut self) -> Option { while let Some(next) = self.0.next() { match next { Err(e) => return Some(Err(e)), Ok(t) => if self.1.filter(&t) { return Some(Ok(t)); } } } None } } pub trait FilterOks : Iterator> where I: Iterator>, F: Filter { fn filter_oks(self, F) -> FilterOksIter; } impl FilterOks for I where I: Iterator>, F: Filter { fn filter_oks(self, f: F) -> FilterOksIter { FilterOksIter(self, f) } } pub struct FilterErrIter(I, F) where F: Filter, I: Iterator>; impl Iterator for FilterErrIter where F: Filter, I: Iterator> { type Item = Result; fn next(&mut self) -> Option { while let Some(next) = self.0.next() { match next { Ok(t) => return Some(Ok(t)), Err(e) => if self.1.filter(&e) { return Some(Err(e)); } } } None } } pub trait FilterErr : Iterator> where I: Iterator>, F: Filter { fn filter_errs(self, F) -> FilterErrIter; } impl FilterErr for I where I: Iterator>, F: Filter { fn filter_errs(self, f: F) -> FilterErrIter { FilterErrIter(self, f) } } #[cfg(test)] mod test { use super::*; #[test] fn test_filter_with() { struct Foo; impl Filter for Foo { fn filter(&self, u: &u64) -> bool { *u > 5 } } let foo = Foo; let v : Vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 0] .into_iter() .filter_with(foo) .collect(); assert_eq!(v, vec![6, 7, 8, 9]); } #[test] fn test_filter_oks() { struct Foo; impl Filter for Foo { fn filter(&self, u: &u64) -> bool { *u > 5 } } let foo = Foo; let v : Vec> = vec![Ok(1), Err(2), Ok(3), Err(4), Ok(5), Err(6), Ok(7), Err(8), Ok(9), Err(0)] .into_iter() .filter_oks(foo) .collect(); assert_eq!(v, vec![Err(2), Err(4), Err(6), Ok(7), Err(8), Ok(9), Err(0)]); } #[test] fn test_filter_errs() { struct Foo; impl Filter for Foo { fn filter(&self, u: &u64) -> bool { *u > 5 } } let foo = Foo; let v : Vec> = vec![Ok(1), Err(2), Ok(3), Err(4), Ok(5), Err(6), Ok(7), Err(8), Ok(9), Err(0)] .into_iter() .filter_errs(foo) .collect(); assert_eq!(v, vec![Ok(1), Ok(3), Ok(5), Err(6), Ok(7), Err(8), Ok(9)]); } }