use crate::stats::{Revertable, RollableUnivariate, Univariate};
use num::{Float, FromPrimitive};
use serde::{Deserialize, Serialize};
use std::ops::{AddAssign, SubAssign};
#[derive(Copy, Clone, Default, Debug, Serialize, Deserialize)]
pub struct Sum<F: Float + FromPrimitive + AddAssign + SubAssign> {
pub sum: F,
}
impl<F: Float + FromPrimitive + AddAssign + SubAssign> Sum<F> {
pub fn new() -> Self {
Self {
sum: F::from_f64(0.0).unwrap(),
}
}
}
impl<F: Float + FromPrimitive + AddAssign + SubAssign> Univariate<F> for Sum<F> {
fn update(&mut self, x: F) {
self.sum += x;
}
fn get(&self) -> F {
self.sum
}
}
impl<F: Float + FromPrimitive + AddAssign + SubAssign> Revertable<F> for Sum<F> {
fn revert(&mut self, x: F) -> std::result::Result<(), &'static str> {
self.sum -= x;
Ok(())
}
}
impl<F: Float + FromPrimitive + AddAssign + SubAssign> RollableUnivariate<F> for Sum<F> {}