use brk_types::{MempoolRecentTx, TxWithHex, Txid};
use derive_more::Deref;
use rustc_hash::FxHashMap;
const RECENT_CAP: usize = 10;
#[derive(Default, Deref)]
pub struct TxStore {
#[deref]
txs: FxHashMap<Txid, TxWithHex>,
recent: Vec<MempoolRecentTx>,
}
impl TxStore {
pub fn contains(&self, txid: &Txid) -> bool {
self.txs.contains_key(txid)
}
pub fn extend(&mut self, txs: FxHashMap<Txid, TxWithHex>) {
let mut new: Vec<_> = txs
.iter()
.take(RECENT_CAP)
.map(|(txid, tx_hex)| MempoolRecentTx::from((txid, tx_hex.tx())))
.collect();
let keep = RECENT_CAP.saturating_sub(new.len());
new.extend(self.recent.drain(..keep.min(self.recent.len())));
self.recent = new;
self.txs.extend(txs);
}
pub fn recent(&self) -> &[MempoolRecentTx] {
&self.recent
}
pub fn retain_or_remove<K, R>(&mut self, mut keep: K, mut on_remove: R)
where
K: FnMut(&Txid) -> bool,
R: FnMut(&Txid, &TxWithHex),
{
self.txs.retain(|txid, tx| {
if keep(txid) {
true
} else {
on_remove(txid, tx);
false
}
});
}
}