use std::result;
use crossbeam_channel::Receiver;
#[derive(Debug)]
pub enum Error {
Broken
}
pub type Result<T> = result::Result<T, Error>;
pub struct Future<T> {
pub(crate) receiver: Receiver<T>
}
impl<T> Future<T> {
pub fn into_value(self) -> Result<T> {
match self.receiver.recv() {
Ok(t) => Ok(t),
Err(_) => Err(Error::Broken)
}
}
pub fn wait(self) -> Result<T> {
unsafe {
match crate::thread::LOCAL_THREAD {
Some(ref weak_thread) => {
match weak_thread.upgrade() {
Some(thread) => thread.r#await(self),
None => self.into_value()
}
},
None => {
self.into_value()
}
}
}
}
}