use crate::sorted_window::SortedWindow;
use crate::stats::Univariate;
use num::{Float, FromPrimitive};
use serde::{Deserialize, Serialize};
use std::ops::{AddAssign, SubAssign};
#[derive(Clone, Copy, Default, Debug, Serialize, Deserialize)]
pub struct Min<F: Float + FromPrimitive + AddAssign + SubAssign> {
pub min: F,
}
impl<F: Float + FromPrimitive + AddAssign + SubAssign> Min<F> {
pub fn new() -> Self {
Self {
min: F::max_value(),
}
}
}
impl<F: Float + FromPrimitive + AddAssign + SubAssign> Univariate<F> for Min<F> {
fn update(&mut self, x: F) {
if self.min > x {
self.min = x;
}
}
fn get(&self) -> F {
self.min
}
}
#[derive(Serialize, Deserialize)]
pub struct RollingMin<F: Float + FromPrimitive + AddAssign + SubAssign> {
sorted_window: SortedWindow<F>,
}
impl<F: Float + FromPrimitive + AddAssign + SubAssign> RollingMin<F> {
pub fn new(window_size: usize) -> Self {
Self {
sorted_window: SortedWindow::new(window_size),
}
}
}
impl<F: Float + FromPrimitive + AddAssign + SubAssign> Univariate<F> for RollingMin<F> {
fn update(&mut self, x: F) {
self.sorted_window.push_back(x);
}
fn get(&self) -> F {
self.sorted_window.front()
}
}