kernel 1.1.0

Abstract Reactive Streams
Documentation
use queues::publisher::Publisher;
use queues::publisher::Subscriber;
use core::cell::UnsafeCell;
use intercore::message::Message;

pub fn send<'a>(bus: &'a Channel, m: Message) {
    if let Some(v) = bus.publisher.next() {
        *v = m;
        bus.publisher.commit();
    };
}

pub enum TypeId {
    Byte,
    Int,
    Float,
}

pub struct Memory {
    publishers: UnsafeCell<Vec<Publisher<Message>>>,
    subscribers: UnsafeCell<Vec<Subscriber<Message>>>,
}

pub struct Channel {
    pub id: usize,
    pub publisher: Publisher<Message>,
    pub subscribers: Vec<Subscriber<Message>>,
}

impl Memory {
    pub fn new() -> Self {
        Memory {
            publishers: UnsafeCell::new(vec![]),
            subscribers: UnsafeCell::new(vec![]),
        }
    }
    #[inline]
    pub fn publishers(&self) -> &mut Vec<Publisher<Message>> {
        unsafe { &mut *self.publishers.get() }
    }

    #[inline]
    pub fn subscribers(&self) -> &mut Vec<Subscriber<Message>> {
        unsafe { &mut *self.subscribers.get() }
    }
}