diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2020-02-22 10:09:03 +0100 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2020-02-22 10:16:14 +0100 |
commit | f63ec2d057b720c41e2e4508c24dcd1ad918581d (patch) | |
tree | 9bc6b501129d64fca79ccf13940c4285782cc070 | |
parent | ceb954e835c699255bfabe15a086865bfc4d5d97 (diff) |
fixup! WIP: Add Skip extension where predicate can failskip
-rw-r--r-- | src/skip.rs | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/skip.rs b/src/skip.rs index 04eb16c..6c13d5d 100644 --- a/src/skip.rs +++ b/src/skip.rs @@ -5,7 +5,7 @@ // -pub trait SkipWhileMap<O, E>: Sized { +pub trait SkipWhileMap<O, E>: Iterator<Item = Result<O, E>> + Sized { /// Skip Elements while Ok(true) is returned. /// @@ -16,6 +16,21 @@ pub trait SkipWhileMap<O, E>: Sized { F: FnMut(&O) -> Result<bool, E>; } +impl<O, E, I> SkipWhileMap<O, E> for I + where I: Iterator<Item = Result<O, E>> + Sized +{ + + fn skip_while_map<F>(self, f: F) -> SkipWhileMapOk<Self, F, O, E> + where + F: FnMut(&O) -> Result<bool, E> + { + SkipWhileMapOk { + iter: self, + func: f, + } + } +} + #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pub struct SkipWhileMapOk<I, F, O, E> where @@ -30,7 +45,7 @@ pub struct SkipWhileMapOk<I, F, O, E> impl<I, O, E, F> Iterator for SkipWhileMapOk<I, F, O, E> where I: Iterator<Item = Result<O, E>>, - F: FnMut(O) -> Result<bool, E>, + F: FnMut(&O) -> Result<bool, E>, { type Item = Result<O, E>; @@ -38,7 +53,7 @@ where loop { match self.iter.next() { Some(Ok(x)) => { - match (self.func)(x) { + match (self.func)(&x) { Ok(true) => return Some(Ok(x)), Ok(false) => continue, Err(e) => return Some(Err(e)), |