kanit

Toy init system
Log | Files | Refs | README | LICENSE

lib.rs (949B)


      1 use std::future::Future;
      2 use std::sync::OnceLock;
      3 
      4 use async_executor::{LocalExecutor, Task};
      5 use futures_lite::StreamExt;
      6 use futures_lite::stream::iter;
      7 use send_wrapper::SendWrapper;
      8 
      9 static GLOBAL_EXECUTOR: OnceLock<SendWrapper<LocalExecutor<'static>>> = OnceLock::new();
     10 
     11 pub fn spawn<T: 'static>(future: impl Future<Output = T> + 'static) -> Task<T> {
     12     GLOBAL_EXECUTOR
     13         .get_or_init(|| SendWrapper::new(LocalExecutor::new()))
     14         .spawn(future)
     15 }
     16 
     17 pub fn block<T: 'static>(future: impl Future<Output = T> + 'static) -> T {
     18     async_io::block_on(
     19         GLOBAL_EXECUTOR
     20             .get_or_init(|| SendWrapper::new(LocalExecutor::new()))
     21             .run(future),
     22     )
     23 }
     24 
     25 pub async fn join_all<I, F, R: 'static>(futures: I) -> Vec<R>
     26 where
     27     I: IntoIterator<Item = F>,
     28     F: Future<Output = R> + 'static,
     29 {
     30     let handles: Vec<_> = futures.into_iter().map(spawn).collect();
     31 
     32     iter(handles).then(|f| f).collect().await
     33 }