3434//! assert_eq!(moving_average, 15);
3535//! ```
3636
37- use core:: panic;
38- use std:: ops:: { AddAssign , Deref , SubAssign } ;
37+ use std:: ops:: { AddAssign , Deref } ;
3938
4039macro_rules! from_size {
4140 ( $( $ty: ty) ,* ) => {
@@ -64,11 +63,6 @@ macro_rules! assign_types {
6463 }
6564 }
6665
67- impl SubAssign <$ty> for Moving <$ty> {
68- fn sub_assign( & mut self , other: $ty) {
69- self . sub( other) ;
70- }
71- }
7266 ) *
7367
7468
@@ -159,7 +153,6 @@ unsigned!(usize, u8, u16, u32, u64, u128);
159153
160154#[ derive( Debug , Default ) ]
161155pub struct Moving < T > {
162- current : f64 ,
163156 count : usize ,
164157 mean : f64 ,
165158 phantom : std:: marker:: PhantomData < T > ,
@@ -183,7 +176,6 @@ where
183176{
184177 pub fn new ( ) -> Self {
185178 Self {
186- current : 0.0 ,
187179 count : 0 ,
188180 mean : 0.0 ,
189181 phantom : std:: marker:: PhantomData ,
@@ -192,32 +184,8 @@ where
192184
193185 pub fn add ( & mut self , value : T ) {
194186 let value = T :: to_f64 ( value) ;
195- self . current += value;
196- self . count += 1 ;
197- self . calculate_mean ( )
198- }
199-
200- pub fn sub ( & mut self , value : T ) {
201- let value = T :: to_f64 ( value) ;
202- if T :: is_unsigned ( ) {
203- // Prevent current from going negative for unsigned types
204- if self . current >= value {
205- self . current -= value;
206- } else {
207- panic ! ( "Cannot subtract a larger value from a smaller value for unsigned types" ) ;
208- }
209- } else {
210- // Allow current to go negative for signed types and floats
211- self . current -= value;
212- }
213-
214187 self . count += 1 ;
215-
216- self . calculate_mean ( ) ;
217- }
218-
219- pub ( crate ) fn calculate_mean ( & mut self ) {
220- self . mean = self . current / self . count as f64 ;
188+ self . mean += ( value - self . mean ) / self . count as f64 ;
221189 }
222190}
223191
@@ -229,6 +197,12 @@ impl<T> Deref for Moving<T> {
229197 }
230198}
231199
200+ impl < T > std:: fmt:: Display for Moving < T > {
201+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
202+ write ! ( f, "{}" , self . mean)
203+ }
204+ }
205+
232206#[ cfg( test) ]
233207mod tests {
234208 use super :: * ;
@@ -242,15 +216,6 @@ mod tests {
242216 assert_eq ! ( moving_average, 15 ) ;
243217 }
244218
245- #[ test]
246- fn sub_moving_average ( ) {
247- let mut moving_average: Moving < usize > = Moving :: new ( ) ;
248- moving_average. add ( 20 ) ;
249- moving_average. add ( 20 ) ;
250- moving_average. sub ( 10 ) ;
251- assert_eq ! ( moving_average, 10 ) ;
252- }
253-
254219 #[ test]
255220 fn float_moving_average ( ) {
256221 let mut moving_average: Moving < f32 > = Moving :: new ( ) ;
@@ -259,42 +224,6 @@ mod tests {
259224 assert_eq ! ( moving_average, 15.0 ) ;
260225 }
261226
262- #[ test]
263- fn float_moving_average_sub ( ) {
264- let mut moving_average: Moving < f32 > = Moving :: new ( ) ;
265- moving_average. add ( 20.0 ) ;
266- moving_average. add ( 20.0 ) ;
267- moving_average. sub ( 10.0 ) ;
268- assert_eq ! ( moving_average, 10.0 ) ;
269- }
270-
271- #[ test]
272- #[ should_panic(
273- expected = "Cannot subtract a larger value from a smaller value for unsigned types"
274- ) ]
275- fn first_operation_sub ( ) {
276- let mut moving_average: Moving < usize > = Moving :: new ( ) ;
277- moving_average. sub ( 10 ) ;
278- }
279-
280- #[ test]
281- fn first_operation_sub_float ( ) {
282- let mut moving_average: Moving < f32 > = Moving :: new ( ) ;
283- moving_average. sub ( 10.0 ) ;
284- assert_eq ! ( moving_average, -10.0 ) ;
285- }
286-
287- #[ test]
288- #[ should_panic(
289- expected = "Cannot subtract a larger value from a smaller value for unsigned types"
290- ) ]
291- fn first_operation_sub_then_add ( ) {
292- let mut moving_average: Moving < usize > = Moving :: new ( ) ;
293- moving_average. sub ( 10 ) ;
294- moving_average. add ( 10 ) ;
295- assert_eq ! ( moving_average, 5 ) ;
296- }
297-
298227 #[ test]
299228 fn assign_add ( ) {
300229 let mut moving_average: Moving < usize > = Moving :: new ( ) ;
@@ -303,24 +232,6 @@ mod tests {
303232 assert_eq ! ( moving_average, 15 ) ;
304233 }
305234
306- #[ test]
307- fn assign_sub ( ) {
308- let mut moving_average: Moving < usize > = Moving :: new ( ) ;
309- moving_average. add ( 20 ) ;
310- moving_average. add ( 20 ) ;
311- moving_average -= 10 ;
312- assert_eq ! ( moving_average, 10 ) ;
313- }
314-
315- #[ test]
316- fn assign_sub_float ( ) {
317- let mut moving_average: Moving < f32 > = Moving :: new ( ) ;
318- moving_average. add ( 20.0 ) ;
319- moving_average. add ( 20.0 ) ;
320- moving_average -= 10.0 ;
321- assert_eq ! ( moving_average, 10.0 ) ;
322- }
323-
324235 #[ test]
325236 fn assign_add_float ( ) {
326237 let mut moving_average: Moving < f32 > = Moving :: new ( ) ;
0 commit comments