diff --git a/shardtree/CHANGELOG.md b/shardtree/CHANGELOG.md index 956b0af..9330901 100644 --- a/shardtree/CHANGELOG.md +++ b/shardtree/CHANGELOG.md @@ -7,6 +7,9 @@ and this project adheres to Rust's notion of ## Unreleased +### Added +- `shardtree::store::ShardStore::for_each_checkpoint` + ## [0.4.0] - 2024-08-12 This is a bugfix release that fixes a couple of subtle problems related to diff --git a/shardtree/src/store.rs b/shardtree/src/store.rs index eadd168..3fa68fd 100644 --- a/shardtree/src/store.rs +++ b/shardtree/src/store.rs @@ -116,6 +116,12 @@ pub trait ShardStore { where F: FnMut(&Self::CheckpointId, &Checkpoint) -> Result<(), Self::Error>; + /// Calls the given callback for each checkpoint in `CheckpointId` order. This is + /// essentially the immutable version of `with_checkpoints`. + fn for_each_checkpoint(&self, limit: usize, callback: F) -> Result<(), Self::Error> + where + F: FnMut(&Self::CheckpointId, &Checkpoint) -> Result<(), Self::Error>; + /// Update the checkpoint having the given identifier by mutating it with the provided /// function, and persist the updated checkpoint to the data store. /// @@ -218,6 +224,13 @@ impl ShardStore for &mut S { S::with_checkpoints(self, limit, callback) } + fn for_each_checkpoint(&self, limit: usize, callback: F) -> Result<(), Self::Error> + where + F: FnMut(&Self::CheckpointId, &Checkpoint) -> Result<(), Self::Error>, + { + S::for_each_checkpoint(self, limit, callback) + } + fn update_checkpoint_with( &mut self, checkpoint_id: &Self::CheckpointId, diff --git a/shardtree/src/store/caching.rs b/shardtree/src/store/caching.rs index 104106d..9078094 100644 --- a/shardtree/src/store/caching.rs +++ b/shardtree/src/store/caching.rs @@ -184,6 +184,12 @@ where { self.cache.with_checkpoints(limit, callback) } + fn for_each_checkpoint(&self, limit: usize, callback: F) -> Result<(), Self::Error> + where + F: FnMut(&Self::CheckpointId, &Checkpoint) -> Result<(), Self::Error>, + { + self.cache.for_each_checkpoint(limit, callback) + } fn update_checkpoint_with( &mut self, diff --git a/shardtree/src/store/memory.rs b/shardtree/src/store/memory.rs index bf3d2fd..c76a5d1 100644 --- a/shardtree/src/store/memory.rs +++ b/shardtree/src/store/memory.rs @@ -137,6 +137,17 @@ impl ShardStore for MemoryShardStore { Ok(()) } + fn for_each_checkpoint(&self, limit: usize, mut callback: F) -> Result<(), Self::Error> + where + F: FnMut(&C, &Checkpoint) -> Result<(), Self::Error>, + { + for (cid, checkpoint) in self.checkpoints.iter().take(limit) { + callback(cid, checkpoint)? + } + + Ok(()) + } + fn update_checkpoint_with( &mut self, checkpoint_id: &C,