use tokio::sync::mpsc::channel;
#[tokio::main]
async fn main() {
moro::async_scope!(|scope| {
let replicas = 3;
let mut host_senders = vec![];
let mut host_futures = vec![];
for host in 0..replicas {
let (sender, receiver) = channel(222);
host_senders.push(sender);
host_futures.push(scope.spawn(replica(host, receiver)));
}
for message in ['H', 'e', 'l', 'l', 'o', '\n'] {
for sender in &host_senders {
sender.send(message).await.unwrap();
}
}
for future in host_futures {
let (host, count) = future.await;
eprintln!("Host {host} received {count} bytes.");
}
})
.await;
eprintln!("All done")
}
async fn replica(host: u32, mut receiver: tokio::sync::mpsc::Receiver<char>) -> (u32, usize) {
let mut count = 0;
while let Some(message) = receiver.recv().await {
eprintln!("Host {host} received message {message:?}");
if message == '\n' {
break;
} else {
count += 1;
}
}
(host, count)
}