@@ -1423,14 +1423,13 @@ impl<I: Iterator, P> Iterator for TakeWhile<I, P>
1423
1423
if self . flag {
1424
1424
None
1425
1425
} else {
1426
- self . iter . next ( ) . and_then ( |x| {
1427
- if ( self . predicate ) ( & x) {
1428
- Some ( x)
1429
- } else {
1430
- self . flag = true ;
1431
- None
1432
- }
1433
- } )
1426
+ let x = self . iter . next ( ) ?;
1427
+ if ( self . predicate ) ( & x) {
1428
+ Some ( x)
1429
+ } else {
1430
+ self . flag = true ;
1431
+ None
1432
+ }
1434
1433
}
1435
1434
}
1436
1435
@@ -1445,22 +1444,30 @@ impl<I: Iterator, P> Iterator for TakeWhile<I, P>
1445
1444
}
1446
1445
1447
1446
#[ inline]
1448
- fn try_fold < Acc , Fold , R > ( & mut self , init : Acc , mut fold : Fold ) -> R where
1447
+ fn try_fold < Acc , Fold , R > ( & mut self , init : Acc , fold : Fold ) -> R where
1449
1448
Self : Sized , Fold : FnMut ( Acc , Self :: Item ) -> R , R : Try < Ok =Acc >
1450
1449
{
1451
- if self . flag {
1452
- Try :: from_ok ( init )
1453
- } else {
1454
- let flag = & mut self . flag ;
1455
- let p = & mut self . predicate ;
1456
- self . iter . try_fold ( init , move |acc, x|{
1450
+ fn check < ' a , T , Acc , R : Try < Ok = Acc > > (
1451
+ flag : & ' a mut bool ,
1452
+ p : & ' a mut impl FnMut ( & T ) -> bool ,
1453
+ mut fold : impl FnMut ( Acc , T ) -> R + ' a ,
1454
+ ) -> impl FnMut ( Acc , T ) -> LoopState < Acc , R > + ' a {
1455
+ move |acc, x| {
1457
1456
if p ( & x) {
1458
1457
LoopState :: from_try ( fold ( acc, x) )
1459
1458
} else {
1460
1459
* flag = true ;
1461
1460
LoopState :: Break ( Try :: from_ok ( acc) )
1462
1461
}
1463
- } ) . into_try ( )
1462
+ }
1463
+ }
1464
+
1465
+ if self . flag {
1466
+ Try :: from_ok ( init)
1467
+ } else {
1468
+ let flag = & mut self . flag ;
1469
+ let p = & mut self . predicate ;
1470
+ self . iter . try_fold ( init, check ( flag, p, fold) ) . into_try ( )
1464
1471
}
1465
1472
}
1466
1473
}
0 commit comments