From 75f5df2e6b28263389e23d2384ae3b0eddad0882 Mon Sep 17 00:00:00 2001 From: Alexander Hirsch Date: Fri, 13 Mar 2020 17:00:23 +0100 Subject: [PATCH] Refactor FilterResults and FilterMapResults Also remove calls to Result::transpose() to stay compatible to Rust 1.24. --- src/adaptors/mod.rs | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/adaptors/mod.rs b/src/adaptors/mod.rs index b5dc6d86c..27a1cda41 100644 --- a/src/adaptors/mod.rs +++ b/src/adaptors/mod.rs @@ -1161,24 +1161,20 @@ impl Iterator for FilterResults self.iter.size_hint() } - fn fold(self, init: Acc, mut fold_f: Fold) -> Acc + fn fold(self, init: Acc, fold_f: Fold) -> Acc where Fold: FnMut(Acc, Self::Item) -> Acc, { let mut f = self.f; - self.iter.fold(init, move |acc, v| { - if v.as_ref().map(&mut f).unwrap_or(true) { - fold_f(acc, v) - } else { - acc - } - }) + self.iter.filter(|v| { + v.as_ref().map(&mut f).unwrap_or(true) + }).fold(init, fold_f) } fn collect(self) -> C where C: FromIterator { let mut f = self.f; - self.iter.filter(move |v| { + self.iter.filter(|v| { v.as_ref().map(&mut f).unwrap_or(true) }).collect() } @@ -1193,6 +1189,14 @@ pub struct FilterMapResults { f: F } +fn transpose_result(result: Result, E>) -> Option> { + match result { + Ok(Some(v)) => Some(Ok(v)), + Ok(None) => None, + Err(e) => Some(Err(e)), + } +} + /// Create a new `FilterResults` iterator. pub fn filter_map_results(iter: I, f: F) -> FilterMapResults where I: Iterator>, @@ -1228,24 +1232,22 @@ impl Iterator for FilterMapResults (0, self.iter.size_hint().1) } - fn fold(self, init: Acc, mut fold_f: Fold) -> Acc + fn fold(self, init: Acc, fold_f: Fold) -> Acc where Fold: FnMut(Acc, Self::Item) -> Acc, { let mut f = self.f; - self.iter.fold(init, move |acc, v| { - if let Some(v) = v.map(&mut f).transpose() { - fold_f(acc, v) - } else { - acc - } - }) + self.iter.filter_map(|v| { + transpose_result(v.map(&mut f)) + }).fold(init, fold_f) } fn collect(self) -> C where C: FromIterator { let mut f = self.f; - self.iter.filter_map(move |v| v.map(&mut f).transpose()).collect() + self.iter.filter_map(|v| { + transpose_result(v.map(&mut f)) + }).collect() } }