use component::*;
use effector::*;
use event::*;
use std::any::Any;
use std::marker::PhantomData;
#[derive(Clone)]
pub struct OutPort<T: Any + Send>
{
pub remote_id: ComponentID,
pub remote_port: String,
dummy: PhantomData<T>,
}
#[derive(Clone)]
pub struct InPort<T: Any + Send>
{
target_id: ComponentID,
target_port: String,
dummy: PhantomData<T>,
}
impl<T: Any + Send> InPort<T>
{
pub fn empty() -> InPort<T>
{
InPort {
target_id: NO_COMPONENT,
target_port: "".to_string(),
dummy: PhantomData,
}
}
pub fn new(id: ComponentID) -> InPort<T>
{
InPort {
target_id: id,
target_port: "".to_string(),
dummy: PhantomData,
}
}
pub fn with_port_name(id: ComponentID, port: &str) -> InPort<T>
{
InPort {
target_id: id,
target_port: port.to_string(),
dummy: PhantomData,
}
}
}
impl<T: Any + Send> OutPort<T>
{
pub fn new() -> OutPort<T>
{
OutPort {
remote_id: NO_COMPONENT,
remote_port: "".to_string(),
dummy: PhantomData,
}
}
pub fn send_payload(&self, effector: &mut Effector, name: &str, payload: T)
{
assert!(self.remote_id != NO_COMPONENT);
let event = Event::with_port_payload(name, &self.remote_port, payload);
effector.schedule_immediately(event, self.remote_id);
}
pub fn send_payload_after_secs(&self, effector: &mut Effector, name: &str, secs: f64, payload: T)
{
assert!(self.remote_id != NO_COMPONENT);
let event = Event::with_port_payload(name, &self.remote_port, payload);
effector.schedule_after_secs(event, self.remote_id, secs);
}
pub fn connect_to(&mut self, port: &InPort<T>)
{
assert!(port.target_id != NO_COMPONENT);
self.remote_id = port.target_id;
self.remote_port = port.target_port.to_string(); }
pub fn is_connected(&self) -> bool
{
self.remote_id != NO_COMPONENT
}
}
impl OutPort<()>
{
pub fn send(&self, effector: &mut Effector, name: &str)
{
assert!(self.remote_id != NO_COMPONENT);
let event = Event::with_port(name, &self.remote_port);
effector.schedule_immediately(event, self.remote_id);
}
pub fn send_after_secs(&self, effector: &mut Effector, name: &str, secs: f64)
{
assert!(self.remote_id != NO_COMPONENT);
let event = Event::with_port(name, &self.remote_port);
effector.schedule_after_secs(event, self.remote_id, secs);
}
}