Skip to content

Commit ad5cc96

Browse files
XeniraPhilippe-Cholet
authored andcommitted
feat(FilterMapOk): implement DoubleEndedIterator
Refs: #947
1 parent 23bf81a commit ad5cc96

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

benches/specializations.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,7 @@ bench_specializations! {
648648
v.iter().copied().filter_ok(|x| x % 3 == 0)
649649
}
650650
filter_map_ok {
651+
DoubleEndedIterator
651652
{
652653
let v = black_box((0_u32..1024)
653654
.map(|x| if x % 2 == 1 { Err(x) } else { Ok(x) })

src/adaptors/mod.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,6 +1041,30 @@ where
10411041
}
10421042
}
10431043

1044+
impl<I, F, T, U, E> DoubleEndedIterator for FilterMapOk<I, F>
1045+
where
1046+
I: DoubleEndedIterator<Item = Result<T, E>>,
1047+
F: FnMut(T) -> Option<U>,
1048+
{
1049+
fn next_back(&mut self) -> Option<Self::Item> {
1050+
let f = &mut self.f;
1051+
self.iter.by_ref().rev().find_map(|res| match res {
1052+
Ok(t) => f(t).map(Ok),
1053+
Err(e) => Some(Err(e)),
1054+
})
1055+
}
1056+
1057+
fn rfold<Acc, Fold>(self, init: Acc, fold_f: Fold) -> Acc
1058+
where
1059+
Fold: FnMut(Acc, Self::Item) -> Acc,
1060+
{
1061+
let mut f = self.f;
1062+
self.iter
1063+
.filter_map(|v| transpose_result(v.map(&mut f)))
1064+
.rfold(init, fold_f)
1065+
}
1066+
}
1067+
10441068
impl<I, F, T, U, E> FusedIterator for FilterMapOk<I, F>
10451069
where
10461070
I: FusedIterator<Item = Result<T, E>>,

tests/specializations.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,9 @@ quickcheck! {
453453
}
454454

455455
fn filter_map_ok(v: Vec<Result<u8, char>>) -> () {
456-
test_specializations(&v.into_iter().filter_map_ok(|i| if i < 20 { Some(i * 2) } else { None }));
456+
let it = v.into_iter().filter_map_ok(|i| if i < 20 { Some(i * 2) } else { None });
457+
test_specializations(&it);
458+
test_double_ended_specializations(&it);
457459
}
458460

459461
// `SmallIter2<u8>` because `Vec<u8>` is too slow and we get bad coverage from a singleton like Option<u8>

0 commit comments

Comments
 (0)