use brk_types::{OutpointPrefix, Transaction, TxidPrefix};
use rustc_hash::FxHashMap;
#[derive(Default)]
pub struct OutpointSpends(FxHashMap<OutpointPrefix, TxidPrefix>);
impl OutpointSpends {
pub fn len(&self) -> usize {
self.0.len()
}
pub fn insert_spends(&mut self, tx: &Transaction, spender: TxidPrefix) {
for key in Self::spent_outpoints(tx) {
self.0.insert(key, spender);
}
}
pub fn remove_spends(&mut self, tx: &Transaction, spender: TxidPrefix) {
for key in Self::spent_outpoints(tx) {
if self.0.get(&key) == Some(&spender) {
self.0.remove(&key);
}
}
}
#[inline]
pub fn get(&self, key: &OutpointPrefix) -> Option<TxidPrefix> {
self.0.get(key).copied()
}
fn spent_outpoints(tx: &Transaction) -> impl Iterator<Item = OutpointPrefix> + '_ {
tx.input
.iter()
.filter(|i| !i.is_coinbase)
.map(|i| OutpointPrefix::new(TxidPrefix::from(&i.txid), i.vout))
}
}