roundabout 0.2.0

An message oriented concurrent runtime
Documentation
use roundabout::prelude::*;
use std::time::Instant;

pub struct PingEvent(u64);

pub struct BlockingState {
    start: Instant,
    count: u64,
}

fn foo_handler(
    b: OpenMessageHandlerBuilder<BlockingState>,
    start: Instant,
) -> InitMessageHandlerBuilder<BlockingState> {
    b.on::<PingEvent>(|state, context, foo| {
        state.count += foo.0;
        if state.count % 10000 == 0 {
            let elapsed = state.start.elapsed();
            println!(
                "Ping: {} @ {:.2}/s, ",
                state.count,
                state.count as f64 / elapsed.as_secs_f64()
            );
        }

        context.sender().send(PingEvent(1));
    })
    .init(BlockingState { start, count: 0 })
}

fn main() {
    let start = Instant::now();
    let runtime = Runtime::builder(128).finish_main(|b| foo_handler(b, start));

    let mut shutdown_switch = runtime.get_shutdown_switch();
    ctrlc::set_handler(move || {
        shutdown_switch.request_shutdown();
    })
    .expect("Error setting Ctrl-C handler");

    runtime.start(PingEvent(0));
}