Skip to content

Commit 8178ce3

Browse files
committed
Specialize Chain's folds
1 parent 8e7b44a commit 8178ce3

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

src/lib.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,24 @@ where
602602
BothBackward | Back => self.b.get(),
603603
}
604604
}
605+
606+
#[inline]
607+
fn fold<Acc, F>(self, init: Acc, mut f: F) -> Acc
608+
where
609+
Self: Sized,
610+
F: FnMut(Acc, &Self::Item) -> Acc,
611+
{
612+
let mut accum = init;
613+
match self.state {
614+
ChainState::Back => {}
615+
_ => accum = self.a.fold(accum, &mut f),
616+
}
617+
match self.state {
618+
ChainState::Front => {}
619+
_ => accum = self.b.fold(accum, &mut f),
620+
}
621+
accum
622+
}
605623
}
606624

607625
impl<A, B> DoubleEndedStreamingIterator for Chain<A, B>
@@ -626,6 +644,24 @@ where
626644
Back => self.b.advance_back(),
627645
}
628646
}
647+
648+
#[inline]
649+
fn rfold<Acc, F>(self, init: Acc, mut f: F) -> Acc
650+
where
651+
Self: Sized,
652+
F: FnMut(Acc, &Self::Item) -> Acc,
653+
{
654+
let mut accum = init;
655+
match self.state {
656+
ChainState::Front => {}
657+
_ => accum = self.b.rfold(accum, &mut f),
658+
}
659+
match self.state {
660+
ChainState::Back => {}
661+
_ => accum = self.a.rfold(accum, &mut f),
662+
}
663+
accum
664+
}
629665
}
630666

631667
/// A normal, non-streaming, iterator which converts the elements of a streaming iterator into owned

0 commit comments

Comments
 (0)