use std::future::Future;
use std::sync::Arc;
use std::thread;
use crossbeam::channel;
use futures::executor;
type JoinHandle<T> = async_task::JoinHandle<T, ()>;
fn spawn_on_thread<F, R>(future: F) -> JoinHandle<R>
where
F: Future<Output = R> + Send + 'static,
R: Send + 'static,
{
let (sender, receiver) = channel::unbounded();
let sender = Arc::new(sender);
let s = Arc::downgrade(&sender);
let future = async move {
let _sender = sender;
future.await
};
let schedule = move |t| s.upgrade().unwrap().send(t).unwrap();
let (task, handle) = async_task::spawn(future, schedule, ());
task.schedule();
thread::spawn(move || {
for task in receiver {
task.run();
}
});
handle
}
fn main() {
executor::block_on(spawn_on_thread(async {
println!("Hello, world!");
}));
}