From 55aba974b4399516f3ad05ffdb92fcea029ec826 Mon Sep 17 00:00:00 2001 From: bhuvan-somisetty Date: Sun, 11 Oct 2026 05:02:04 +0530 Subject: [PATCH] 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 --- crates/chain/src/balance.rs | 53 ++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) 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); + } +} -- 2.49.0