use crossbeam_channel::{Receiver, bounded}; #[derive(Debug)] pub struct AsyncJob { receiver: Receiver, } impl AsyncJob { pub fn wait(self) -> T { self.receiver .recv() .expect("AsyncJob worker thread panicked or disconnected") } pub fn is_ready(&self) -> bool { !self.receiver.is_empty() } } pub fn run_async(func: F) -> AsyncJob where F: FnOnce() -> T + Send + 'static, T: Send + 'static, { let (tx, rx) = bounded(1); rayon::spawn(move || { let result = func(); let _ = tx.send(result); }); AsyncJob { receiver: rx } }