diff --git a/shardtree/src/store.rs b/shardtree/src/store.rs index eadd168..2a9affb 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: Fn(&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: Fn(&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..6b26345 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: Fn(&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..d8f1f6d 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, callback: F) -> Result<(), Self::Error> + where + F: Fn(&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,