bottle 0.1.0

Actor model framework for Rust.
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()
				}
			}
		}
	}
}