aboutsummaryrefslogtreecommitdiff
path: root/database/src/backends/memory.rs
diff options
context:
space:
mode:
Diffstat (limited to 'database/src/backends/memory.rs')
-rw-r--r--database/src/backends/memory.rs42
1 files changed, 20 insertions, 22 deletions
diff --git a/database/src/backends/memory.rs b/database/src/backends/memory.rs
index 3c2fdea..302b232 100644
--- a/database/src/backends/memory.rs
+++ b/database/src/backends/memory.rs
@@ -41,33 +41,31 @@ impl ReadTransaction for RwLockWriteGuard<'_, Inner> {
fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>> {
Ok((**self).get(key).cloned())
}
- fn next(&self, key: &[u8]) -> Result<Option<Vec<u8>>> {
- Ok((**self)
- .range(key.to_vec()..)
- .next()
- .map(|(k, _)| k.to_owned()))
- }
- fn prev(&self, key: &[u8]) -> Result<Option<Vec<u8>>> {
- Ok((**self)
- .range(..key.to_vec())
- .next_back()
- .map(|(k, _)| k.to_owned()))
+ fn iter<'a>(
+ &'a self,
+ key: &[u8],
+ reverse: bool,
+ ) -> Result<Box<dyn Iterator<Item = Result<Vec<u8>>> + 'a>> {
+ Ok(if reverse {
+ Box::new(self.range(key.to_vec()..).map(|e| Ok(e.0.to_vec())))
+ } else {
+ Box::new(self.range(..=key.to_vec()).rev().map(|e| Ok(e.0.to_vec())))
+ })
}
}
impl ReadTransaction for RwLockReadGuard<'_, Inner> {
fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>> {
Ok((**self).get(key).cloned())
}
- fn next(&self, key: &[u8]) -> Result<Option<Vec<u8>>> {
- Ok((**self)
- .range(key.to_vec()..)
- .next()
- .map(|(k, _)| k.to_owned()))
- }
- fn prev(&self, key: &[u8]) -> Result<Option<Vec<u8>>> {
- Ok((**self)
- .range(..key.to_vec())
- .next_back()
- .map(|(k, _)| k.to_owned()))
+ fn iter<'a>(
+ &'a self,
+ key: &[u8],
+ reverse: bool,
+ ) -> Result<Box<dyn Iterator<Item = Result<Vec<u8>>> + 'a>> {
+ Ok(if reverse {
+ Box::new(self.range(key.to_vec()..).map(|e| Ok(e.0.to_vec())))
+ } else {
+ Box::new(self.range(..=key.to_vec()).rev().map(|e| Ok(e.0.to_vec())))
+ })
}
}