use crate::*; /// Render to output. pub trait Render: Send + Sync { fn render (&self, to: &mut E) -> Perhaps; } impl Render for () { fn render (&self, to: &mut E) -> Perhaps { Ok(None) } } /// Options can be rendered optionally. impl Render for Option where R: Render { fn render (&self, to: &mut E) -> Perhaps { match self { Some(component) => component.render(to), None => Ok(None) } } } /// Boxed references can be rendered. impl<'a, E: Engine> Render for Box + 'a> { fn render (&self, to: &mut E) -> Perhaps { (**self).render(to) } } /// Immutable references can be rendered. impl Render for &R where R: Render { fn render (&self, to: &mut E) -> Perhaps { (*self).render(to) } } /// Mutable references can be rendered. impl Render for &mut R where R: Render { fn render (&self, to: &mut E) -> Perhaps { (**self).render(to) } } /// Counted references can be rendered. impl Render for Arc where R: Render { fn render (&self, to: &mut E) -> Perhaps { self.as_ref().render(to) } } /// References behind a [Mutex] can be rendered. impl Render for Mutex where R: Render { fn render (&self, to: &mut E) -> Perhaps { self.lock().unwrap().render(to) } } /// References behind a [RwLock] can be rendered. impl Render for RwLock where R: Render { fn render (&self, to: &mut E) -> Perhaps { self.read().unwrap().render(to) } } // FIXME: components are now 2 thunks (layout and render). // maybe this resolves the conflict describe below? ///// Boxed closures can be rendered. ///// ///// Rendering unboxed closures should also be possible; ///// but in practice implementing the trait for an unboxed ///// `Fn` closure causes an impl conflict. //impl<'a, E: Engine> Render for Box Perhaps + Send + Sync + 'a> { //fn render (&self, to: &mut E) -> Perhaps { //(*self)(to) //} //}