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 }