summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2020-02-22 10:09:03 +0100
committerMatthias Beyer <mail@beyermatthias.de>2020-02-22 10:16:14 +0100
commitf63ec2d057b720c41e2e4508c24dcd1ad918581d (patch)
tree9bc6b501129d64fca79ccf13940c4285782cc070
parentceb954e835c699255bfabe15a086865bfc4d5d97 (diff)
fixup! WIP: Add Skip extension where predicate can failskip
-rw-r--r--src/skip.rs21
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)),