[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:
志宇 2023-04-05 17:29:20 +08:00
parent 89cfa4d78e
commit da4cef044d
No known key found for this signature in database
GPG Key ID: F6345C9837C2BDE8
5 changed files with 28 additions and 27 deletions

View File

@ -1,11 +1,11 @@
use core::{convert::Infallible, ops::AddAssign}; use core::convert::Infallible;
use bitcoin::{OutPoint, Script, Transaction, TxOut}; use bitcoin::{OutPoint, Script, Transaction, TxOut};
use crate::{ use crate::{
keychain::Balance, keychain::Balance,
tx_graph::{Additions, TxGraph, TxNode}, 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. /// 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> { impl<A: BlockAnchor, IA: Append> Append for IndexedAdditions<A, IA> {
fn add_assign(&mut self, rhs: Self) { fn append(&mut self, other: Self) {
let Self { self.graph_additions.append(other.graph_additions);
graph_additions, self.index_additions.append(other.index_additions);
index_additions: index_delta, if self.last_height < other.last_height {
last_height, let last_height = other
} = rhs; .last_height
self.graph_additions.append(graph_additions); .expect("must exist as it is larger than self.last_height");
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");
self.last_height.replace(last_height); self.last_height.replace(last_height);
} }
} }
@ -201,7 +197,7 @@ impl<A: BlockAnchor, I: TxIndex> IndexedTxGraph<A, I> {
) -> IndexedAdditions<A, I::Additions> ) -> IndexedAdditions<A, I::Additions>
where where
T: Iterator<Item = &'t Transaction>, T: Iterator<Item = &'t Transaction>,
I::Additions: Default + AddAssign, I::Additions: Default + Append,
{ {
txs.filter_map(|tx| { txs.filter_map(|tx| {
if self.index.is_tx_relevant(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| { .fold(IndexedAdditions::default(), |mut acc, other| {
acc += other; acc.append(other);
acc acc
}) })
} }

View File

@ -14,14 +14,13 @@
//! [`KeychainChangeSet`]s. //! [`KeychainChangeSet`]s.
//! //!
//! [`SpkTxOutIndex`]: crate::SpkTxOutIndex //! [`SpkTxOutIndex`]: crate::SpkTxOutIndex
use core::ops::AddAssign;
use crate::{ use crate::{
chain_graph::{self, ChainGraph}, chain_graph::{self, ChainGraph},
collections::BTreeMap, collections::BTreeMap,
sparse_chain::ChainPosition, sparse_chain::ChainPosition,
tx_graph::TxGraph, tx_graph::TxGraph,
ForEachTxOut, Append, ForEachTxOut,
}; };
#[cfg(feature = "miniscript")] #[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. /// Append another [`DerivationAdditions`] into self.
/// ///
/// If the keychain already exists, increase the index when the other's index > self's index. /// 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. /// 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)| { self.0.iter_mut().for_each(|(key, index)| {
if let Some(other_index) = other.0.remove(key) { if let Some(other_index) = other.0.remove(key) {
*index = other_index.max(*index); *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> { impl<K> Default for DerivationAdditions<K> {
fn default() -> Self { fn default() -> Self {
Self(Default::default()) Self(Default::default())

View File

@ -7,6 +7,8 @@ use alloc::{borrow::Cow, vec::Vec};
use bitcoin::{secp256k1::Secp256k1, OutPoint, Script, TxOut}; use bitcoin::{secp256k1::Secp256k1, OutPoint, Script, TxOut};
use core::{fmt::Debug, ops::Deref}; use core::{fmt::Debug, ops::Deref};
use crate::Append;
use super::DerivationAdditions; use super::DerivationAdditions;
/// Maximum [BIP32](https://bips.xyz/32) derivation index. /// Maximum [BIP32](https://bips.xyz/32) derivation index.

View File

@ -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. /// Represents an index of transaction data.
pub trait TxIndex { pub trait TxIndex {
/// The resultant "additions" when new transaction data is indexed. /// The resultant "additions" when new transaction data is indexed.

View File

@ -13,7 +13,7 @@ use bdk_chain::{
Descriptor, DescriptorPublicKey, Descriptor, DescriptorPublicKey,
}, },
sparse_chain::{self, ChainPosition}, sparse_chain::{self, ChainPosition},
DescriptorExt, FullTxOut, Append, DescriptorExt, FullTxOut,
}; };
use bdk_coin_select::{coin_select_bnb, CoinSelector, CoinSelectorOpt, WeightedValue}; use bdk_coin_select::{coin_select_bnb, CoinSelector, CoinSelectorOpt, WeightedValue};
use bdk_file_store::KeychainStore; use bdk_file_store::KeychainStore;