mod async_impl;
mod core;
mod mailbox;
mod sync_impl;
use parking_lot::Mutex;
use std::collections::HashSet;
use std::hash::Hash;
use std::sync::{
atomic::{AtomicBool, Ordering},
Arc,
};
pub use async_impl::{AsyncTopicReceiver, AsyncTopicSender};
pub use sync_impl::{TopicReceiver, TopicSender};
pub fn channel<K, T>(mailbox_capacity: usize) -> (TopicSender<K, T>, TopicReceiver<K, T>)
where
K: Eq + Hash + Clone + Send + Sync + 'static,
T: Send + Clone + 'static,
{
let dispatcher = Arc::new(core::SpmcTopicDispatcher::new());
dispatcher.receiver_count.store(1, Ordering::Relaxed);
let (p, c) = mailbox::channel(mailbox_capacity);
let sender = TopicSender {
dispatcher: Arc::clone(&dispatcher),
closed: AtomicBool::new(false),
};
let receiver = TopicReceiver {
dispatcher: Arc::downgrade(&dispatcher),
consumer: c,
producer_mailbox: Arc::new(p),
subscriptions: Arc::new(Mutex::new(HashSet::new())),
closed: AtomicBool::new(false),
};
(sender, receiver)
}
pub fn channel_async<K, T>(
mailbox_capacity: usize,
) -> (AsyncTopicSender<K, T>, AsyncTopicReceiver<K, T>)
where
K: Eq + Hash + Clone + Send + Sync + 'static,
T: Send + Clone + 'static,
{
let dispatcher = Arc::new(core::SpmcTopicDispatcher::new());
dispatcher.receiver_count.store(1, Ordering::Relaxed);
let (p, c) = mailbox::channel(mailbox_capacity);
let sender = AsyncTopicSender {
dispatcher: Arc::clone(&dispatcher),
closed: AtomicBool::new(false),
};
let receiver = AsyncTopicReceiver {
dispatcher: Arc::downgrade(&dispatcher),
consumer: c,
producer_mailbox: Arc::new(p),
subscriptions: Arc::new(Mutex::new(HashSet::new())),
closed: AtomicBool::new(false),
};
(sender, receiver)
}