use dashmap::DashSet;
use pushwire_core::{ChannelKind, SystemOp};
pub(crate) struct SubscriptionTracker<C: ChannelKind> {
channels: DashSet<C>,
}
impl<C: ChannelKind> SubscriptionTracker<C> {
pub(crate) fn new() -> Self {
Self {
channels: DashSet::new(),
}
}
pub(crate) fn subscribe(&self, channels: &[C]) -> Option<SystemOp<C>> {
let mut added = Vec::new();
for ch in channels {
if self.channels.insert(*ch) {
added.push(*ch);
}
}
if added.is_empty() {
None
} else {
Some(SystemOp::Subscribe { channels: added })
}
}
pub(crate) fn unsubscribe(&self, channels: &[C]) -> Option<SystemOp<C>> {
let mut removed = Vec::new();
for ch in channels {
if self.channels.remove(ch).is_some() {
removed.push(*ch);
}
}
if removed.is_empty() {
None
} else {
Some(SystemOp::Unsubscribe { channels: removed })
}
}
pub(crate) fn active(&self) -> Vec<C> {
self.channels.iter().map(|c| *c).collect()
}
}