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 
5360iterator :  I , 
61+     /// The last seen point which will be used for interpolation 
5462last_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. 
5764consumed :  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