tractor 0.0.6

Actor system modelled after Pony's actors
Documentation
use tractor::prelude::*;

enum MyActorMsg {
    Add(usize, usize),
    AddedResult(usize),
}

enum AdderMsg {
    Add {
        a: usize,
        b: usize,
        respond: Chan<MyActorMsg>,
    },
}

struct MyActor {
    adder: Chan<AdderMsg>,
}

impl Actor for MyActor {
    type Msg = MyActorMsg;
}

impl ActorHooks for MyActor {}

impl ActorBehavior for MyActor {
    fn handle(&mut self, msg: MyActorMsg, ctx: &Context<Self>) {
        match msg {
            MyActorMsg::Add(a, b) => {
                self.adder.send(AdderMsg::Add {
                    a,
                    b,
                    respond: ctx.myself().chan(),
                });
            }

            MyActorMsg::AddedResult(result) => {
                println!("Result: {}", result);
            }
        }
    }
}

struct Adder;

impl Actor for Adder {
    type Msg = AdderMsg;
}

impl ActorBehavior for Adder {
    fn handle(&mut self, msg: AdderMsg, _: &Context<Self>) {
        match msg {
            AdderMsg::Add { a, b, respond } => {
                respond.send(MyActorMsg::AddedResult(a + b));
            }
        }
    }
}

impl ActorHooks for Adder {}

fn run() {
    let adder = Adder.start().chan();
    let myactor = MyActor { adder }.start();

    myactor.send(MyActorMsg::Add(1, 2));
    myactor.send(MyActorMsg::Add(1, 5));
}

fn main() {
    ActorSystem::run_to_completion(run);
}