File tree 1 file changed +47
-0
lines changed
1 file changed +47
-0
lines changed Original file line number Diff line number Diff line change @@ -256,6 +256,53 @@ where
256
256
}
257
257
}
258
258
259
+ fn fold < B , G > ( mut self , init : B , mut f : G ) -> B
260
+ where
261
+ Self : Sized ,
262
+ G : FnMut ( B , Self :: Item ) -> B ,
263
+ {
264
+ let mut acc = init;
265
+ let mut left = self . left . next ( ) ;
266
+ let mut right = self . right . next ( ) ;
267
+
268
+ loop {
269
+ match ( left, right) {
270
+ ( Some ( l) , Some ( r) ) => match self . cmp_fn . merge ( l, r) {
271
+ ( None , Some ( r) , x) => {
272
+ acc = f ( acc, x) ;
273
+ left = self . left . next ( ) ;
274
+ right = Some ( r) ;
275
+ }
276
+ ( Some ( l) , _, x) => {
277
+ acc = f ( acc, x) ;
278
+ left = Some ( l) ;
279
+ right = self . right . next ( ) ;
280
+ }
281
+ ( _, _, x) => {
282
+ acc = f ( acc, x) ;
283
+ left = self . left . next ( ) ;
284
+ right = self . right . next ( ) ;
285
+ }
286
+ } ,
287
+ ( Some ( l) , None ) => {
288
+ self . left . put_back ( l) ;
289
+ acc = self . left . fold ( acc, |acc, x| f ( acc, F :: left ( x) ) ) ;
290
+ break ;
291
+ }
292
+ ( None , Some ( r) ) => {
293
+ self . right . put_back ( r) ;
294
+ acc = self . right . fold ( acc, |acc, x| f ( acc, F :: right ( x) ) ) ;
295
+ break ;
296
+ }
297
+ ( None , None ) => {
298
+ break ;
299
+ }
300
+ }
301
+ }
302
+
303
+ acc
304
+ }
305
+
259
306
fn size_hint ( & self ) -> SizeHint {
260
307
F :: size_hint ( self . left . size_hint ( ) , self . right . size_hint ( ) )
261
308
}
You can’t perform that action at this time.
0 commit comments