@@ -649,6 +649,19 @@ impl<I> Iterator for Cycle<I> where I: Clone + Iterator {
649
649
_ => ( usize:: MAX , None )
650
650
}
651
651
}
652
+
653
+ #[ inline]
654
+ fn try_fold < Acc , F , R > ( & mut self , init : Acc , mut f : F ) -> R where
655
+ Self : Sized , F : FnMut ( Acc , Self :: Item ) -> R , R : Try < Ok =Acc >
656
+ {
657
+ let mut accum = init;
658
+ while let Some ( x) = self . iter . next ( ) {
659
+ accum = f ( accum, x) ?;
660
+ accum = self . iter . try_fold ( accum, & mut f) ?;
661
+ self . iter = self . orig . clone ( ) ;
662
+ }
663
+ Try :: from_ok ( accum)
664
+ }
652
665
}
653
666
654
667
#[ stable( feature = "fused" , since = "1.26.0" ) ]
@@ -1855,18 +1868,11 @@ impl<I: Iterator> Iterator for Peekable<I> {
1855
1868
1856
1869
#[ inline]
1857
1870
fn nth ( & mut self , n : usize ) -> Option < I :: Item > {
1858
- // FIXME(#43234): merge these when borrow-checking gets better.
1859
- if n == 0 {
1860
- match self . peeked . take ( ) {
1861
- Some ( v) => v,
1862
- None => self . iter . nth ( n) ,
1863
- }
1864
- } else {
1865
- match self . peeked . take ( ) {
1866
- Some ( None ) => None ,
1867
- Some ( Some ( _) ) => self . iter . nth ( n - 1 ) ,
1868
- None => self . iter . nth ( n) ,
1869
- }
1871
+ match self . peeked . take ( ) {
1872
+ Some ( None ) => None ,
1873
+ Some ( v @ Some ( _) ) if n == 0 => v,
1874
+ Some ( Some ( _) ) => self . iter . nth ( n - 1 ) ,
1875
+ None => self . iter . nth ( n) ,
1870
1876
}
1871
1877
}
1872
1878
@@ -1965,14 +1971,8 @@ impl<I: Iterator> Peekable<I> {
1965
1971
#[ inline]
1966
1972
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
1967
1973
pub fn peek ( & mut self ) -> Option < & I :: Item > {
1968
- if self . peeked . is_none ( ) {
1969
- self . peeked = Some ( self . iter . next ( ) ) ;
1970
- }
1971
- match self . peeked {
1972
- Some ( Some ( ref value) ) => Some ( value) ,
1973
- Some ( None ) => None ,
1974
- _ => unreachable ! ( ) ,
1975
- }
1974
+ let iter = & mut self . iter ;
1975
+ self . peeked . get_or_insert_with ( || iter. next ( ) ) . as_ref ( )
1976
1976
}
1977
1977
}
1978
1978
@@ -2109,8 +2109,12 @@ impl<I: Iterator, P> Iterator for TakeWhile<I, P>
2109
2109
2110
2110
#[ inline]
2111
2111
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
2112
- let ( _, upper) = self . iter . size_hint ( ) ;
2113
- ( 0 , upper) // can't know a lower bound, due to the predicate
2112
+ if self . flag {
2113
+ ( 0 , Some ( 0 ) )
2114
+ } else {
2115
+ let ( _, upper) = self . iter . size_hint ( ) ;
2116
+ ( 0 , upper) // can't know a lower bound, due to the predicate
2117
+ }
2114
2118
}
2115
2119
2116
2120
#[ inline]
@@ -2321,6 +2325,10 @@ impl<I> Iterator for Take<I> where I: Iterator{
2321
2325
2322
2326
#[ inline]
2323
2327
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
2328
+ if self . n == 0 {
2329
+ return ( 0 , Some ( 0 ) ) ;
2330
+ }
2331
+
2324
2332
let ( lower, upper) = self . iter . size_hint ( ) ;
2325
2333
2326
2334
let lower = cmp:: min ( lower, self . n ) ;
0 commit comments