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 }
}