|
1 | | -use core::convert::Infallible; |
| 1 | +use core::{convert::Infallible, ops::Deref}; |
2 | 2 |
|
3 | | -use alloc::{collections::BTreeMap, vec::Vec}; |
| 3 | +use alloc::{ |
| 4 | + collections::{BTreeMap, BTreeSet}, |
| 5 | + vec::Vec, |
| 6 | +}; |
4 | 7 | use bitcoin::BlockHash; |
5 | 8 |
|
6 | 9 | use crate::{BlockId, ChainOracle}; |
@@ -104,11 +107,52 @@ impl LocalChain { |
104 | 107 | } |
105 | 108 | Ok(ChangeSet(changeset)) |
106 | 109 | } |
| 110 | + |
| 111 | + /// Applies the given `changeset`. |
| 112 | + pub fn apply_changeset(&mut self, mut changeset: ChangeSet) { |
| 113 | + self.blocks.append(&mut changeset.0) |
| 114 | + } |
| 115 | + |
| 116 | + /// Updates [`LocalChain`] with an update [`LocalChain`]. |
| 117 | + /// |
| 118 | + /// This is equivilant to calling [`determine_changeset`] and [`apply_changeset`] in sequence. |
| 119 | + /// |
| 120 | + /// [`determine_changeset`]: Self::determine_changeset |
| 121 | + /// [`apply_changeset`]: Self::apply_changeset |
| 122 | + pub fn apply_update(&mut self, update: Self) -> Result<ChangeSet, UpdateError> { |
| 123 | + let changeset = self.determine_changeset(&update)?; |
| 124 | + self.apply_changeset(changeset.clone()); |
| 125 | + Ok(changeset) |
| 126 | + } |
| 127 | + |
| 128 | + pub fn initial_changeset(&self) -> ChangeSet { |
| 129 | + ChangeSet(self.blocks.clone()) |
| 130 | + } |
| 131 | + |
| 132 | + pub fn heights(&self) -> BTreeSet<u32> { |
| 133 | + self.blocks.keys().cloned().collect() |
| 134 | + } |
107 | 135 | } |
108 | 136 |
|
109 | | -#[derive(Debug, Default)] |
| 137 | +/// This is the return value of [`determine_changeset`] and represents changes to [`LocalChain`]. |
| 138 | +/// |
| 139 | +/// [`determine_changeset`]: LocalChain::determine_changeset |
| 140 | +#[derive(Debug, Default, Clone, PartialEq)] |
| 141 | +#[cfg_attr( |
| 142 | + feature = "serde", |
| 143 | + derive(serde::Deserialize, serde::Serialize), |
| 144 | + serde(crate = "serde_crate") |
| 145 | +)] |
110 | 146 | pub struct ChangeSet(pub BTreeMap<u32, BlockHash>); |
111 | 147 |
|
| 148 | +impl Deref for ChangeSet { |
| 149 | + type Target = BTreeMap<u32, BlockHash>; |
| 150 | + |
| 151 | + fn deref(&self) -> &Self::Target { |
| 152 | + &self.0 |
| 153 | + } |
| 154 | +} |
| 155 | + |
112 | 156 | /// Represents an update failure of [`LocalChain`].j |
113 | 157 | #[derive(Clone, Debug, PartialEq)] |
114 | 158 | pub enum UpdateError { |
|
0 commit comments