use crate::common::ende::{KeyEnDeOrdered, ValueEnDe};
use crate::common::error::Result;
use crate::versioned::diff::DiffEntry;
use crate::versioned::map::VerMap;
use crate::versioned::{BranchId, CommitId};
use std::ops::Bound;
#[derive(Debug)]
pub struct Branch<'a, K, V> {
pub(super) map: &'a VerMap<K, V>,
pub(super) id: BranchId,
}
impl<'a, K, V> Branch<'a, K, V>
where
K: KeyEnDeOrdered,
V: ValueEnDe,
{
pub fn id(&self) -> BranchId {
self.id
}
pub fn name(&self) -> Option<String> {
self.map.branch_name(self.id)
}
pub fn get(&self, key: &K) -> Result<Option<V>> {
self.map.get(self.id, key)
}
pub fn contains_key(&self, key: &K) -> Result<bool> {
self.map.contains_key(self.id, key)
}
pub fn iter(&self) -> Result<impl Iterator<Item = (K, V)> + '_> {
self.map.iter(self.id)
}
pub fn range(
&self,
lo: Bound<&K>,
hi: Bound<&K>,
) -> Result<impl Iterator<Item = (K, V)> + '_> {
self.map.range(self.id, lo, hi)
}
pub fn has_uncommitted(&self) -> Result<bool> {
self.map.has_uncommitted(self.id)
}
pub fn head_commit(&self) -> Result<Option<crate::versioned::Commit>> {
self.map.head_commit(self.id)
}
pub fn log(&self) -> Result<Vec<crate::versioned::Commit>> {
self.map.log(self.id)
}
pub fn diff_uncommitted(&self) -> Result<Vec<DiffEntry>> {
self.map.diff_uncommitted(self.id)
}
}
#[derive(Debug)]
pub struct BranchMut<'a, K, V> {
pub(super) map: &'a mut VerMap<K, V>,
pub(super) id: BranchId,
}
impl<'a, K, V> BranchMut<'a, K, V>
where
K: KeyEnDeOrdered,
V: ValueEnDe,
{
pub fn id(&self) -> BranchId {
self.id
}
pub fn name(&self) -> Option<String> {
self.map.branch_name(self.id)
}
pub fn get(&self, key: &K) -> Result<Option<V>> {
self.map.get(self.id, key)
}
pub fn contains_key(&self, key: &K) -> Result<bool> {
self.map.contains_key(self.id, key)
}
pub fn iter(&self) -> Result<impl Iterator<Item = (K, V)> + '_> {
self.map.iter(self.id)
}
pub fn range(
&self,
lo: Bound<&K>,
hi: Bound<&K>,
) -> Result<impl Iterator<Item = (K, V)> + '_> {
self.map.range(self.id, lo, hi)
}
pub fn has_uncommitted(&self) -> Result<bool> {
self.map.has_uncommitted(self.id)
}
pub fn insert(&mut self, key: &K, value: &V) -> Result<()> {
self.map.insert(self.id, key, value)
}
pub fn remove(&mut self, key: &K) -> Result<()> {
self.map.remove(self.id, key)
}
pub fn commit(&mut self) -> Result<CommitId> {
self.map.commit(self.id)
}
pub fn discard(&mut self) -> Result<()> {
self.map.discard(self.id)
}
pub fn rollback_to(&mut self, target: CommitId) -> Result<()> {
self.map.rollback_to(self.id, target)
}
}