@@ -103,14 +103,26 @@ impl Interval {
103103 }
104104 pub fn intersection ( self , other : Interval ) -> Self {
105105 Self {
106- start : Timestamp ( self . start . 0 . max ( other. start . 0 ) ) ,
107- stop : Timestamp ( self . stop . 0 . min ( other. stop . 0 ) ) ,
106+ start : self . start . max ( other. start ) ,
107+ stop : self . stop . min ( other. stop ) ,
108108 }
109109 }
110110 pub fn union ( self , other : Interval ) -> Self {
111111 Self {
112- start : Timestamp ( self . start . 0 . min ( other. start . 0 ) ) ,
113- stop : Timestamp ( self . stop . 0 . max ( other. stop . 0 ) ) ,
112+ start : self . start . min ( other. start ) ,
113+ stop : self . stop . max ( other. stop ) ,
114+ }
115+ }
116+ pub fn subtract_before ( self , point : Timestamp ) -> Self {
117+ Self {
118+ start : self . start . max ( point) ,
119+ stop : self . stop . max ( point) ,
120+ }
121+ }
122+ pub fn subtract_after ( self , point : Timestamp ) -> Self {
123+ Self {
124+ start : self . start . min ( point) ,
125+ stop : self . stop . min ( point) ,
114126 }
115127 }
116128 // Convert a timestamp into [0,1] relative space
@@ -488,6 +500,46 @@ mod tests {
488500 assert_eq ! ( i1. union ( i0) , Interval :: new( Timestamp ( 0 ) , Timestamp ( 15 ) ) ) ;
489501 }
490502
503+ #[ test]
504+ fn test_subtract_before ( ) {
505+ let p0 = Timestamp ( 0 ) ;
506+ let p1 = Timestamp ( 10 ) ;
507+ let p2 = Timestamp ( 20 ) ;
508+ let i0 = Interval :: new ( Timestamp ( 5 ) , Timestamp ( 15 ) ) ;
509+ assert_eq ! (
510+ i0. subtract_before( p0) ,
511+ Interval :: new( Timestamp ( 5 ) , Timestamp ( 15 ) )
512+ ) ;
513+ assert_eq ! (
514+ i0. subtract_before( p1) ,
515+ Interval :: new( Timestamp ( 10 ) , Timestamp ( 15 ) )
516+ ) ;
517+ assert_eq ! (
518+ i0. subtract_before( p2) ,
519+ Interval :: new( Timestamp ( 20 ) , Timestamp ( 20 ) )
520+ ) ;
521+ }
522+
523+ #[ test]
524+ fn test_subtract_after ( ) {
525+ let p0 = Timestamp ( 0 ) ;
526+ let p1 = Timestamp ( 10 ) ;
527+ let p2 = Timestamp ( 20 ) ;
528+ let i0 = Interval :: new ( Timestamp ( 5 ) , Timestamp ( 15 ) ) ;
529+ assert_eq ! (
530+ i0. subtract_after( p0) ,
531+ Interval :: new( Timestamp ( 0 ) , Timestamp ( 0 ) )
532+ ) ;
533+ assert_eq ! (
534+ i0. subtract_after( p1) ,
535+ Interval :: new( Timestamp ( 5 ) , Timestamp ( 10 ) )
536+ ) ;
537+ assert_eq ! (
538+ i0. subtract_after( p2) ,
539+ Interval :: new( Timestamp ( 5 ) , Timestamp ( 15 ) )
540+ ) ;
541+ }
542+
491543 #[ test]
492544 fn test_grow ( ) {
493545 let i0 = Interval :: new ( Timestamp ( 5 ) , Timestamp ( 10 ) ) ;
0 commit comments