#[derive(Debug, Clone, Default)]
pub struct Collection<T> {
items: Vec<T>,
}
#[allow(clippy::iter_overeager_cloned, clippy::redundant_closure)]
impl<T> Collection<T> {
pub fn new() -> Self {
Self { items: Vec::new() }
}
pub fn from_vec(items: Vec<T>) -> Self {
Self { items }
}
pub fn push(&mut self, item: T) {
self.items.push(item);
}
pub fn all(&self) -> &Vec<T> {
&self.items
}
pub fn into_inner(self) -> Vec<T> {
self.items
}
pub fn len(&self) -> usize {
self.items.len()
}
pub fn length(&self) -> usize {
self.len()
}
pub fn is_empty(&self) -> bool {
self.items.is_empty()
}
pub fn get(&self, index: usize) -> Option<&T> {
self.items.get(index)
}
pub fn filter<F>(&self, mut f: F) -> Self
where
F: FnMut(&T) -> bool,
T: Clone,
{
let filtered = self.items.iter().cloned().filter(|item| f(item)).collect();
Self::from_vec(filtered)
}
pub fn map<U, F>(&self, mut f: F) -> Collection<U>
where
F: FnMut(&T) -> U,
{
let mapped = self.items.iter().map(|item| f(item)).collect();
Collection::from_vec(mapped)
}
}