@@ -1552,7 +1552,10 @@ impl<I> Iterator for Skip<I> where I: Iterator {
1552
1552
let ( lower, upper) = self . iter . size_hint ( ) ;
1553
1553
1554
1554
let lower = lower. saturating_sub ( self . n ) ;
1555
- let upper = upper. map ( |x| x. saturating_sub ( self . n ) ) ;
1555
+ let upper = match upper {
1556
+ Some ( x) => Some ( x. saturating_sub ( self . n ) ) ,
1557
+ None => None ,
1558
+ } ;
1556
1559
1557
1560
( lower, upper)
1558
1561
}
@@ -1613,19 +1616,26 @@ impl<I> DoubleEndedIterator for Skip<I> where I: DoubleEndedIterator + ExactSize
1613
1616
}
1614
1617
}
1615
1618
1616
- fn try_rfold < Acc , Fold , R > ( & mut self , init : Acc , mut fold : Fold ) -> R where
1619
+ fn try_rfold < Acc , Fold , R > ( & mut self , init : Acc , fold : Fold ) -> R where
1617
1620
Self : Sized , Fold : FnMut ( Acc , Self :: Item ) -> R , R : Try < Ok =Acc >
1618
1621
{
1619
- let mut n = self . len ( ) ;
1620
- if n == 0 {
1621
- Try :: from_ok ( init )
1622
- } else {
1623
- self . iter . try_rfold ( init , move |acc, x| {
1622
+ fn check < T , Acc , R : Try < Ok = Acc > > (
1623
+ mut n : usize ,
1624
+ mut fold : impl FnMut ( Acc , T ) -> R ,
1625
+ ) -> impl FnMut ( Acc , T ) -> LoopState < Acc , R > {
1626
+ move |acc, x| {
1624
1627
n -= 1 ;
1625
1628
let r = fold ( acc, x) ;
1626
1629
if n == 0 { LoopState :: Break ( r) }
1627
1630
else { LoopState :: from_try ( r) }
1628
- } ) . into_try ( )
1631
+ }
1632
+ }
1633
+
1634
+ let n = self . len ( ) ;
1635
+ if n == 0 {
1636
+ Try :: from_ok ( init)
1637
+ } else {
1638
+ self . iter . try_rfold ( init, check ( n, fold) ) . into_try ( )
1629
1639
}
1630
1640
}
1631
1641
}
0 commit comments