#[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> Extend<T> for EntityCollection<T> {
fn extend<I>(&mut self, iter: I)
where
I: IntoIterator<Item = T>,
{
self.entities.extend(iter);
}
}
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);
}
}
}
#[cfg(test)]
mod tests {
use super::EntityCollection;
#[test]
fn extend_preserves_insertion_order() {
let mut entities = EntityCollection::new();
entities.push(1);
entities.extend([2, 3]);
assert_eq!(entities.list(), &[1, 2, 3]);
}
}