use crate::*; pub enum Collected<'a, E: Engine> { Box(Box + 'a>), Ref(&'a (dyn Render + 'a)), } impl<'a, E: Engine> Render for Collected<'a, E> { fn render (&self, to: &mut E) -> Perhaps { match self { Self::Box(item) => (*item).render(to), Self::Ref(item) => (*item).render(to), } } } pub struct Collection<'a, E: Engine>( pub Vec> ); impl<'a, E: Engine> Collection<'a, E> { pub fn new () -> Self { Self(vec![]) } } pub trait Collect<'a, E: Engine> { fn add_box (self, item: Box + 'a>) -> Self; fn add_ref (self, item: &'a dyn Render) -> Self; fn add + Sized + 'a> (self, item: R) -> Self where Self: Sized { self.add_box(Box::new(item)) } } impl<'a, E: Engine> Collect<'a, E> for Collection<'a, E> { fn add_box (mut self, item: Box + 'a>) -> Self { self.0.push(Collected::Box(item)); self } fn add_ref (mut self, item: &'a dyn Render) -> Self { self.0.push(Collected::Ref(item)); self } }