use std::collections::HashSet;
use tokio::sync::broadcast;
use zebra_chain::transaction::UnminedTxId;
#[derive(Clone, Debug)]
pub struct MempoolTxSubscriber(broadcast::Sender<MempoolChange>);
impl MempoolTxSubscriber {
pub fn new(sender: broadcast::Sender<MempoolChange>) -> Self {
Self(sender)
}
pub fn subscribe(&self) -> broadcast::Receiver<MempoolChange> {
self.0.subscribe()
}
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum MempoolChangeKind {
Added,
Invalidated,
Mined,
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct MempoolChange {
pub kind: MempoolChangeKind,
pub tx_ids: HashSet<UnminedTxId>,
}
impl MempoolChange {
pub fn new(kind: MempoolChangeKind, tx_ids: HashSet<UnminedTxId>) -> Self {
Self { kind, tx_ids }
}
pub fn kind(&self) -> MempoolChangeKind {
self.kind
}
pub fn is_added(&self) -> bool {
self.kind == MempoolChangeKind::Added
}
pub fn into_tx_ids(self) -> HashSet<UnminedTxId> {
self.tx_ids
}
pub fn tx_ids(&self) -> &HashSet<UnminedTxId> {
&self.tx_ids
}
pub fn added(tx_ids: HashSet<UnminedTxId>) -> Self {
Self::new(MempoolChangeKind::Added, tx_ids)
}
pub fn invalidated(tx_ids: HashSet<UnminedTxId>) -> Self {
Self::new(MempoolChangeKind::Invalidated, tx_ids)
}
pub fn mined(tx_ids: HashSet<UnminedTxId>) -> Self {
Self::new(MempoolChangeKind::Mined, tx_ids)
}
}