use crate::{Color, Widget}; pub struct Element<'a, Message> { pub(crate) widget: Box + 'a>, } impl<'a, Message> Element<'a, Message> { pub fn new(widget: impl Widget + 'a) -> Self { Self { widget: Box::new(widget), } } pub fn explain(self, color: Color) -> Element<'a, Message> { self } pub fn map(self, f: F) -> Element<'a, B> where Message: 'static, B: 'static, F: 'static + Fn(Message) -> B, { Element { widget: Box::new(Map::new(self.widget, f)), } } } struct Map<'a, A, B> { widget: Box + 'a>, mapper: Box B>, } impl<'a, A, B> Map<'a, A, B> { pub fn new(widget: Box + 'a>, mapper: F) -> Map<'a, A, B> where F: 'static + Fn(A) -> B, { Map { widget, mapper: Box::new(mapper), } } } impl<'a, A, B> Widget for Map<'a, A, B> {}