From: bhuvan-somisetty Date: Sat, 10 Oct 2026 23:32:04 +0000 (+0530) Subject: feat(chain): derive Copy and implement AddAssign, Sum for Balance X-Git-Url: http://internal-gitweb-vhost/-client-interface/%22https:/src/struct.EncoderStringWriter.html?a=commitdiff_plain;h=55aba974b4399516f3ad05ffdb92fcea029ec826;p=bdk feat(chain): derive Copy and implement AddAssign, Sum for Balance Derive `Copy` on `Balance` and implement `AddAssign` and `Sum`. Fixes #2366. Signed-off-by: bhuvan-somisetty --- diff --git a/crates/chain/src/balance.rs b/crates/chain/src/balance.rs index 2d4dc9db..dc4db823 100644 --- a/crates/chain/src/balance.rs +++ b/crates/chain/src/balance.rs @@ -1,7 +1,7 @@ use bitcoin::Amount; /// Balance, differentiated into various categories. -#[derive(Debug, PartialEq, Eq, Clone, Default)] +#[derive(Debug, PartialEq, Eq, Clone, Copy, Default)] #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))] pub struct Balance { /// All coinbase outputs not yet matured @@ -51,3 +51,54 @@ impl core::ops::Add for Balance { } } } + +impl core::ops::AddAssign for Balance { + fn add_assign(&mut self, other: Self) { + *self = *self + other; + } +} + +impl core::iter::Sum for Balance { + fn sum>(iter: I) -> Self { + iter.fold(Self::default(), core::ops::Add::add) + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_balance_add_assign_and_sum() { + let b1 = Balance { + immature: Amount::from_sat(10), + trusted_pending: Amount::from_sat(20), + untrusted_pending: Amount::from_sat(30), + confirmed: Amount::from_sat(40), + }; + let b2 = Balance { + immature: Amount::from_sat(1), + trusted_pending: Amount::from_sat(2), + untrusted_pending: Amount::from_sat(3), + confirmed: Amount::from_sat(4), + }; + + let mut b = b1; + b += b2; + assert_eq!( + b, + Balance { + immature: Amount::from_sat(11), + trusted_pending: Amount::from_sat(22), + untrusted_pending: Amount::from_sat(33), + confirmed: Amount::from_sat(44), + } + ); + + assert_eq!( + core::iter::empty::().sum::(), + Balance::default() + ); + assert_eq!([b1, b2, b1].into_iter().sum::(), b1 + b2 + b1); + } +}