diff options
Diffstat (limited to 'database/src/backends/memory.rs')
| -rw-r--r-- | database/src/backends/memory.rs | 42 |
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()))) + }) } } |