use std::thread::{self, JoinHandle};
#[inline]
pub fn spawn_blocking<F, R>(f: F) -> JoinHandle<R>
where
F: FnOnce() -> R + Send + 'static,
R: Send + 'static,
{
thread::spawn(f)
}
#[inline]
pub fn spawn_detached<F>(f: F)
where
F: FnOnce() + Send + 'static,
{
let _ = thread::Builder::new().name("zc-async".into()).spawn(f);
}
#[cfg(test)]
mod tests {
use super::*;
use std::sync::atomic::{AtomicU64, Ordering};
#[test]
fn spawn_detached_runs() {
let done = std::sync::Arc::new(AtomicU64::new(0));
let d = done.clone();
spawn_detached(move || {
d.store(1, Ordering::Relaxed);
});
thread::sleep(std::time::Duration::from_millis(50));
assert_eq!(done.load(Ordering::Relaxed), 1);
}
#[test]
fn spawn_blocking_returns_handle() {
let handle = spawn_blocking(|| 42);
assert_eq!(handle.join().unwrap(), 42);
}
}