@@ -10,7 +10,6 @@ use std::mem;
10
10
use std:: num:: One ;
11
11
#[ cfg( feature = "unstable" ) ]
12
12
use std:: ops:: Add ;
13
- use std:: cmp:: Ordering ;
14
13
use std:: iter:: { Fuse , Peekable } ;
15
14
use std:: collections:: HashSet ;
16
15
use std:: hash:: Hash ;
@@ -504,80 +503,39 @@ impl<I> ExactSizeIterator for Step<I> where
504
503
I : ExactSizeIterator ,
505
504
{ }
506
505
507
- /// An iterator adaptor that merges the two base iterators in ascending order.
508
- /// If both base iterators are sorted (ascending), the result is sorted.
509
- ///
510
- /// Iterator element type is `I::Item`.
511
- ///
512
- /// See [*.merge_by()*](trait.Itertools.html#method.merge_by) for more information.
513
- pub struct Merge < I , J , F > where
514
- I : Iterator ,
515
- J : Iterator < Item =I :: Item > ,
506
+
507
+ struct MergeCore < I , J >
508
+ where I : Iterator ,
509
+ J : Iterator < Item =I :: Item > ,
516
510
{
517
511
a : Peekable < I > ,
518
512
b : Peekable < J > ,
519
- cmp : F ,
520
513
fused : Option < bool > ,
521
514
}
522
515
523
- // default ordering function for .merge()
524
- // Note: To be replaced by unit struct
525
- #[ inline]
526
- pub fn merge_default_ordering < A : PartialOrd > ( a : & A , b : & A ) -> Ordering {
527
- if a > b {
528
- Ordering :: Greater
529
- } else {
530
- Ordering :: Less
531
- }
532
- }
533
-
534
- impl < I , J , F > Merge < I , J , F > where
535
- I : Iterator ,
536
- J : Iterator < Item =I :: Item > ,
537
- F : FnMut ( & I :: Item , & I :: Item ) -> Ordering
538
- {
539
- /// Create a `Merge` iterator.
540
- pub fn new ( a : I , b : J , cmp : F ) -> Self
541
- {
542
- Merge {
543
- a : a. peekable ( ) ,
544
- b : b. peekable ( ) ,
545
- cmp : cmp,
546
- fused : None ,
547
- }
548
- }
549
- }
550
516
551
- impl < I , J , F > Clone for Merge < I , J , F > where
517
+ impl < I , J > Clone for MergeCore < I , J > where
552
518
I : Iterator ,
553
519
J : Iterator < Item =I :: Item > ,
554
520
Peekable < I > : Clone ,
555
521
Peekable < J > : Clone ,
556
- F : Clone ,
557
522
{
558
523
fn clone ( & self ) -> Self {
559
- clone_fields ! ( Merge , self , a, b, cmp , fused)
524
+ clone_fields ! ( MergeCore , self , a, b, fused)
560
525
}
561
526
}
562
527
563
- impl < I , J , F > Iterator for Merge < I , J , F > where
564
- I : Iterator ,
565
- J : Iterator < Item =I :: Item > ,
566
- F : FnMut ( & I :: Item , & I :: Item ) -> Ordering
528
+ impl < I , J > MergeCore < I , J >
529
+ where I : Iterator ,
530
+ J : Iterator < Item =I :: Item > ,
567
531
{
568
- type Item = I :: Item ;
569
-
570
- fn next ( & mut self ) -> Option < I :: Item > {
532
+ fn next_with < F > ( & mut self , mut less_than : F ) -> Option < I :: Item >
533
+ where F : FnMut ( & I :: Item , & I :: Item ) -> bool
534
+ {
571
535
let less_than = match self . fused {
572
536
Some ( lt) => lt,
573
537
None => match ( self . a . peek ( ) , self . b . peek ( ) ) {
574
- ( Some ( a) , Some ( b) ) => {
575
- match ( self . cmp ) ( a, b) {
576
- Ordering :: Less => true ,
577
- Ordering :: Equal => true ,
578
- Ordering :: Greater => false ,
579
- }
580
- }
538
+ ( Some ( a) , Some ( b) ) => less_than ( a, b) ,
581
539
( Some ( _) , None ) => {
582
540
self . fused = Some ( true ) ;
583
541
true
@@ -603,6 +561,117 @@ impl<I, J, F> Iterator for Merge<I, J, F> where
603
561
}
604
562
}
605
563
564
+ /// An iterator adaptor that merges the two base iterators in ascending order.
565
+ /// If both base iterators are sorted (ascending), the result is sorted.
566
+ ///
567
+ /// Iterator element type is `I::Item`.
568
+ ///
569
+ /// See [*.merge()*](trait.Itertools.html#method.merge_by) for more information.
570
+ pub struct Merge < I , J > where
571
+ I : Iterator ,
572
+ J : Iterator < Item =I :: Item > ,
573
+ {
574
+ merge : MergeCore < I , J > ,
575
+ }
576
+
577
+ impl < I , J > Clone for Merge < I , J > where
578
+ I : Iterator ,
579
+ J : Iterator < Item =I :: Item > ,
580
+ Peekable < I > : Clone ,
581
+ Peekable < J > : Clone ,
582
+ {
583
+ fn clone ( & self ) -> Self {
584
+ clone_fields ! ( Merge , self , merge)
585
+ }
586
+ }
587
+
588
+ /// Create a `Merge` iterator.
589
+ pub fn merge_new < I , J > ( a : I , b : J ) -> Merge < I , J >
590
+ where I : Iterator ,
591
+ J : Iterator < Item =I :: Item > ,
592
+ {
593
+ Merge {
594
+ merge : MergeCore {
595
+ a : a. peekable ( ) ,
596
+ b : b. peekable ( ) ,
597
+ fused : None ,
598
+ }
599
+ }
600
+ }
601
+
602
+ impl < I , J > Iterator for Merge < I , J >
603
+ where I : Iterator ,
604
+ J : Iterator < Item =I :: Item > ,
605
+ I :: Item : PartialOrd ,
606
+ {
607
+ type Item = I :: Item ;
608
+
609
+ fn next ( & mut self ) -> Option < I :: Item > {
610
+ self . merge . next_with ( |a, b| a <= b)
611
+ }
612
+
613
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
614
+ self . merge . size_hint ( )
615
+ }
616
+ }
617
+
618
+ /// An iterator adaptor that merges the two base iterators in ascending order.
619
+ /// If both base iterators are sorted (ascending), the result is sorted.
620
+ ///
621
+ /// Iterator element type is `I::Item`.
622
+ ///
623
+ /// See [*.merge_by()*](trait.Itertools.html#method.merge_by) for more information.
624
+ pub struct MergeBy < I , J , F > where
625
+ I : Iterator ,
626
+ J : Iterator < Item =I :: Item > ,
627
+ {
628
+ merge : MergeCore < I , J > ,
629
+ cmp : F ,
630
+ }
631
+
632
+ /// Create a `MergeBy` iterator.
633
+ pub fn merge_by_new < I , J , F > ( a : I , b : J , cmp : F ) -> MergeBy < I , J , F >
634
+ where I : Iterator ,
635
+ J : Iterator < Item =I :: Item > ,
636
+ {
637
+ MergeBy {
638
+ merge : MergeCore {
639
+ a : a. peekable ( ) ,
640
+ b : b. peekable ( ) ,
641
+ fused : None ,
642
+ } ,
643
+ cmp : cmp,
644
+ }
645
+ }
646
+
647
+ impl < I , J , F > Clone for MergeBy < I , J , F > where
648
+ I : Iterator ,
649
+ J : Iterator < Item =I :: Item > ,
650
+ Peekable < I > : Clone ,
651
+ Peekable < J > : Clone ,
652
+ F : Clone ,
653
+ {
654
+ fn clone ( & self ) -> Self {
655
+ clone_fields ! ( MergeBy , self , merge, cmp)
656
+ }
657
+ }
658
+
659
+ impl < I , J , F > Iterator for MergeBy < I , J , F > where
660
+ I : Iterator ,
661
+ J : Iterator < Item =I :: Item > ,
662
+ F : FnMut ( & I :: Item , & I :: Item ) -> bool
663
+ {
664
+ type Item = I :: Item ;
665
+
666
+ fn next ( & mut self ) -> Option < I :: Item > {
667
+ self . merge . next_with ( & mut self . cmp )
668
+ }
669
+
670
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
671
+ self . merge . size_hint ( )
672
+ }
673
+ }
674
+
606
675
#[ cfg( feature = "unstable" ) ]
607
676
/// An iterator adaptor that enumerates the iterator elements,
608
677
/// with a custom starting value and integer type.
@@ -787,8 +856,6 @@ impl<I, F> Iterator for Coalesce<I, F> where
787
856
}
788
857
}
789
858
790
-
791
-
792
859
/// An iterator adaptor that borrows from a `Clone`-able iterator
793
860
/// to only pick off elements while the predicate returns `true`.
794
861
///
0 commit comments