bab 0.0.4

build a bus - low-level components for your next message bus
Documentation
fn main() {
    let buffer_size = 64;
    let pool_batch_count = 4;
    let pool_batch_size = 8;
    let buffer_tailroom = 0;
    let buffer_pool = bab::HeapBufferPool::new(buffer_size, pool_batch_count, pool_batch_size);
    assert_eq!(
        buffer_pool.total_buffer_count(),
        pool_batch_count * pool_batch_size
    );

    let (writer_flush_sender, mut writer_flush_receiver) = bab::new_writer_flusher();
    let writer_id = 42;
    let writer = bab::Writer::new_shared(
        buffer_pool,
        buffer_tailroom,
        writer_flush_sender.clone(),
        writer_id,
    );

    std::thread::spawn(move || {
        pollster::block_on(async {
            let mut write_buf = writer.reserve(7).await;
            write_buf[..].copy_from_slice(b"hello, ");
            let _: bab::Packet = write_buf.into();

            let mut write_buf = writer.reserve(5).await;
            write_buf[..].copy_from_slice(b"world");
            drop(write_buf);

            writer.flush();

            std::thread::sleep(std::time::Duration::from_secs(1));

            let mut write_buf = writer.reserve(1).await;
            write_buf[..].copy_from_slice(b"!");
            drop(write_buf);

            writer.flush();
        });
    });

    let received_bytes = std::cell::Cell::new(0);
    pollster::block_on(async {
        while received_bytes.get() < b"hello, world!".len() {
            for flush in writer_flush_receiver.flush().await {
                assert_eq!(flush.writer_id(), writer_id);
                received_bytes.set(received_bytes.get() + flush.len());
                println!(
                    "Flushed bytes: '{}'",
                    std::str::from_utf8(&flush[..]).unwrap()
                );
            }
        }
    });
}