use acty::{Actor, ActorExt, AsyncClose};
use futures::{Stream, StreamExt};
use std::pin::pin;
struct Counter;
enum CounterMessage {
Increment,
GetValue(tokio::sync::oneshot::Sender<u64>),
}
impl Actor for Counter {
type Message = CounterMessage;
async fn run(self, inbox: impl Stream<Item = Self::Message> + Send) {
let mut inbox = pin!(inbox);
let mut value = 0;
while let Some(msg) = inbox.next().await {
match msg {
CounterMessage::Increment => value += 1,
CounterMessage::GetValue(tx) => tx.send(value).unwrap_or(()),
}
}
}
}
#[tokio::main]
async fn main() {
let counter = Counter.start();
counter.send(CounterMessage::Increment).unwrap_or(());
counter.send(CounterMessage::Increment).unwrap_or(());
counter.send(CounterMessage::Increment).unwrap_or(());
let (rx, tx) = tokio::sync::oneshot::channel();
counter.send(CounterMessage::GetValue(rx)).unwrap_or(());
println!("count: {}", tx.await.unwrap());
counter.close().await;
}