use crate::DynRestriction;
pub trait Container<T>
where T: for<'freeze> crate::Freeze<'freeze>
{
fn add<'freeze>(&mut self, value: T, restrictions: Vec<DynRestriction<'freeze, T>>) -> bool;
fn is_ready(&self) -> bool {
false
}
fn len(&self) -> usize;
fn init() -> Self where Self: Sized;
}
impl<T> Container<T> for Option<T>
where T: for<'freeze> crate::Freeze<'freeze>
{
fn add<'freeze>(&mut self, value: T, restrictions: Vec<DynRestriction<'freeze, T>>) -> bool {
self.replace(value).is_some()
}
fn is_ready(&self) -> bool {
self.is_some()
}
fn len(&self) -> usize {
if self.is_none() {
0
} else {
1
}
}
fn init() -> Self
where Self: Sized
{
None
}
}
impl<T> Container<T> for Vec<T>
where T: for<'freeze> crate::Freeze<'freeze>
{
fn add<'freeze>(&mut self, value: T, restrictions: Vec<DynRestriction<'freeze, T>>) -> bool {
self.push(value);
return false
}
fn len(&self) -> usize {
self.len()
}
fn init() -> Self
where Self: Sized
{
Vec::new()
}
}
pub trait Map<K, V>
where V: for<'freeze> crate::Freeze<'freeze>
{
fn add<'freeze>(&mut self, key: K, value: V, restrictions: Vec<DynRestriction<'freeze, V>>) -> bool;
fn is_ready(&self) -> bool {
false
}
fn len(&self) -> usize;
fn init() -> Self where Self: Sized;
}
impl<K, V> Map<K, V> for std::collections::HashMap<K, V>
where
K: Eq + std::hash::Hash,
V: for<'freeze> crate::Freeze<'freeze>
{
fn add<'freeze>(&mut self, key: K, value: V, restrictions: Vec<DynRestriction<'freeze, V>>) -> bool {
self.insert(key, value);
return false
}
fn len(&self) -> usize {
self.len()
}
fn init() -> Self
where Self: Sized
{
Self::new()
}
}