use crate::actors::prelude::*;
use crate::actors::default_dispatcher::DefaultDispatcher;
use crate::examples::actors::pinned::long_worker;
use crate::examples::actors::pinned::long_worker::LongWorker;
use std::sync::{Mutex, Arc};
use std::thread;
use std::time::Duration;
pub fn run() {
let mut system = LocalActorSystem::new();
system.add_dispatcher("default", tsafe!(DefaultDispatcher::new(1)));
let pw0 = Props::new(tsafe!(LongWorker::new("pinned-worker0")))
.with_dispatcher("pinned");
let pw1 = Props::new(tsafe!(LongWorker::new("pinned-worker1")))
.with_dispatcher("pinned");
let pw2 = Props::new(tsafe!(LongWorker::new("pinned-worker2")))
.with_dispatcher("pinned");
let mut pinned_worker0 = system.actor_of(pw0, None);
let mut pinned_worker1 = system.actor_of(pw1, None);
let mut pinned_worker2 = system.actor_of(pw2, None);
let dw0 = Props::new(tsafe!(LongWorker::new("default-worker0")));
let dw1 = Props::new(tsafe!(LongWorker::new("default-worker1")));
let dw2 = Props::new(tsafe!(LongWorker::new("default-worker2")));
let mut default_worker0 = system.actor_of(dw0, None);
let mut default_worker1 = system.actor_of(dw1, None);
let mut default_worker2 = system.actor_of(dw2, None);
default_worker0.tell( msg!(long_worker::DoLongWork { time: Duration::from_secs(5) }), None );
default_worker1.tell( msg!(long_worker::DoLongWork { time: Duration::from_secs(5) }), None );
default_worker2.tell( msg!(long_worker::DoLongWork { time: Duration::from_secs(5) }), None );
thread::sleep(Duration::from_secs(16));
println!("--------------------------------------------------------------");
pinned_worker0.tell( msg!(long_worker::DoLongWork { time: Duration::from_secs(5) }), None );
pinned_worker1.tell( msg!(long_worker::DoLongWork { time: Duration::from_secs(5) }), None );
pinned_worker2.tell( msg!(long_worker::DoLongWork { time: Duration::from_secs(5) }), None );
thread::park();
}