tractor 0.0.6

Actor system modelled after Pony's actors
Documentation
use std::time::Duration;
use tokio::time::sleep;
use tractor::prelude::*;

pub struct Accumulator {
    sum: usize,
}

#[actor(derive_hooks)]
impl Accumulator {
    fn add(&mut self, a: usize) {
        self.sum += a;
    }

    fn sub(&mut self, a: usize) {
        self.sum -= a;
    }
}

trait AccumulatorRefExt: Address<Accumulator> {
    fn overloaded(&self) -> bool {
        self.len() > 1000
    }
}

impl AccumulatorRefExt for Addr<Accumulator> {}

pub struct Feeder;

#[async_actor(derive_hooks)]
impl Feeder {
    async fn feed(&mut self, num: usize, addr: Addr<Accumulator>) {
        for _i in 0..num {
            while addr.overloaded() {
                sleep(Duration::from_millis(1)).await;
                // println!("Overload");
            }
            addr.add(1);
        }
    }
}

fn main() {
    ActorSystem::run_to_completion(|| {
        let accumulator = Accumulator { sum: 0 }.start();

        let feeder = Feeder.start();
        feeder.feed(1_000_000, accumulator);
    });
}