Skip to content

Commit 20abbbc

Browse files
committed
Refactor FilterResults and FilterMapResults
Also remove calls to Result::transpose() to stay compatible to Rust 1.24.
1 parent 3014ebf commit 20abbbc

File tree

1 file changed

+20
-18
lines changed

1 file changed

+20
-18
lines changed

src/adaptors/mod.rs

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,24 +1169,20 @@ impl<I, F, T, E> Iterator for FilterResults<I, F>
11691169
(0, self.iter.size_hint().1)
11701170
}
11711171

1172-
fn fold<Acc, Fold>(self, init: Acc, mut fold_f: Fold) -> Acc
1172+
fn fold<Acc, Fold>(self, init: Acc, fold_f: Fold) -> Acc
11731173
where Fold: FnMut(Acc, Self::Item) -> Acc,
11741174
{
11751175
let mut f = self.f;
1176-
self.iter.fold(init, move |acc, v| {
1177-
if v.as_ref().map(&mut f).unwrap_or(true) {
1178-
fold_f(acc, v)
1179-
} else {
1180-
acc
1181-
}
1182-
})
1176+
self.iter.filter(|v| {
1177+
v.as_ref().map(&mut f).unwrap_or(true)
1178+
}).fold(init, fold_f)
11831179
}
11841180

11851181
fn collect<C>(self) -> C
11861182
where C: FromIterator<Self::Item>
11871183
{
11881184
let mut f = self.f;
1189-
self.iter.filter(move |v| {
1185+
self.iter.filter(|v| {
11901186
v.as_ref().map(&mut f).unwrap_or(true)
11911187
}).collect()
11921188
}
@@ -1202,6 +1198,14 @@ pub struct FilterMapResults<I, F> {
12021198
f: F
12031199
}
12041200

1201+
fn transpose_result<T, E>(result: Result<Option<T>, E>) -> Option<Result<T, E>> {
1202+
match result {
1203+
Ok(Some(v)) => Some(Ok(v)),
1204+
Ok(None) => None,
1205+
Err(e) => Some(Err(e)),
1206+
}
1207+
}
1208+
12051209
/// Create a new `FilterResults` iterator.
12061210
pub fn filter_map_results<I, F, T, U, E>(iter: I, f: F) -> FilterMapResults<I, F>
12071211
where I: Iterator<Item = Result<T, E>>,
@@ -1237,24 +1241,22 @@ impl<I, F, T, U, E> Iterator for FilterMapResults<I, F>
12371241
(0, self.iter.size_hint().1)
12381242
}
12391243

1240-
fn fold<Acc, Fold>(self, init: Acc, mut fold_f: Fold) -> Acc
1244+
fn fold<Acc, Fold>(self, init: Acc, fold_f: Fold) -> Acc
12411245
where Fold: FnMut(Acc, Self::Item) -> Acc,
12421246
{
12431247
let mut f = self.f;
1244-
self.iter.fold(init, move |acc, v| {
1245-
if let Some(v) = v.map(&mut f).transpose() {
1246-
fold_f(acc, v)
1247-
} else {
1248-
acc
1249-
}
1250-
})
1248+
self.iter.filter_map(|v| {
1249+
transpose_result(v.map(&mut f))
1250+
}).fold(init, fold_f)
12511251
}
12521252

12531253
fn collect<C>(self) -> C
12541254
where C: FromIterator<Self::Item>
12551255
{
12561256
let mut f = self.f;
1257-
self.iter.filter_map(move |v| v.map(&mut f).transpose()).collect()
1257+
self.iter.filter_map(|v| {
1258+
transpose_result(v.map(&mut f))
1259+
}).collect()
12581260
}
12591261
}
12601262

0 commit comments

Comments
 (0)