@@ -1495,14 +1495,13 @@ impl<I: Iterator, P> Iterator for TakeWhile<I, P>
14951495 if self . flag {
14961496 None
14971497 } else {
1498- self . iter . next ( ) . and_then ( |x| {
1499- if ( self . predicate ) ( & x) {
1500- Some ( x)
1501- } else {
1502- self . flag = true ;
1503- None
1504- }
1505- } )
1498+ let x = self . iter . next ( ) ?;
1499+ if ( self . predicate ) ( & x) {
1500+ Some ( x)
1501+ } else {
1502+ self . flag = true ;
1503+ None
1504+ }
15061505 }
15071506 }
15081507
@@ -1517,22 +1516,30 @@ impl<I: Iterator, P> Iterator for TakeWhile<I, P>
15171516 }
15181517
15191518 #[ inline]
1520- fn try_fold < Acc , Fold , R > ( & mut self , init : Acc , mut fold : Fold ) -> R where
1519+ fn try_fold < Acc , Fold , R > ( & mut self , init : Acc , fold : Fold ) -> R where
15211520 Self : Sized , Fold : FnMut ( Acc , Self :: Item ) -> R , R : Try < Ok =Acc >
15221521 {
1523- if self . flag {
1524- Try :: from_ok ( init )
1525- } else {
1526- let flag = & mut self . flag ;
1527- let p = & mut self . predicate ;
1528- self . iter . try_fold ( init , move |acc, x|{
1522+ fn check < ' a , T , Acc , R : Try < Ok = Acc > > (
1523+ flag : & ' a mut bool ,
1524+ p : & ' a mut impl FnMut ( & T ) -> bool ,
1525+ mut fold : impl FnMut ( Acc , T ) -> R + ' a ,
1526+ ) -> impl FnMut ( Acc , T ) -> LoopState < Acc , R > + ' a {
1527+ move |acc, x| {
15291528 if p ( & x) {
15301529 LoopState :: from_try ( fold ( acc, x) )
15311530 } else {
15321531 * flag = true ;
15331532 LoopState :: Break ( Try :: from_ok ( acc) )
15341533 }
1535- } ) . into_try ( )
1534+ }
1535+ }
1536+
1537+ if self . flag {
1538+ Try :: from_ok ( init)
1539+ } else {
1540+ let flag = & mut self . flag ;
1541+ let p = & mut self . predicate ;
1542+ self . iter . try_fold ( init, check ( flag, p, fold) ) . into_try ( )
15361543 }
15371544 }
15381545}
0 commit comments