downsample 0.0.5

keep downsampled history of data over long period of time
Documentation
use crate::Reducer;
use alloc::vec::Vec;
use core::num::NonZeroUsize;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct TimeLevel<Tick> {
    bucket_count: NonZeroUsize,
    bucket_width: Tick,
}

impl<Tick: Copy> TimeLevel<Tick> {
    pub fn bucket_count(&self) -> NonZeroUsize { self.bucket_count }

    pub fn bucket_width(&self) -> Tick { self.bucket_width }
}

impl<Tick> TimeLevel<Tick> {
    pub(crate) fn new(bucket_count: NonZeroUsize, bucket_width: Tick) -> Self {
        Self {
            bucket_count,
            bucket_width,
        }
    }
}

pub struct TimeStorage<Tick, T> {
    pub(crate) data:   Vec<(Tick, T)>,
    pub(crate) levels: Vec<TimeLevel<Tick>>,
}

impl<Tick, T> TimeStorage<Tick, T> {
    pub fn level_count(&self) -> usize { self.levels.len() }

    pub fn level_metadata(&self, level: usize) -> Option<&TimeLevel<Tick>> { self.levels.get(level) }

    pub fn raw_points(&self) -> &[(Tick, T)] { &self.data }
}

pub struct TimeWriter<Tick, T> {
    pub(crate) storage:  TimeStorage<Tick, T>,
    pub(crate) reducers: Vec<Reducer<T>>,
}

impl<Tick, T> TimeWriter<Tick, T> {
    pub fn storage(&self) -> &TimeStorage<Tick, T> { &self.storage }

    pub fn reducer_count(&self) -> usize { self.reducers.len() }

    pub fn into_storage(self) -> TimeStorage<Tick, T> { self.storage }
}