iterstats 0.7.0

Statistics for rust iterators.
Documentation
use std::ops::{AddAssign, Div, Sub};

use num_traits::{One, Zero};

/// Results of [`welford_online`] algorithm.
pub struct WelfordOnline<T> {
    pub mean: T,
    pub count: T,
    pub sum_of_squares: T,
}

/// [Welford's online algorithm](https://en.m.wikipedia.org/wiki/Algorithms_for_calculating_variance#Welford's_online_algorithm) for 1-pass calculation of variance/stdev/etc..
pub fn welford_online<T, I>(iter: I) -> WelfordOnline<T>
where
    T: Copy + Zero + One + AddAssign + Sub<Output = T> + Div<Output = T>,
    I: Iterator<Item = T>,
{
    let mut sst = T::zero();
    let mut mean = T::zero();
    let mut counter = T::zero();
    for item in iter {
        counter += T::one();
        let newmean = mean + (item - mean) / counter;
        sst += (item - mean) * (item - newmean);
        mean = newmean;
    }
    WelfordOnline {
        mean,
        count: counter,
        sum_of_squares: sst,
    }
}