use std::sync::Mutex;
use crate::{Receiver, Sender};
use once_cell::sync::Lazy;
use std::fmt::Debug;
#[derive(Debug)]
pub struct MessageBroker<M: Debug> {
inner: Lazy<MessageBrokerInner<M>>,
}
impl<M: Debug> Default for MessageBroker<M> {
fn default() -> Self {
Self::new()
}
}
impl<M: Debug> MessageBroker<M> {
#[must_use]
pub const fn new() -> Self {
let inner: Lazy<MessageBrokerInner<M>> = Lazy::new(|| MessageBrokerInner::<M>::new());
Self { inner }
}
pub fn sender(&self) -> &Sender<M> {
&self.inner.sender
}
pub fn send(&self, input: M) {
self.inner.sender.send(input).unwrap();
}
pub(super) fn get_channel(&self) -> (Sender<M>, Option<Receiver<M>>) {
let inner = &self.inner;
(
inner.sender.clone(),
inner.input_receiver.lock().unwrap().take(),
)
}
}
struct MessageBrokerInner<M> {
sender: Sender<M>,
input_receiver: Mutex<Option<Receiver<M>>>,
}
impl<M> MessageBrokerInner<M> {
fn new() -> Self {
let (sender, input_receiver) = crate::channel::<M>();
Self {
sender,
input_receiver: Mutex::new(Some(input_receiver)),
}
}
}
impl<M> Debug for MessageBrokerInner<M> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("MessageBrokerInner")
.field("sender", &self.sender)
.finish()
}
}