[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 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
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -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())
|
||||||
|
@ -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.
|
||||||
|
@ -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.
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user