use std::{sync::Arc, time::Duration};
use nysa::Bus;
enum Add {
Two(i32, i32),
Quit,
}
struct AdditionResult(i32);
fn local_bus() {
let bus = Arc::new(Bus::new());
let adder = {
let bus = Arc::clone(&bus);
std::thread::spawn(move || loop {
match bus.wait_for::<Add>().consume() {
Add::Two(a, b) => bus.push(AdditionResult(a + b)),
Add::Quit => break,
}
})
};
bus.push(Add::Two(1, 2));
std::thread::sleep(Duration::from_secs(1));
bus.push(Add::Two(4, 5));
std::thread::sleep(Duration::from_secs(1));
bus.push(Add::Quit);
adder.join().unwrap();
for message in &bus.retrieve_all::<AdditionResult>() {
let AdditionResult(x) = message.consume();
println!("{}", x);
}
}
fn global_bus() {
use nysa::global as bus;
let adder = std::thread::spawn(move || loop {
match bus::wait_for::<Add>().consume() {
Add::Two(a, b) => bus::push(AdditionResult(a + b)),
Add::Quit => break,
}
});
bus::push(Add::Two(1, 2));
std::thread::sleep(Duration::from_secs(1));
bus::push(Add::Two(4, 5));
std::thread::sleep(Duration::from_secs(1));
bus::push(Add::Quit);
adder.join().unwrap();
for message in &bus::retrieve_all::<AdditionResult>() {
let AdditionResult(x) = message.consume();
println!("{}", x);
}
}
fn main() {
local_bus();
global_bus();
}