use std::borrow::Cow;
use snafu::prelude::*;
#[derive(Clone, Debug, Snafu)]
#[snafu(visibility(pub))]
pub enum Error {
ValueAlreadyExists,
InvalidKey,
ValueDoesNotExist,
}
pub trait Interner<K: Copy, V: Clone> {
fn intern(&mut self, value: Cow<'_, V>) -> K;
fn try_intern(&mut self, value: Cow<'_, V>) -> Result<K, Error>;
fn intern_owned(&mut self, value: V) -> K {
self.intern(Cow::Owned(value))
}
fn intern_borrowed(&mut self, value: &V) -> K {
self.intern(Cow::Borrowed(value))
}
fn remove_key(&mut self, key: K) -> Option<V>;
fn try_remove_key(&mut self, key: K) -> Result<V, Error> {
match self.remove_key(key) {
Some(value) => Ok(value),
None => InvalidKeySnafu.fail(),
}
}
fn try_update(&mut self, key: K, value: Cow<'_, V>) -> Result<V, Error>;
fn remove_value(&mut self, value: &V) -> Option<K>;
fn try_remove_value(&mut self, value: &V) -> Result<K, Error> {
self.remove_value(value).context(ValueDoesNotExistSnafu)
}
fn clear(&mut self);
fn len(&self) -> usize;
fn is_empty(&self) -> bool;
fn contains_key(&self, key: K) -> bool;
fn contains_value(&self, value: &V) -> bool;
fn get_key(&self, value: &V) -> Option<K>;
fn try_get_key(&self, value: &V) -> Result<K, Error> {
self.get_key(value).context(ValueDoesNotExistSnafu)
}
fn get_value(&self, key: K) -> Option<&V>;
fn try_get_value(&self, key: K) -> Result<&V, Error> {
self.get_value(key).context(InvalidKeySnafu)
}
fn keys(&self) -> impl Iterator<Item = K>;
fn values<'a>(&'a self) -> impl Iterator<Item = &'a V>
where
V: 'a;
fn items<'a>(&'a self) -> impl Iterator<Item = (K, &'a V)>
where
V: 'a;
}