use std::vec::IntoIter;
use naia_shared::Tick;
pub struct TickEvents {
ticks: Vec<Tick>,
empty: bool,
}
impl TickEvents {
pub(crate) fn new() -> Self {
Self {
ticks: Vec::new(),
empty: true,
}
}
pub fn is_empty(&self) -> bool {
self.empty
}
pub fn read<V: TickEventType>(&mut self) -> V::Iter {
V::iter(self)
}
pub fn has<V: TickEventType>(&self) -> bool {
V::has(self)
}
pub(crate) fn push_tick(&mut self, tick: Tick) {
self.ticks.push(tick);
self.empty = false;
}
}
pub trait TickEventType {
type Iter;
fn iter(events: &mut TickEvents) -> Self::Iter;
fn has(events: &TickEvents) -> bool;
}
pub struct TickEvent;
impl TickEventType for TickEvent {
type Iter = IntoIter<Tick>;
fn iter(events: &mut TickEvents) -> Self::Iter {
let list = std::mem::take(&mut events.ticks);
IntoIterator::into_iter(list)
}
fn has(events: &TickEvents) -> bool {
!events.ticks.is_empty()
}
}