Skip to content

Commit 4db8332

Browse files
committed
Have only one try_fold recursive call per side
Reduces the risk of binary bloat, and makes the code more similar to nth.
1 parent 4a9edce commit 4db8332

File tree

1 file changed

+24
-20
lines changed

1 file changed

+24
-20
lines changed

src/libcore/iter/mod.rs

+24-20
Original file line numberDiff line numberDiff line change
@@ -780,21 +780,23 @@ impl<A, B> Iterator for Chain<A, B> where
780780
fn try_fold<Acc, F, R>(&mut self, init: Acc, mut f: F) -> R where
781781
Self: Sized, F: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
782782
{
783+
let mut accum = init;
783784
match self.state {
784-
ChainState::Front => {
785-
self.a.try_fold(init, f)
786-
}
787-
ChainState::Both => {
788-
let mut accum = init;
785+
ChainState::Both | ChainState::Front => {
789786
accum = self.a.try_fold(accum, &mut f)?;
790-
self.state = ChainState::Back;
791-
accum = self.b.try_fold(accum, &mut f)?;
792-
Try::from_ok(accum)
787+
if let ChainState::Both = self.state {
788+
self.state = ChainState::Back;
789+
}
793790
}
794-
ChainState::Back => {
795-
self.b.try_fold(init, f)
791+
_ => { }
792+
}
793+
match self.state {
794+
ChainState::Both | ChainState::Back => {
795+
accum = self.b.try_fold(accum, &mut f)?;
796796
}
797+
_ => { }
797798
}
799+
Try::from_ok(accum)
798800
}
799801

800802
fn fold<Acc, F>(self, init: Acc, mut f: F) -> Acc
@@ -909,21 +911,23 @@ impl<A, B> DoubleEndedIterator for Chain<A, B> where
909911
fn try_rfold<Acc, F, R>(&mut self, init: Acc, mut f: F) -> R where
910912
Self: Sized, F: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
911913
{
914+
let mut accum = init;
912915
match self.state {
913-
ChainState::Back => {
914-
self.b.try_rfold(init, f)
915-
}
916-
ChainState::Both => {
917-
let mut accum = init;
916+
ChainState::Both | ChainState::Back => {
918917
accum = self.b.try_rfold(accum, &mut f)?;
919-
self.state = ChainState::Front;
920-
accum = self.a.try_rfold(accum, &mut f)?;
921-
Try::from_ok(accum)
918+
if let ChainState::Both = self.state {
919+
self.state = ChainState::Front;
920+
}
922921
}
923-
ChainState::Front => {
924-
self.a.try_rfold(init, f)
922+
_ => { }
923+
}
924+
match self.state {
925+
ChainState::Both | ChainState::Front => {
926+
accum = self.a.try_rfold(accum, &mut f)?;
925927
}
928+
_ => { }
926929
}
930+
Try::from_ok(accum)
927931
}
928932

929933
fn rfold<Acc, F>(self, init: Acc, mut f: F) -> Acc

0 commit comments

Comments
 (0)