Skip to content

Commit 23bf81a

Browse files
Xeniraphimuemue
authored andcommitted
feat(FilterOk): implement DoubleEndedIterator
Refs: #947
1 parent ac8fb03 commit 23bf81a

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
@@ -639,6 +639,7 @@ bench_specializations! {
639639
v.iter().copied().map_ok(|x| x + 1)
640640
}
641641
filter_ok {
642+
DoubleEndedIterator
642643
{
643644
let v = black_box((0_u32..1024)
644645
.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
@@ -936,6 +936,30 @@ where
936936
}
937937
}
938938

939+
impl<I, F, T, E> DoubleEndedIterator for FilterOk<I, F>
940+
where
941+
I: DoubleEndedIterator<Item = Result<T, E>>,
942+
F: FnMut(&T) -> bool,
943+
{
944+
fn next_back(&mut self) -> Option<Self::Item> {
945+
let f = &mut self.f;
946+
self.iter.rfind(|res| match res {
947+
Ok(t) => f(t),
948+
_ => true,
949+
})
950+
}
951+
952+
fn rfold<Acc, Fold>(self, init: Acc, fold_f: Fold) -> Acc
953+
where
954+
Fold: FnMut(Acc, Self::Item) -> Acc,
955+
{
956+
let mut f = self.f;
957+
self.iter
958+
.filter(|v| v.as_ref().map(&mut f).unwrap_or(true))
959+
.rfold(init, fold_f)
960+
}
961+
}
962+
939963
impl<I, F, T, E> FusedIterator for FilterOk<I, F>
940964
where
941965
I: FusedIterator<Item = Result<T, E>>,

tests/specializations.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,9 @@ quickcheck! {
447447
}
448448

449449
fn filter_ok(v: Vec<Result<u8, char>>) -> () {
450-
test_specializations(&v.into_iter().filter_ok(|&i| i < 20));
450+
let it = v.into_iter().filter_ok(|&i| i < 20);
451+
test_specializations(&it);
452+
test_double_ended_specializations(&it);
451453
}
452454

453455
fn filter_map_ok(v: Vec<Result<u8, char>>) -> () {

0 commit comments

Comments
 (0)