[bdk_chain_redesign] Introduce Append
trait for additions
Before, we were using `core::ops::AddAsign` but it was not the most appropriate.
This commit is contained in:
parent
89cfa4d78e
commit
da4cef044d
@ -1,11 +1,11 @@
|
||||
use core::{convert::Infallible, ops::AddAssign};
|
||||
use core::convert::Infallible;
|
||||
|
||||
use bitcoin::{OutPoint, Script, Transaction, TxOut};
|
||||
|
||||
use crate::{
|
||||
keychain::Balance,
|
||||
tx_graph::{Additions, TxGraph, TxNode},
|
||||
BlockAnchor, ChainOracle, FullTxOut, ObservedAs, TxIndex,
|
||||
Append, BlockAnchor, ChainOracle, FullTxOut, ObservedAs, TxIndex,
|
||||
};
|
||||
|
||||
/// An outwards-facing view of a transaction that is part of the *best chain*'s history.
|
||||
@ -50,18 +50,14 @@ impl<A, IA: Default> Default for IndexedAdditions<A, IA> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<A: BlockAnchor, IA: AddAssign> AddAssign for IndexedAdditions<A, IA> {
|
||||
fn add_assign(&mut self, rhs: Self) {
|
||||
let Self {
|
||||
graph_additions,
|
||||
index_additions: index_delta,
|
||||
last_height,
|
||||
} = rhs;
|
||||
self.graph_additions.append(graph_additions);
|
||||
self.index_additions += index_delta;
|
||||
if self.last_height < last_height {
|
||||
let last_height =
|
||||
last_height.expect("must exist as it is larger than self.last_height");
|
||||
impl<A: BlockAnchor, IA: Append> Append for IndexedAdditions<A, IA> {
|
||||
fn append(&mut self, other: Self) {
|
||||
self.graph_additions.append(other.graph_additions);
|
||||
self.index_additions.append(other.index_additions);
|
||||
if self.last_height < other.last_height {
|
||||
let last_height = other
|
||||
.last_height
|
||||
.expect("must exist as it is larger than self.last_height");
|
||||
self.last_height.replace(last_height);
|
||||
}
|
||||
}
|
||||
@ -201,7 +197,7 @@ impl<A: BlockAnchor, I: TxIndex> IndexedTxGraph<A, I> {
|
||||
) -> IndexedAdditions<A, I::Additions>
|
||||
where
|
||||
T: Iterator<Item = &'t Transaction>,
|
||||
I::Additions: Default + AddAssign,
|
||||
I::Additions: Default + Append,
|
||||
{
|
||||
txs.filter_map(|tx| {
|
||||
if self.index.is_tx_relevant(tx) {
|
||||
@ -211,7 +207,7 @@ impl<A: BlockAnchor, I: TxIndex> IndexedTxGraph<A, I> {
|
||||
}
|
||||
})
|
||||
.fold(IndexedAdditions::default(), |mut acc, other| {
|
||||
acc += other;
|
||||
acc.append(other);
|
||||
acc
|
||||
})
|
||||
}
|
||||
|
@ -14,14 +14,13 @@
|
||||
//! [`KeychainChangeSet`]s.
|
||||
//!
|
||||
//! [`SpkTxOutIndex`]: crate::SpkTxOutIndex
|
||||
use core::ops::AddAssign;
|
||||
|
||||
use crate::{
|
||||
chain_graph::{self, ChainGraph},
|
||||
collections::BTreeMap,
|
||||
sparse_chain::ChainPosition,
|
||||
tx_graph::TxGraph,
|
||||
ForEachTxOut,
|
||||
Append, ForEachTxOut,
|
||||
};
|
||||
|
||||
#[cfg(feature = "miniscript")]
|
||||
@ -71,12 +70,12 @@ impl<K> DerivationAdditions<K> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<K: Ord> DerivationAdditions<K> {
|
||||
impl<K: Ord> Append for DerivationAdditions<K> {
|
||||
/// Append another [`DerivationAdditions`] into self.
|
||||
///
|
||||
/// If the keychain already exists, increase the index when the other's index > self's index.
|
||||
/// If the keychain did not exist, append the new keychain.
|
||||
pub fn append(&mut self, mut other: Self) {
|
||||
fn append(&mut self, mut other: Self) {
|
||||
self.0.iter_mut().for_each(|(key, index)| {
|
||||
if let Some(other_index) = other.0.remove(key) {
|
||||
*index = other_index.max(*index);
|
||||
@ -87,12 +86,6 @@ impl<K: Ord> DerivationAdditions<K> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<K: Ord> AddAssign for DerivationAdditions<K> {
|
||||
fn add_assign(&mut self, rhs: Self) {
|
||||
self.append(rhs)
|
||||
}
|
||||
}
|
||||
|
||||
impl<K> Default for DerivationAdditions<K> {
|
||||
fn default() -> Self {
|
||||
Self(Default::default())
|
||||
|
@ -7,6 +7,8 @@ use alloc::{borrow::Cow, vec::Vec};
|
||||
use bitcoin::{secp256k1::Secp256k1, OutPoint, Script, TxOut};
|
||||
use core::{fmt::Debug, ops::Deref};
|
||||
|
||||
use crate::Append;
|
||||
|
||||
use super::DerivationAdditions;
|
||||
|
||||
/// Maximum [BIP32](https://bips.xyz/32) derivation index.
|
||||
|
@ -56,6 +56,16 @@ impl BlockAnchor for (u32, BlockHash) {
|
||||
}
|
||||
}
|
||||
|
||||
/// Trait that makes an object appendable.
|
||||
pub trait Append {
|
||||
/// Append another object of the same type onto `self`.
|
||||
fn append(&mut self, other: Self);
|
||||
}
|
||||
|
||||
impl Append for () {
|
||||
fn append(&mut self, _other: Self) {}
|
||||
}
|
||||
|
||||
/// Represents an index of transaction data.
|
||||
pub trait TxIndex {
|
||||
/// The resultant "additions" when new transaction data is indexed.
|
||||
|
@ -13,7 +13,7 @@ use bdk_chain::{
|
||||
Descriptor, DescriptorPublicKey,
|
||||
},
|
||||
sparse_chain::{self, ChainPosition},
|
||||
DescriptorExt, FullTxOut,
|
||||
Append, DescriptorExt, FullTxOut,
|
||||
};
|
||||
use bdk_coin_select::{coin_select_bnb, CoinSelector, CoinSelectorOpt, WeightedValue};
|
||||
use bdk_file_store::KeychainStore;
|
||||
|
Loading…
x
Reference in New Issue
Block a user