summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2018-04-03 11:11:52 +0200
committerMatthias Beyer <mail@beyermatthias.de>2018-04-03 11:11:52 +0200
commitb6470c179c0ed4a594d72914ec4b64828a409c13 (patch)
treebb805481e321e34f1ebeb8cd3a7fcdd4184c9f0d
parent229e61681ec896ca49bed2f3cfa3be9eeb6a7793 (diff)
Add extension to filter Result<T, E> by predicate(&E)
-rw-r--r--src/iter.rs61
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)]);
+ }
}