use crate::entity::EntityId;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct DestinationQueue {
queue: Vec<EntityId>,
}
impl DestinationQueue {
#[must_use]
pub const fn new() -> Self {
Self { queue: Vec::new() }
}
#[must_use]
pub fn queue(&self) -> &[EntityId] {
&self.queue
}
#[must_use]
pub const fn is_empty(&self) -> bool {
self.queue.is_empty()
}
#[must_use]
pub const fn len(&self) -> usize {
self.queue.len()
}
#[must_use]
pub fn front(&self) -> Option<EntityId> {
self.queue.first().copied()
}
pub(crate) fn push_back(&mut self, stop: EntityId) -> bool {
if self.queue.last() == Some(&stop) {
return false;
}
self.queue.push(stop);
true
}
pub(crate) fn push_front(&mut self, stop: EntityId) -> bool {
if self.queue.first() == Some(&stop) {
return false;
}
self.queue.insert(0, stop);
true
}
pub(crate) fn clear(&mut self) {
self.queue.clear();
}
pub(crate) fn replace(&mut self, stops: Vec<EntityId>) {
self.queue = stops;
}
pub(crate) fn retain(&mut self, mut predicate: impl FnMut(EntityId) -> bool) {
self.queue.retain(|&eid| predicate(eid));
}
#[must_use]
pub fn contains(&self, stop: &EntityId) -> bool {
self.queue.contains(stop)
}
pub(crate) fn pop_front(&mut self) -> Option<EntityId> {
(!self.queue.is_empty()).then(|| self.queue.remove(0))
}
}