/* This file is part of jellything (https://codeberg.org/metamuffin/jellything) which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2025 metamuffin */ use crate::backends::KV; use anyhow::Result; use std::{collections::BTreeMap, sync::RwLock}; pub struct Memory(RwLock, Vec>>); impl Memory { pub fn new() -> Self { Self(RwLock::new(BTreeMap::new())) } } impl KV for Memory { fn set(&self, key: &[u8], value: &[u8]) -> Result<()> { self.0.write().unwrap().insert(key.to_vec(), value.to_vec()); Ok(()) } fn get<'a>(&'a self, key: &[u8]) -> Result>> { Ok(self.0.read().unwrap().get(key).cloned()) } fn del(&self, key: &[u8]) -> Result<()> { self.0.write().unwrap().remove(key); Ok(()) } fn next(&self, key: &[u8]) -> Result>> { let r = self.0.read().unwrap(); Ok(r.range(key.to_vec()..).next().map(|(k, _)| k.to_owned())) } fn prev(&self, key: &[u8]) -> Result>> { let r = self.0.read().unwrap(); Ok(r.range(..key.to_vec()) .next_back() .map(|(k, _)| k.to_owned())) } }