1use crate::maximum::{Max, RollingMax};
2use crate::minimum::{Min, RollingMin};
3use crate::stats::Univariate;
4use num::{Float, FromPrimitive};
5use serde::{Deserialize, Serialize};
6use std::ops::{AddAssign, SubAssign};
7#[derive(Copy, Clone, Default, Debug, Serialize, Deserialize)]
20pub struct PeakToPeak<F: Float + FromPrimitive + AddAssign + SubAssign> {
21 pub min: Min<F>,
22 pub max: Max<F>,
23}
24
25impl<F: Float + FromPrimitive + AddAssign + SubAssign> PeakToPeak<F> {
26 pub fn new() -> Self {
27 Self {
28 min: Min::new(),
29 max: Max::new(),
30 }
31 }
32}
33
34impl<F: Float + FromPrimitive + AddAssign + SubAssign> Univariate<F> for PeakToPeak<F> {
35 fn update(&mut self, x: F) {
36 self.min.update(x);
37 self.max.update(x);
38 }
39 fn get(&self) -> F {
40 self.max.get() - self.min.get()
41 }
42}
43
44#[derive(Serialize, Deserialize)]
59pub struct RollingPeakToPeak<F: Float + FromPrimitive + AddAssign + SubAssign> {
60 pub min: RollingMin<F>,
61 pub max: RollingMax<F>,
62}
63
64impl<F: Float + FromPrimitive + AddAssign + SubAssign> RollingPeakToPeak<F> {
65 pub fn new(window_size: usize) -> Self {
66 Self {
67 min: RollingMin::new(window_size),
68 max: RollingMax::new(window_size),
69 }
70 }
71}
72
73impl<F: Float + FromPrimitive + AddAssign + SubAssign> Univariate<F> for RollingPeakToPeak<F> {
74 fn update(&mut self, x: F) {
75 self.min.update(x);
76 self.max.update(x);
77 }
78 fn get(&self) -> F {
79 self.max.get() - self.min.get()
80 }
81}