use std::sync::Arc;
use actors::{Actor, Arguments};
pub trait ActorFactory: Send + Sync {
fn create(&self) -> Arc<Actor>;
}
pub struct Props<Args: Arguments, A: Actor> {
creator: Arc<Fn(Args) -> A + Sync + Send>,
args: Args,
}
impl<Args: Arguments, A: Actor> Props<Args, A> {
pub fn new(creator: Arc<Fn(Args) -> A + Sync + Send>, args: Args) -> Arc<ActorFactory> {
Arc::new(Props::<Args, A> {
creator: creator,
args: args,
})
}
}
impl<Args: Arguments, A: Actor> ActorFactory for Props<Args, A> {
fn create(&self) -> Arc<Actor> {
let args = self.args.clone();
Arc::new((self.creator)(args))
}
}
impl<Args: Arguments, A: Actor> Clone for Props<Args, A> {
fn clone(&self) -> Props<Args, A> {
Props::<Args, A> {
creator: self.creator.clone(),
args: self.args.clone(),
}
}
}