use crate::Instance; use std::rc::Rc; /// A publisher of messages. /// /// It can be used to route messages back to the [`Application`]. /// /// [`Application`]: trait.Application.html #[allow(missing_debug_implementations)] #[derive(Clone)] pub struct Bus { publish: Rc>, } impl Bus where Message: 'static, { pub(crate) fn new() -> Self { Self { publish: Rc::new(Box::new(|message, root| { let app = root.unwrap_mut::>(); app.update(message) })), } } /// Publishes a new message for the [`Application`]. /// /// [`Application`]: trait.Application.html pub fn publish(&self, message: Message, root: &mut dyn dodrio::RootRender) { (self.publish)(message, root); } /// Creates a new [`Bus`] that applies the given function to the messages /// before publishing. /// /// [`Bus`]: struct.Bus.html pub fn map(&self, mapper: Rc Message>>) -> Bus where B: 'static, { let publish = self.publish.clone(); Bus { publish: Rc::new(Box::new(move |message, root| { publish(mapper(message), root) })), } } }