@@ -521,26 +521,23 @@ impl Store {
521
521
522
522
let ( mut i1, mut i2) = ( intervals1. iter ( ) , intervals2. iter ( ) ) ;
523
523
let ( mut iv1, mut iv2) = ( i1. next ( ) , i2. next ( ) ) ;
524
- loop {
525
- if let ( Some ( v1) , Some ( v2) ) = ( iv1, iv2) {
524
+
525
+ // Iterate over both iterators.
526
+ while let ( Some ( v1) , Some ( v2) ) = ( iv1, iv2) {
527
+ if v2. start <= v1. end && v1. start <= v2. end {
526
528
let start = cmp:: max ( v1. start , v2. start ) ;
527
529
let end = cmp:: min ( v1. end , v2. end ) ;
528
530
let iv = Interval :: new ( start, end) ;
529
- if iv. run_len ( ) > 0 {
530
- merged. push ( iv) ;
531
- }
531
+ merged. push ( iv) ;
532
532
}
533
533
534
- // Iterate over two iterators, consuming the lowest first, like merge join.
535
- match ( iv1, iv2) {
536
- ( None , None ) => break ,
537
- ( Some ( v1) , None ) => iv1 = i1. next ( ) ,
538
- ( None , Some ( v2) ) => iv2 = i2. next ( ) ,
539
- ( Some ( v1) , Some ( v2) ) => match v1. start . cmp ( & v2. start ) {
540
- Equal => { iv1 = i1. next ( ) ; iv2 = i2. next ( ) ; } ,
541
- Less => iv1 = i1. next ( ) ,
542
- Greater => iv2 = i2. next ( ) ,
543
- } ,
534
+ if v1. end < v2. end {
535
+ iv1 = i1. next ( ) ;
536
+ } else if v1. end > v2. end {
537
+ iv2 = i2. next ( ) ;
538
+ } else {
539
+ iv1 = i1. next ( ) ;
540
+ iv2 = i2. next ( ) ;
544
541
}
545
542
}
546
543
0 commit comments