pub enum Collected<'a> { Box(Box), Ref(&'a (dyn Render + 'a)), None } impl<'a> Render for Collected<'a> { fn render (&self, buf: &mut Buffer, area: Rect) -> Usually { match self { Self::Box(item) => (*item).render(buf, area), Self::Ref(item) => (*item).render(buf, area), Self::None => Ok(area), } } } pub struct Collector<'a>(pub Vec>); impl<'a, R: Render + 'a> FnOnce<(R)> for Collector<'a> { type Output = (); extern "rust-call" fn call_once (self, (device, ): (R,)) -> Self::Output { self.add(widget.into_collected()); } } impl<'a> Collector<'a> { pub fn collect (collect: impl Fn(&mut Collector<'a>)) -> Self { let mut items = Self(vec![]); collect(&mut items); items } fn add (mut self, widget: Collected<'a>) -> Self { self.0.push(widget); self } } pub trait Collection<'a, T, U> { fn add (self, widget: impl Render + 'a) -> Self; }