]> Untitled Git - bdk/commitdiff
feat(chain): impl `PartialEq` on `CheckPoint`
author志宇 <hello@evanlinjin.me>
Mon, 25 Mar 2024 04:30:31 +0000 (12:30 +0800)
committer志宇 <hello@evanlinjin.me>
Fri, 5 Apr 2024 08:36:00 +0000 (16:36 +0800)
We impl `PartialEq` on `CheckPoint` instead of directly on `LocalChain`.
We also made the implementation more efficient.

crates/chain/src/local_chain.rs

index acb5b5138a9a555d9c146975846a1ec8d934166f..cd1b1de428c818930d1436b9c453c561c4cd9bec 100644 (file)
@@ -6,7 +6,6 @@ use core::ops::RangeBounds;
 use crate::collections::BTreeMap;
 use crate::{BlockId, ChainOracle};
 use alloc::sync::Arc;
-use alloc::vec::Vec;
 use bitcoin::block::Header;
 use bitcoin::BlockHash;
 
@@ -36,6 +35,14 @@ struct CPInner {
     prev: Option<Arc<CPInner>>,
 }
 
+impl PartialEq for CheckPoint {
+    fn eq(&self, other: &Self) -> bool {
+        let self_cps = self.iter().map(|cp| cp.block_id());
+        let other_cps = other.iter().map(|cp| cp.block_id());
+        self_cps.eq(other_cps)
+    }
+}
+
 impl CheckPoint {
     /// Construct a new base block at the front of a linked list.
     pub fn new(block: BlockId) -> Self {
@@ -220,7 +227,7 @@ impl IntoIterator for CheckPoint {
 /// Script-pubkey based syncing mechanisms may not introduce transactions in a chronological order
 /// so some updates require introducing older blocks (to anchor older transactions). For
 /// script-pubkey based syncing, `introduce_older_blocks` would typically be `true`.
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, PartialEq)]
 pub struct Update {
     /// The update chain's new tip.
     pub tip: CheckPoint,
@@ -234,23 +241,11 @@ pub struct Update {
 }
 
 /// This is a local implementation of [`ChainOracle`].
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, PartialEq)]
 pub struct LocalChain {
     tip: CheckPoint,
 }
 
-impl PartialEq for LocalChain {
-    fn eq(&self, other: &Self) -> bool {
-        self.iter_checkpoints()
-            .map(|cp| cp.block_id())
-            .collect::<Vec<_>>()
-            == other
-                .iter_checkpoints()
-                .map(|cp| cp.block_id())
-                .collect::<Vec<_>>()
-    }
-}
-
 // TODO: Figure out whether we can get rid of this
 impl From<LocalChain> for BTreeMap<u32, BlockHash> {
     fn from(value: LocalChain) -> Self {