use crate::async_engine::SpawnedFuture; use crate::{AsyncEngine, AsyncQueue}; use 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({ 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)); } fn schedule_dyn(&self, f: Box) { self.queue.push(f); } }