acto 0.8.0

light-weight Actor library for Rust
Documentation
use acto::{ActoCell, ActoHandle, ActoInput, ActoRuntime, SupervisionRef};

async fn actor(mut ctx: ActoCell<i32, impl ActoRuntime>) {
    println!("main actor started");
    while let ActoInput::Message(m) = ctx.recv().await {
        ctx.spawn_supervised("subordinate", |mut ctx: ActoCell<_, _>| async move {
            println!("spawned actor for {:?}", ctx.recv().await);
        })
        .send(m);

        let r = ctx.spawn("worker", |mut ctx: ActoCell<_, _>| async move {
            match ctx.recv().await {
                ActoInput::NoMoreSenders => "no send".to_owned(),
                ActoInput::Supervision { .. } => unreachable!(),
                ActoInput::Message(m) => {
                    println!("received {}", m);
                    "send".to_owned()
                }
            }
        });
        r.me.send(5 * m);
        let result = r.handle.join().await;
        println!("actor result: {:?}", result);
    }
}

#[cfg(feature = "tokio")]
fn main() {
    let system = acto::AcTokio::new("theMain", 2).unwrap();
    let SupervisionRef { me: r, handle: j } = system.spawn_actor("supervisor", actor);
    r.send(1);
    r.send(2);
    let x = system.with_rt(|rt| rt.block_on(j.join()));
    println!("result: {:?}", x);
}

#[cfg(not(feature = "tokio"))]
fn main() {
    println!("This example requires the 'tokio' feature");
}