diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2018-04-03 11:11:52 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2018-04-03 11:11:52 +0200 |
commit | b6470c179c0ed4a594d72914ec4b64828a409c13 (patch) | |
tree | bb805481e321e34f1ebeb8cd3a7fcdd4184c9f0d | |
parent | 229e61681ec896ca49bed2f3cfa3be9eeb6a7793 (diff) |
Add extension to filter Result<T, E> by predicate(&E)
-rw-r--r-- | src/iter.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/iter.rs b/src/iter.rs index 359625b..e5acb6e 100644 --- a/src/iter.rs +++ b/src/iter.rs @@ -80,6 +80,47 @@ impl<T, E, I, F> FilterOks<T, E, I, F> for I } } +pub struct FilterErrIter<T, E, I, F>(I, F) + where F: Filter<E>, + I: Iterator<Item = Result<T, E>>; + +impl<T, E, I, F> Iterator for FilterErrIter<T, E, I, F> + where F: Filter<E>, + I: Iterator<Item = Result<T, E>> +{ + type Item = Result<T, E>; + + fn next(&mut self) -> Option<Self::Item> { + 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<T, E, I, F> : Iterator<Item = Result<T, E>> + where I: Iterator<Item = Result<T, E>>, + F: Filter<E> +{ + fn filter_errs(self, F) -> FilterErrIter<T, E, I, F>; +} + +impl<T, E, I, F> FilterErr<T, E, I, F> for I + where I: Iterator<Item = Result<T, E>>, + F: Filter<E> +{ + fn filter_errs(self, f: F) -> FilterErrIter<T, E, I, F> { + FilterErrIter(self, f) + } +} + + #[cfg(test)] mod test { use super::*; @@ -122,5 +163,25 @@ mod test { 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<u64> for Foo { + fn filter(&self, u: &u64) -> bool { + *u > 5 + } + } + + let foo = Foo; + + let v : Vec<Result<u64, u64>> = + 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)]); + } } |