@@ -512,6 +512,9 @@ where
512
512
acc = self . iter . try_fold ( acc, & mut f) ?;
513
513
}
514
514
}
515
+
516
+ // No `fold` override, because `fold` doesn't make much sense for `Cycle`,
517
+ // and we can't do anything better than the default.
515
518
}
516
519
517
520
#[ stable( feature = "fused" , since = "1.26.0" ) ]
@@ -643,6 +646,25 @@ where
643
646
}
644
647
from_fn ( nth ( & mut self . iter , self . step ) ) . try_fold ( acc, f)
645
648
}
649
+
650
+ fn fold < Acc , F > ( mut self , mut acc : Acc , mut f : F ) -> Acc
651
+ where
652
+ F : FnMut ( Acc , Self :: Item ) -> Acc ,
653
+ {
654
+ #[ inline]
655
+ fn nth < I : Iterator > ( iter : & mut I , step : usize ) -> impl FnMut ( ) -> Option < I :: Item > + ' _ {
656
+ move || iter. nth ( step)
657
+ }
658
+
659
+ if self . first_take {
660
+ self . first_take = false ;
661
+ match self . iter . next ( ) {
662
+ None => return acc,
663
+ Some ( x) => acc = f ( acc, x) ,
664
+ }
665
+ }
666
+ from_fn ( nth ( & mut self . iter , self . step ) ) . fold ( acc, f)
667
+ }
646
668
}
647
669
648
670
impl < I > StepBy < I >
@@ -702,6 +724,29 @@ where
702
724
}
703
725
}
704
726
}
727
+
728
+ #[ inline]
729
+ fn rfold < Acc , F > ( mut self , init : Acc , mut f : F ) -> Acc
730
+ where
731
+ Self : Sized ,
732
+ F : FnMut ( Acc , Self :: Item ) -> Acc ,
733
+ {
734
+ #[ inline]
735
+ fn nth_back < I : DoubleEndedIterator > (
736
+ iter : & mut I ,
737
+ step : usize ,
738
+ ) -> impl FnMut ( ) -> Option < I :: Item > + ' _ {
739
+ move || iter. nth_back ( step)
740
+ }
741
+
742
+ match self . next_back ( ) {
743
+ None => init,
744
+ Some ( x) => {
745
+ let acc = f ( init, x) ;
746
+ from_fn ( nth_back ( & mut self . iter , self . step ) ) . fold ( acc, f)
747
+ }
748
+ }
749
+ }
705
750
}
706
751
707
752
// StepBy can only make the iterator shorter, so the len will still fit.
@@ -1767,6 +1812,20 @@ where
1767
1812
self . iter . try_fold ( init, check ( flag, p, fold) ) . into_try ( )
1768
1813
}
1769
1814
}
1815
+
1816
+ #[ inline]
1817
+ fn fold < Acc , Fold > ( mut self , init : Acc , fold : Fold ) -> Acc
1818
+ where
1819
+ Self : Sized ,
1820
+ Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
1821
+ {
1822
+ #[ inline]
1823
+ fn ok < B , T > ( mut f : impl FnMut ( B , T ) -> B ) -> impl FnMut ( B , T ) -> Result < B , !> {
1824
+ move |acc, x| Ok ( f ( acc, x) )
1825
+ }
1826
+
1827
+ self . try_fold ( init, ok ( fold) ) . unwrap ( )
1828
+ }
1770
1829
}
1771
1830
1772
1831
#[ stable( feature = "fused" , since = "1.26.0" ) ]
@@ -1838,6 +1897,20 @@ where
1838
1897
} )
1839
1898
. into_try ( )
1840
1899
}
1900
+
1901
+ #[ inline]
1902
+ fn fold < Acc , Fold > ( mut self , init : Acc , fold : Fold ) -> Acc
1903
+ where
1904
+ Self : Sized ,
1905
+ Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
1906
+ {
1907
+ #[ inline]
1908
+ fn ok < B , T > ( mut f : impl FnMut ( B , T ) -> B ) -> impl FnMut ( B , T ) -> Result < B , !> {
1909
+ move |acc, x| Ok ( f ( acc, x) )
1910
+ }
1911
+
1912
+ self . try_fold ( init, ok ( fold) ) . unwrap ( )
1913
+ }
1841
1914
}
1842
1915
1843
1916
/// An iterator that skips over `n` elements of `iter`.
@@ -2006,6 +2079,18 @@ where
2006
2079
self . iter . try_rfold ( init, check ( n, fold) ) . into_try ( )
2007
2080
}
2008
2081
}
2082
+
2083
+ fn rfold < Acc , Fold > ( mut self , init : Acc , fold : Fold ) -> Acc
2084
+ where
2085
+ Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
2086
+ {
2087
+ #[ inline]
2088
+ fn ok < Acc , T > ( mut f : impl FnMut ( Acc , T ) -> Acc ) -> impl FnMut ( Acc , T ) -> Result < Acc , !> {
2089
+ move |acc, x| Ok ( f ( acc, x) )
2090
+ }
2091
+
2092
+ self . try_rfold ( init, ok ( fold) ) . unwrap ( )
2093
+ }
2009
2094
}
2010
2095
2011
2096
#[ stable( feature = "fused" , since = "1.26.0" ) ]
@@ -2105,6 +2190,20 @@ where
2105
2190
self . iter . try_fold ( init, check ( n, fold) ) . into_try ( )
2106
2191
}
2107
2192
}
2193
+
2194
+ #[ inline]
2195
+ fn fold < Acc , Fold > ( mut self , init : Acc , fold : Fold ) -> Acc
2196
+ where
2197
+ Self : Sized ,
2198
+ Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
2199
+ {
2200
+ #[ inline]
2201
+ fn ok < B , T > ( mut f : impl FnMut ( B , T ) -> B ) -> impl FnMut ( B , T ) -> Result < B , !> {
2202
+ move |acc, x| Ok ( f ( acc, x) )
2203
+ }
2204
+
2205
+ self . try_fold ( init, ok ( fold) ) . unwrap ( )
2206
+ }
2108
2207
}
2109
2208
2110
2209
#[ stable( feature = "double_ended_take_iterator" , since = "1.38.0" ) ]
@@ -2156,6 +2255,24 @@ where
2156
2255
}
2157
2256
}
2158
2257
}
2258
+
2259
+ #[ inline]
2260
+ fn rfold < Acc , Fold > ( mut self , init : Acc , fold : Fold ) -> Acc
2261
+ where
2262
+ Self : Sized ,
2263
+ Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
2264
+ {
2265
+ if self . n == 0 {
2266
+ init
2267
+ } else {
2268
+ let len = self . iter . len ( ) ;
2269
+ if len > self . n && self . iter . nth_back ( len - self . n - 1 ) . is_none ( ) {
2270
+ init
2271
+ } else {
2272
+ self . iter . rfold ( init, fold)
2273
+ }
2274
+ }
2275
+ }
2159
2276
}
2160
2277
2161
2278
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -2237,6 +2354,20 @@ where
2237
2354
let f = & mut self . f ;
2238
2355
self . iter . try_fold ( init, scan ( state, f, fold) ) . into_try ( )
2239
2356
}
2357
+
2358
+ #[ inline]
2359
+ fn fold < Acc , Fold > ( mut self , init : Acc , fold : Fold ) -> Acc
2360
+ where
2361
+ Self : Sized ,
2362
+ Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
2363
+ {
2364
+ #[ inline]
2365
+ fn ok < B , T > ( mut f : impl FnMut ( B , T ) -> B ) -> impl FnMut ( B , T ) -> Result < B , !> {
2366
+ move |acc, x| Ok ( f ( acc, x) )
2367
+ }
2368
+
2369
+ self . try_fold ( init, ok ( fold) ) . unwrap ( )
2370
+ }
2240
2371
}
2241
2372
2242
2373
/// An iterator that calls a function with a reference to each element before
@@ -2444,4 +2575,17 @@ where
2444
2575
} )
2445
2576
. into_try ( )
2446
2577
}
2578
+
2579
+ fn fold < B , F > ( mut self , init : B , fold : F ) -> B
2580
+ where
2581
+ Self : Sized ,
2582
+ F : FnMut ( B , Self :: Item ) -> B ,
2583
+ {
2584
+ #[ inline]
2585
+ fn ok < B , T > ( mut f : impl FnMut ( B , T ) -> B ) -> impl FnMut ( B , T ) -> Result < B , !> {
2586
+ move |acc, x| Ok ( f ( acc, x) )
2587
+ }
2588
+
2589
+ self . try_fold ( init, ok ( fold) ) . unwrap ( )
2590
+ }
2447
2591
}
0 commit comments