9 releases
0.1.8 | Apr 6, 2021 |
---|---|
0.1.7 | Apr 6, 2021 |
0.1.5 | Mar 18, 2021 |
0.1.2 | Sep 17, 2020 |
#1196 in Concurrency
22 downloads per month
37KB
950 lines
Theatre
A concise async actor model implementation
See the examples
folder to get a sense of how Theatre works.
Accumulator example
use theatre::prelude::*;
#[derive(Default)]
struct Accumulator {
count: i32,
}
impl Actor for Accumulator {}
struct Increment;
impl Message for Increment {
type Return = ();
}
struct GetCount;
impl Message for GetCount {
type Return = i32;
}
#[async_trait]
impl Handler<Increment> for Accumulator {
async fn handle(
&mut self,
_msg: Increment,
_context: &mut Context<Self>,
) -> <Increment as Message>::Return {
println!("Adding 1");
self.count += 1
}
}
#[async_trait]
impl Handler<GetCount> for Accumulator {
async fn handle(
&mut self,
_msg: GetCount,
_context: &mut Context<Self>,
) -> <GetCount as Message>::Return {
self.count
}
}
#[tokio::main]
async fn main() {
let mut acc = Accumulator::default().start().await.0;
assert_eq!(0, acc.send(GetCount).await.unwrap());
acc.send(Increment).await.unwrap();
acc.send(Increment).await.unwrap();
acc.send(Increment).await.unwrap();
acc.send(Increment).await.unwrap();
println!("Value: {}", acc.send(GetCount).await.unwrap());
assert_eq!(4, acc.send(GetCount).await.unwrap());
}
Dependencies
~3–9.5MB
~89K SLoC