kagura 0.14.5

component-oriented GUI framework
Documentation
use crate::node::{NodeCmd, RenderNode, UpdateNode};
use std::collections::VecDeque;

mod schedule;

use schedule::Scedule;

pub struct Runtime<Node: UpdateNode + RenderNode<NodeCmd> + 'static> {
    schedule: Scedule,
    node: Node,
}

impl<Node: UpdateNode + RenderNode<NodeCmd> + 'static> Runtime<Node> {
    pub async fn run(node: Node) {
        let mut runtime = Self {
            schedule: Scedule::new(),
            node: node,
        };

        let mut is_busy = true;
        loop {
            is_busy = runtime.event_loop(is_busy).await;
        }
    }

    async fn event_loop(&mut self, is_busy: bool) -> bool {
        if is_busy {
            let mut schedules = self.node.render();
            self.schedule.append(&mut schedules).await;
        }
        let mut msgs: VecDeque<_> = self.schedule.listen().await.into();
        let mut schedules = VecDeque::new();
        let mut is_busy = false;
        while let Some(msg) = msgs.pop_front() {
            let mut node_cmd = self.node.update(msg);
            msgs.append(node_cmd.msgs_mut());
            schedules.append(&mut node_cmd);
            is_busy = true;
        }
        self.schedule.append(&mut schedules).await;
        is_busy
    }
}