#[derive(Debug, Clone)]
pub struct EntityCollection<T> {
pub(crate) entities: Vec<T>,
}
impl<T> Default for EntityCollection<T> {
fn default() -> Self {
Self {
entities: Vec::new(),
}
}
}
impl<T> EntityCollection<T> {
#[must_use]
pub const fn new() -> Self {
Self {
entities: Vec::new(),
}
}
pub fn push(&mut self, entity: T) {
self.entities.push(entity);
}
#[must_use]
pub fn list(&self) -> &[T] {
&self.entities
}
pub const fn list_mut(&mut self) -> &mut Vec<T> {
&mut self.entities
}
#[must_use]
pub const fn is_empty(&self) -> bool {
self.entities.is_empty()
}
#[must_use]
pub const fn len(&self) -> usize {
self.entities.len()
}
}
impl<T: Clone> EntityCollection<T> {
#[must_use]
pub fn into_vec(self) -> Vec<T> {
self.entities
}
pub fn update_where<F, P>(&mut self, predicate: P, mut transform: F)
where
F: FnMut(&mut T),
P: Fn(&T) -> bool,
{
for entity in &mut self.entities {
if predicate(entity) {
transform(entity);
}
}
}
pub fn update_all<F>(&mut self, mut transform: F)
where
F: FnMut(&mut T),
{
for entity in &mut self.entities {
transform(entity);
}
}
}