use tokio::sync::broadcast;
use crate::market::MarketDataEvent;
use crate::signal::Signal;
const DEFAULT_CAPACITY: usize = 1024;
#[derive(Debug, Clone)]
pub struct MarketDataBus {
tx: broadcast::Sender<MarketDataEvent>,
}
impl MarketDataBus {
pub fn new() -> Self {
Self::with_capacity(DEFAULT_CAPACITY)
}
pub fn with_capacity(capacity: usize) -> Self {
let (tx, _) = broadcast::channel(capacity);
Self { tx }
}
pub fn subscribe(&self) -> broadcast::Receiver<MarketDataEvent> {
self.tx.subscribe()
}
pub fn publish(&self, event: MarketDataEvent) -> usize {
self.tx.send(event).unwrap_or(0)
}
pub fn subscriber_count(&self) -> usize {
self.tx.receiver_count()
}
}
impl Default for MarketDataBus {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone)]
pub struct SignalBus {
tx: broadcast::Sender<Signal>,
}
impl SignalBus {
pub fn new() -> Self {
Self::with_capacity(DEFAULT_CAPACITY)
}
pub fn with_capacity(capacity: usize) -> Self {
let (tx, _) = broadcast::channel(capacity);
Self { tx }
}
pub fn subscribe(&self) -> broadcast::Receiver<Signal> {
self.tx.subscribe()
}
pub fn publish(&self, signal: Signal) -> usize {
self.tx.send(signal).unwrap_or(0)
}
pub fn subscriber_count(&self) -> usize {
self.tx.receiver_count()
}
}
impl Default for SignalBus {
fn default() -> Self {
Self::new()
}
}