55//! mostly want to avoid dropping or improving summary performance when data
66//! points are missing as that's misleading and noisy, and this works well for
77//! that.
8+ //!
9+ //! As an example:
10+ //! Given a series with some missing data `[1, 2, ?, 4]`,
11+ //! this iterator yields `[1, 2, 2, 4]`.
812
913use crate :: db:: Point ;
1014
15+ /// Whether a point has been interpolated or not
1116#[ derive( Debug , Copy , Clone , PartialEq , Eq , Hash ) ]
12- pub enum Interpolated {
17+ pub enum IsInterpolated {
1318 No ,
1419 Yes ,
1520}
1621
17- impl Interpolated {
18- pub fn is_interpolated ( self ) -> bool {
19- self == Interpolated :: Yes
22+ impl IsInterpolated {
23+ pub fn as_bool ( self ) -> bool {
24+ self == IsInterpolated :: Yes
2025 }
2126}
2227
23- impl < P > Point for ( P , Interpolated )
28+ impl < P > Point for ( P , IsInterpolated )
2429where
2530 P : Point ,
2631{
@@ -39,21 +44,23 @@ where
3944 self . 0 . set_value ( value)
4045 }
4146 fn interpolated ( & self ) -> bool {
42- self . 1 . is_interpolated ( )
47+ self . 1 . as_bool ( )
4348 }
4449 fn set_interpolated ( & mut self ) {
45- self . 1 = Interpolated :: Yes ;
50+ self . 1 = IsInterpolated :: Yes ;
4651 }
4752}
4853
54+ /// The interpolated iterator
4955pub struct Interpolate < I >
5056where
5157 I : Iterator ,
5258{
59+ /// The base iterator we're interpolating
5360 iterator : I ,
61+ /// The last seen point which will be used for interpolation
5462 last_seen : Option < f64 > ,
55-
56- // When we need to seek forward at the start, we store things in here.
63+ /// When we need to seek forward at the start, we store things in here.
5764 consumed : Vec < I :: Item > ,
5865}
5966
@@ -76,15 +83,15 @@ where
7683 I : Iterator ,
7784 I :: Item : Point ,
7885{
79- type Item = ( I :: Item , Interpolated ) ;
86+ type Item = ( I :: Item , IsInterpolated ) ;
8087
8188 fn next ( & mut self ) -> Option < Self :: Item > {
8289 if let Some ( mut item) = self . consumed . pop ( ) {
8390 item. set_value ( self . last_seen . unwrap ( ) ) ;
8491 let interpolation = if self . consumed . is_empty ( ) {
85- Interpolated :: No
92+ IsInterpolated :: No
8693 } else {
87- Interpolated :: Yes
94+ IsInterpolated :: Yes
8895 } ;
8996 return Some ( ( item, interpolation) ) ;
9097 }
@@ -94,12 +101,12 @@ where
94101 match item. value ( ) {
95102 Some ( pt) => {
96103 self . last_seen = Some ( pt) ;
97- return Some ( ( item, Interpolated :: No ) ) ;
104+ return Some ( ( item, IsInterpolated :: No ) ) ;
98105 }
99106 None => {
100107 if let Some ( last) = self . last_seen {
101108 item. set_value ( last) ;
102- return Some ( ( item, Interpolated :: Yes ) ) ;
109+ return Some ( ( item, IsInterpolated :: Yes ) ) ;
103110 }
104111
105112 self . consumed . push ( item) ;
@@ -122,7 +129,7 @@ where
122129
123130 let mut item = self . consumed . pop ( ) . unwrap ( ) ;
124131 item. set_value ( self . last_seen . unwrap ( ) ) ;
125- return Some ( ( item, Interpolated :: Yes ) ) ;
132+ return Some ( ( item, IsInterpolated :: Yes ) ) ;
126133 }
127134 }
128135 }
@@ -139,15 +146,15 @@ where
139146
140147#[ cfg( test) ]
141148mod tests {
142- use super :: { Interpolate , Interpolated } ;
149+ use super :: { Interpolate , IsInterpolated } ;
143150
144151 #[ test]
145152 fn test_no_interpolation ( ) {
146153 let v = vec ! [ ( "a" , 1.0 ) , ( "b" , 2.0 ) ] ;
147154 let mut iter = Interpolate :: new ( v. into_iter ( ) ) ;
148155
149- assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "a" , 1.0 ) , Interpolated :: No ) ) ;
150- assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "b" , 2.0 ) , Interpolated :: No ) ) ;
156+ assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "a" , 1.0 ) , IsInterpolated :: No ) ) ;
157+ assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "b" , 2.0 ) , IsInterpolated :: No ) ) ;
151158 assert ! ( iter. next( ) . is_none( ) ) ;
152159 }
153160
@@ -156,10 +163,16 @@ mod tests {
156163 let v = vec ! [ ( "a" , None ) , ( "b" , None ) , ( "c" , Some ( 3.0 ) ) , ( "d" , Some ( 4.0 ) ) ] ;
157164 let mut iter = Interpolate :: new ( v. into_iter ( ) ) ;
158165
159- assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "a" , Some ( 3.0 ) ) , Interpolated :: Yes ) ) ;
160- assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "b" , Some ( 3.0 ) ) , Interpolated :: Yes ) ) ;
161- assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "c" , Some ( 3.0 ) ) , Interpolated :: No ) ) ;
162- assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "d" , Some ( 4.0 ) ) , Interpolated :: No ) ) ;
166+ assert_eq ! (
167+ iter. next( ) . unwrap( ) ,
168+ ( ( "a" , Some ( 3.0 ) ) , IsInterpolated :: Yes )
169+ ) ;
170+ assert_eq ! (
171+ iter. next( ) . unwrap( ) ,
172+ ( ( "b" , Some ( 3.0 ) ) , IsInterpolated :: Yes )
173+ ) ;
174+ assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "c" , Some ( 3.0 ) ) , IsInterpolated :: No ) ) ;
175+ assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "d" , Some ( 4.0 ) ) , IsInterpolated :: No ) ) ;
163176 assert ! ( iter. next( ) . is_none( ) ) ;
164177 }
165178
@@ -175,12 +188,18 @@ mod tests {
175188 ] ;
176189 let mut iter = Interpolate :: new ( v. into_iter ( ) ) ;
177190
178- assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "a" , Some ( 1.0 ) ) , Interpolated :: No ) ) ;
179- assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "b" , Some ( 2.0 ) ) , Interpolated :: No ) ) ;
180- assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "c" , Some ( 2.0 ) ) , Interpolated :: Yes ) ) ;
181- assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "d" , Some ( 2.0 ) ) , Interpolated :: Yes ) ) ;
182- assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "e" , Some ( 5.0 ) ) , Interpolated :: No ) ) ;
183- assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "f" , Some ( 6.0 ) ) , Interpolated :: No ) ) ;
191+ assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "a" , Some ( 1.0 ) ) , IsInterpolated :: No ) ) ;
192+ assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "b" , Some ( 2.0 ) ) , IsInterpolated :: No ) ) ;
193+ assert_eq ! (
194+ iter. next( ) . unwrap( ) ,
195+ ( ( "c" , Some ( 2.0 ) ) , IsInterpolated :: Yes )
196+ ) ;
197+ assert_eq ! (
198+ iter. next( ) . unwrap( ) ,
199+ ( ( "d" , Some ( 2.0 ) ) , IsInterpolated :: Yes )
200+ ) ;
201+ assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "e" , Some ( 5.0 ) ) , IsInterpolated :: No ) ) ;
202+ assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "f" , Some ( 6.0 ) ) , IsInterpolated :: No ) ) ;
184203 assert ! ( iter. next( ) . is_none( ) ) ;
185204 }
186205
@@ -189,10 +208,16 @@ mod tests {
189208 let v = vec ! [ ( "a" , Some ( 1.0 ) ) , ( "b" , Some ( 2.0 ) ) , ( "c" , None ) , ( "d" , None ) ] ;
190209 let mut iter = Interpolate :: new ( v. into_iter ( ) ) ;
191210
192- assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "a" , Some ( 1.0 ) ) , Interpolated :: No ) ) ;
193- assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "b" , Some ( 2.0 ) ) , Interpolated :: No ) ) ;
194- assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "c" , Some ( 2.0 ) ) , Interpolated :: Yes ) ) ;
195- assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "d" , Some ( 2.0 ) ) , Interpolated :: Yes ) ) ;
211+ assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "a" , Some ( 1.0 ) ) , IsInterpolated :: No ) ) ;
212+ assert_eq ! ( iter. next( ) . unwrap( ) , ( ( "b" , Some ( 2.0 ) ) , IsInterpolated :: No ) ) ;
213+ assert_eq ! (
214+ iter. next( ) . unwrap( ) ,
215+ ( ( "c" , Some ( 2.0 ) ) , IsInterpolated :: Yes )
216+ ) ;
217+ assert_eq ! (
218+ iter. next( ) . unwrap( ) ,
219+ ( ( "d" , Some ( 2.0 ) ) , IsInterpolated :: Yes )
220+ ) ;
196221 assert ! ( iter. next( ) . is_none( ) ) ;
197222 }
198223}
0 commit comments