use { crate::{ async_engine::{AsyncEngine, SpawnedFuture}, utils::queue::AsyncQueue, }, std::rc::Rc, }; pub struct RunToplevelFuture { _future: SpawnedFuture<()>, } pub struct RunToplevel { queue: AsyncQueue>, } impl RunToplevel { pub fn install(eng: &Rc) -> (RunToplevelFuture, Rc) { let slf = Rc::new(RunToplevel { queue: Default::default(), }); let future = eng.spawn("run toplevel", { let slf = slf.clone(); async move { loop { let f = slf.queue.pop().await; f(); } } }); let future = RunToplevelFuture { _future: future }; (future, slf) } pub fn schedule(&self, f: F) { self.schedule_dyn(Box::new(f)); } pub fn clear(&self) { self.queue.clear(); } fn schedule_dyn(&self, f: Box) { self.queue.push(f); } }