use std::collections::VecDeque;
pub(crate) trait Event {
fn sample_time(&self) -> u64;
}
pub(crate) trait EventProcessor {
type Event: Event;
fn time_until_next_event(&self, current_time: u64) -> usize {
self.events()
.front()
.map_or(usize::MAX, |e| (e.sample_time() - current_time) as usize)
}
fn insert_event(&mut self, event: Self::Event) {
let events = self.events_mut();
let sample_time = event.sample_time();
let insert_pos = events
.make_contiguous()
.partition_point(|e| e.sample_time() < sample_time);
events.insert(insert_pos, event);
}
fn process_events(&mut self, current_time: u64) {
while self
.events()
.front()
.is_some_and(|e| e.sample_time() <= current_time)
{
let event = self.events_mut().pop_front().unwrap();
self.process_event(event);
}
}
fn events(&self) -> &VecDeque<Self::Event>;
fn events_mut(&mut self) -> &mut VecDeque<Self::Event>;
fn process_event(&mut self, event: Self::Event);
}