mesocarp 0.12.1

High-performance concurrency, synchronization, scheduling, and logging primitives in Rust
Documentation
use std::sync::Arc;

use crossbeam_queue::ArrayQueue;

use crate::MesoError;

#[derive(Debug)]
pub struct Broadcaster<T: Clone>(Box<[Arc<ArrayQueue<T>>]>);

impl<T: Clone> Broadcaster<T> {
    pub fn new(feeders: usize, slots: usize) -> Self {
        let mut bc = Vec::new();
        for _ in 0..feeders {
            bc.push(Arc::new(ArrayQueue::new(slots)));
        }
        let bc = bc.into_boxed_slice();
        Self(bc)
    }

    pub fn subscribe(&self, subscriber_id: usize) -> Subscriber<T> {
        Subscriber(Arc::clone(&self.0[subscriber_id]))
    }

    pub fn push(&self, value: T) -> Result<(), MesoError> {
        self.0
            .iter()
            .try_for_each(|x| x.push(value.clone()).map_err(|_| MesoError::BuffersFull))?;
        Ok(())
    }
}

#[derive(Debug)]
pub struct Subscriber<T: Clone>(Arc<ArrayQueue<T>>);

impl<T: Clone> Subscriber<T> {
    pub fn pop(&mut self) -> Option<T> {
        self.0.pop()
    }
}