use crate::*;
use core::ops::{Index, IndexMut};
pub trait CapacityMut: Capacity + Reserve {}
impl<C: Capacity + Reserve> CapacityMut for C {}
pub trait Stack<T>: Collection<Item = T> + Len + Back {}
impl<T, C: Collection<Item = T> + Len + Back> Stack<T> for C {}
pub trait StackMut<T>: Stack<T> + BackMut + PushBack + PopBack {}
impl<T, C: Stack<T> + BackMut + PushBack + PopBack> StackMut<T> for C {}
pub trait Vec<T>: Stack<T> + Index<usize, Output = T> {}
impl<T, C: Stack<T> + Index<usize, Output = T>> Vec<T> for C {}
pub trait VecMut<T>: Vec<T> + StackMut<T> + IndexMut<usize> {}
impl<T, C: Vec<T> + StackMut<T> + IndexMut<usize>> VecMut<T> for C {}
pub trait Deque<T>: Stack<T> + Front {}
impl<T, C: Stack<T> + Front> Deque<T> for C {}
pub trait DequeMut<T>: StackMut<T> + FrontMut + PushFront + PopFront {}
impl<T, C: StackMut<T> + FrontMut + PushFront + PopFront> DequeMut<T> for C {}
pub trait VecDeque<T>: Deque<T> + Vec<T> {}
impl<T, C: Deque<T> + Vec<T>> VecDeque<T> for C {}
pub trait VecDequeMut<T>: VecDeque<T> + DequeMut<T> + VecMut<T> {}
impl<T, C: VecDeque<T> + DequeMut<T> + VecMut<T>> VecDequeMut<T> for C {}
pub trait Set<T>: Collection<Item = T> + Len + for<'a> Get<&'a T> {}
impl<T, C: Collection<Item = T> + Len + for<'a> Get<&'a T>> Set<T> for C {}
pub trait SetMut<T>: Set<T> + Insert<Output = bool> + for<'a> Remove<&'a T> {}
impl<T, C: Set<T> + Insert<Output = bool> + for<'a> Remove<&'a T>> SetMut<T> for C {}
pub trait Map<K, V>:
Keyed<Key = K, Item = V> + Len + for<'a> Get<&'a K> + for<'a> GetKeyValue<&'a K>
{
}
impl<K, V, C: Keyed<Key = K, Item = V> + Len + for<'a> Get<&'a K> + for<'a> GetKeyValue<&'a K>>
Map<K, V> for C
{
}
pub trait MapMut<K, V>:
Map<K, V> + for<'a> GetMut<&'a K> + MapInsert<K, Output = Option<V>> + for<'a> Remove<&'a K>
{
}
impl<
K,
V,
C: Map<K, V>
+ for<'a> GetMut<&'a K>
+ MapInsert<K, Output = Option<V>>
+ for<'a> Remove<&'a K>,
> MapMut<K, V> for C
{
}
pub trait Slab<T>: Collection<Item = T> + Len + Get<usize> {}
impl<T, C: Collection<Item = T> + Len + Get<usize>> Slab<T> for C {}
pub trait SlabMut<T>: Slab<T> + GetMut<usize> + Insert<Output = usize> + Remove<usize> {}
impl<T, C: Slab<T> + GetMut<usize> + Insert<Output = usize> + Remove<usize>> SlabMut<T> for C {}