use alloc::vec::Vec;
use core::time::Duration;
use std::time::Instant;
use crate::types::FrameServiceSample;
#[derive(Debug, Clone)]
pub(crate) struct FrameTimingBuffer {
window: Duration,
samples: Vec<FrameServiceSample>,
}
impl FrameTimingBuffer {
#[must_use]
pub(crate) const fn new(window: Duration) -> Self {
Self {
window,
samples: Vec::new(),
}
}
pub(crate) fn push(&mut self, sample: FrameServiceSample) {
self.evict_before(sample.at);
self.samples.push(sample);
}
pub(crate) fn evict(&mut self, now: Instant) {
self.evict_before(now);
}
fn evict_before(&mut self, now: Instant) {
let cutoff = now.checked_sub(self.window);
if let Some(cutoff) = cutoff {
self.samples.retain(|s| s.at >= cutoff);
}
}
pub(crate) fn iter(&self) -> impl Iterator<Item = &FrameServiceSample> {
self.samples.iter()
}
}