extern crate message_to_parent;
use std::{cell::RefCell, rc::Rc};
use message_to_parent::MessageToParent;
struct App {
worker: Worker,
finalizer: Finalizer,
}
impl App {
pub fn new() -> Self {
App {
worker: Worker::new(),
finalizer: Finalizer::new(),
}
}
pub fn main(&mut self) {
let mut worker_message = self.worker.do_work();
worker_message.run_side_effects(self);
}
}
struct Worker {
compositor: Compositor,
}
impl Worker {
pub fn new() -> Self {
Worker {
compositor: Compositor::new(),
}
}
pub fn do_work(&mut self) -> MessageToParent<App, ()> {
let mut message = MessageToParent::<App, ()>::new();
self.compositor.composite(&mut message);
message
}
}
struct Compositor {}
impl Compositor {
pub fn new() -> Self {
Compositor {}
}
pub fn composite(&mut self, message: &mut MessageToParent<App, ()>) {
println!("Compositor: Attempting communication with Finalizer!");
message.add_side_effect(|app| {
app.finalizer.finalize("some random data from Compositor");
});
}
}
struct Finalizer {}
impl Finalizer {
pub fn new() -> Self {
Finalizer {}
}
pub fn finalize(&mut self, data: &str) {
println!("Finalizer: Finalizing data [{}]", data);
}
}
fn main() {
Rc::new(RefCell::new(App::new())).borrow_mut().main();
}