use crate::collections::BTreeMap; use crate::{vec::Vec, MMRStore, Merge, MerkleProof, Result, MMR}; use core::cell::RefCell; use core::fmt::Debug; use core::marker::PhantomData; #[derive(Clone)] pub struct MemStore(RefCell>); impl Default for MemStore { fn default() -> Self { Self::new() } } impl MemStore { fn new() -> Self { MemStore(RefCell::new(Default::default())) } } impl MMRStore for &MemStore { fn get_elem(&self, pos: u64) -> Result> { Ok(self.0.borrow().get(&pos).cloned()) } fn append(&mut self, pos: u64, elems: Vec) -> Result<()> { let mut store = self.0.borrow_mut(); for (i, elem) in elems.into_iter().enumerate() { store.insert(pos + i as u64, elem); } Ok(()) } } pub struct MemMMR { store: MemStore, mmr_size: u64, merge: PhantomData, } impl> Default for MemMMR { fn default() -> Self { Self::new(0, Default::default()) } } impl> MemMMR { pub fn new(mmr_size: u64, store: MemStore) -> Self { MemMMR { mmr_size, store, merge: PhantomData, } } pub fn store(&self) -> &MemStore { &self.store } pub fn get_root(&self) -> Result { let mmr = MMR::>::new(self.mmr_size, &self.store); mmr.get_root() } pub fn push(&mut self, elem: T) -> Result { let mut mmr = MMR::>::new(self.mmr_size, &self.store); let pos = mmr.push(elem)?; self.mmr_size = mmr.mmr_size(); mmr.commit()?; Ok(pos) } pub fn gen_proof(&self, pos_list: Vec) -> Result> { let mmr = MMR::>::new(self.mmr_size, &self.store); mmr.gen_proof(pos_list) } }