#![no_std]
extern crate alloc;
use alloc::borrow::Cow;
use core::ops::{Deref, DerefMut};
pub type MerkleRoot = [u8; 32];
pub trait Storage<K, V>
where
V: Clone,
{
type Error;
fn insert(&mut self, key: &K, value: &V) -> Result<Option<V>, Self::Error>;
fn remove(&mut self, key: &K) -> Result<Option<V>, Self::Error>;
fn get<'a>(&'a self, key: &K) -> Result<Option<Cow<'a, V>>, Self::Error>;
fn contains_key(&self, key: &K) -> Result<bool, Self::Error>;
}
impl<K, V, S> Storage<K, V> for &mut S
where
V: Clone,
S: Storage<K, V>,
{
type Error = S::Error;
fn insert(&mut self, key: &K, value: &V) -> Result<Option<V>, S::Error> {
<S as Storage<K, V>>::insert(self.deref_mut(), key, value)
}
fn remove(&mut self, key: &K) -> Result<Option<V>, S::Error> {
<S as Storage<K, V>>::remove(self.deref_mut(), key)
}
fn get(&self, key: &K) -> Result<Option<Cow<'_, V>>, S::Error> {
<S as Storage<K, V>>::get(self.deref(), key)
}
fn contains_key(&self, key: &K) -> Result<bool, S::Error> {
<S as Storage<K, V>>::contains_key(self.deref(), key)
}
}
pub trait MerkleStorage<P, K, V>
where
V: Clone,
{
type Error;
fn insert(&mut self, parent: &P, key: &K, value: &V) -> Result<Option<V>, Self::Error>;
fn remove(&mut self, parent: &P, key: &K) -> Result<Option<V>, Self::Error>;
fn get<'a>(&'a self, parent: &P, key: &K) -> Result<Option<Cow<'a, V>>, Self::Error>;
fn contains_key(&self, parent: &P, key: &K) -> Result<bool, Self::Error>;
fn root(&mut self, parent: &P) -> Result<MerkleRoot, Self::Error>;
}
impl<P, K, V, S> MerkleStorage<P, K, V> for &mut S
where
V: Clone,
S: MerkleStorage<P, K, V>,
{
type Error = S::Error;
fn insert(&mut self, parent: &P, key: &K, value: &V) -> Result<Option<V>, S::Error> {
<S as MerkleStorage<P, K, V>>::insert(self.deref_mut(), parent, key, value)
}
fn remove(&mut self, parent: &P, key: &K) -> Result<Option<V>, S::Error> {
<S as MerkleStorage<P, K, V>>::remove(self.deref_mut(), parent, key)
}
fn get(&self, parent: &P, key: &K) -> Result<Option<Cow<'_, V>>, S::Error> {
<S as MerkleStorage<P, K, V>>::get(self.deref(), parent, key)
}
fn contains_key(&self, parent: &P, key: &K) -> Result<bool, S::Error> {
<S as MerkleStorage<P, K, V>>::contains_key(self.deref(), parent, key)
}
fn root(&mut self, parent: &P) -> Result<MerkleRoot, S::Error> {
<S as MerkleStorage<P, K, V>>::root(self.deref_mut(), parent)
}
}