use core::borrow::Borrow;
use crate::containers::Container;
pub trait WithOne<E>: Container {
fn with_one(element: E) -> Self;
}
pub trait Assign<V = Self>: Container {
fn assign(&mut self, value: V);
}
pub trait Get<K, Q: ?Sized = K>: Container
where
K: Borrow<Q>,
{
fn get(&self, key: &Q) -> Option<&Self::Value>;
}
pub trait GetByLeft<K, Q: ?Sized = K>: Container
where
K: Borrow<Q>,
{
fn get_by_left(&self, key: &Q) -> Option<&Self::Value>;
}
pub trait GetByRight<K, Q: ?Sized = <Self as Container>::Value>: Container
where
Self::Value: Borrow<Q>,
{
fn get_by_right(&self, key: &Q) -> Option<&K>;
}
pub trait Set<K>: Container {
type Output;
fn set(&mut self, key: K, value: Self::Value) -> Self::Output;
}
pub trait Modify<K, Q: ?Sized = K>: Container
where
K: Borrow<Q>,
{
fn modify<F>(&mut self, key: &Q, f: F)
where
F: FnOnce(&mut Self::Value);
}
pub trait Insert<K>: Container {
type Output;
fn insert(&mut self, key: K, value: Self::Value) -> Self::Output;
}
pub trait Remove<K, Q: ?Sized = K>: Container
where
K: Borrow<Q>,
{
fn remove(&mut self, key: &Q) -> Option<Self::Value>;
}
pub trait RemoveByLeft<K, Q: ?Sized = K>: Container
where
K: Borrow<Q>,
{
fn remove_by_left(&mut self, key: &Q) -> Option<Self::Value>;
}
pub trait RemoveByRight<K, Q: ?Sized = <Self as Container>::Value>: Container
where
Self::Value: Borrow<Q>,
{
fn remove_by_right(&mut self, key: &Q) -> Option<K>;
}
pub trait Push<K>: Container {
fn push(&mut self, value: Self::Value) -> K;
}
pub trait Pop: Container {
fn pop(&mut self) -> Option<Self::Value>;
}
pub trait Put<E>: Container {
fn put(&mut self, element: E) -> Option<E>;
}
pub trait Clear: Container {
fn clear(&mut self);
}
pub trait Len: Container {
fn len(&self) -> Self::Key;
}
pub trait Resize: Container {
fn resize(&mut self, new_len: usize, value: Self::Value)
where
Self::Value: Clone;
}
pub trait IntoIter<K>: Container {
type IntoIter: Iterator<Item = (K, Self::Value)>;
fn into_iter(self) -> Self::IntoIter;
}