use std::future::Future;
pub fn spawn_local<F>(fut: F)
where
F: Future<Output = ()> + 'static,
{
cfg_if! {
if #[cfg(target_arch = "wasm32")] {
wasm_bindgen_futures::spawn_local(fut)
} else if #[cfg(any(test, doctest))] {
tokio_test::block_on(fut);
} else if #[cfg(all(feature = "web-ssr", not(feature = "__single_holder")))] {
tokio::task::block_in_place(move || {
tokio::runtime::Handle::current().block_on(async move {
let local = tokio::task::LocalSet::new();
local.spawn_local(fut);
local.await;
});
});
} else {
futures::executor::block_on(fut)
}
}
}
pub fn queue_microtask(task: impl FnOnce() + 'static) {
#[cfg(not(all(target_arch = "wasm32", feature = "web-csr")))]
{
task();
}
#[cfg(all(target_arch = "wasm32", feature = "web-csr"))]
{
use js_sys::{Function, Reflect};
use wasm_bindgen::prelude::*;
let task = Closure::once_into_js(task);
let window = web_sys::window().expect("window not available");
let queue_microtask = Reflect::get(&window, &JsValue::from_str("queueMicrotask")).expect("queueMicrotask not available");
let queue_microtask = queue_microtask.unchecked_into::<Function>();
_ = queue_microtask.call1(&JsValue::UNDEFINED, &task);
}
}