use std::collections::{BTreeMap, HashMap, VecDeque};
use std::fmt::Debug;
use std::hash::Hash;
use crate::IdentificationValue;
use crate::{
Causable, CausableCollectionAccessor, Identifiable, MonadicCausable, MonadicCausableCollection,
};
impl<I, O, T> MonadicCausableCollection<I, O, T> for [T]
where
T: MonadicCausable<I, O> + Clone + Causable,
O: crate::utils::monadic_collection_utils::Aggregatable
+ Clone
+ Default
+ Send
+ Sync
+ 'static
+ Debug,
{
}
impl<I, O, T> CausableCollectionAccessor<I, O, T> for [T]
where
T: MonadicCausable<I, O> + Clone + Identifiable,
{
fn get_all_items(&self) -> Vec<&T> {
self.iter().collect()
}
fn len(&self) -> usize {
<[T]>::len(self)
}
fn is_empty(&self) -> bool {
self.len() == 0
}
fn to_vec(&self) -> Vec<T> {
self.to_vec()
}
fn get_item_by_id(&self, id: IdentificationValue) -> Option<&T> {
self.iter().find(|&item| item.id() == id)
}
}
impl<I, O, T> MonadicCausableCollection<I, O, T> for VecDeque<T>
where
T: MonadicCausable<I, O> + Causable + Clone,
O: crate::utils::monadic_collection_utils::Aggregatable
+ Clone
+ Default
+ Send
+ Sync
+ 'static
+ Debug,
{
}
impl<I, O, T> CausableCollectionAccessor<I, O, T> for VecDeque<T>
where
T: MonadicCausable<I, O> + Clone + Identifiable,
{
fn get_all_items(&self) -> Vec<&T> {
self.iter().collect()
}
fn len(&self) -> usize {
VecDeque::len(self)
}
fn is_empty(&self) -> bool {
VecDeque::is_empty(self)
}
fn to_vec(&self) -> Vec<T> {
self.iter().cloned().collect()
}
fn get_item_by_id(&self, id: IdentificationValue) -> Option<&T> {
self.iter().find(|&item| item.id() == id)
}
}
impl<I, O, K, V> MonadicCausableCollection<I, O, V> for HashMap<K, V>
where
K: Eq + Hash,
V: MonadicCausable<I, O> + Causable + Clone,
O: crate::utils::monadic_collection_utils::Aggregatable
+ Clone
+ Default
+ Send
+ Sync
+ 'static
+ Debug,
{
}
impl<I, O, K, V> CausableCollectionAccessor<I, O, V> for HashMap<K, V>
where
K: Eq + Hash,
V: MonadicCausable<I, O> + Clone + Identifiable,
{
fn get_all_items(&self) -> Vec<&V> {
self.values().collect::<Vec<&V>>()
}
fn len(&self) -> usize {
HashMap::len(self)
}
fn is_empty(&self) -> bool {
HashMap::is_empty(self)
}
fn to_vec(&self) -> Vec<V> {
self.values().cloned().collect()
}
fn get_item_by_id(&self, id: IdentificationValue) -> Option<&V> {
self.values().find(|&item| item.id() == id)
}
}
impl<I, O, K, V> MonadicCausableCollection<I, O, V> for BTreeMap<K, V>
where
K: Ord,
V: MonadicCausable<I, O> + Causable + Clone,
O: crate::utils::monadic_collection_utils::Aggregatable
+ Clone
+ Default
+ Send
+ Sync
+ 'static
+ Debug,
{
}
impl<I, O, K, V> CausableCollectionAccessor<I, O, V> for BTreeMap<K, V>
where
K: Ord,
V: MonadicCausable<I, O> + Causable + Clone + Identifiable,
{
fn get_all_items(&self) -> Vec<&V> {
self.values().collect::<Vec<&V>>()
}
fn len(&self) -> usize {
BTreeMap::len(self)
}
fn is_empty(&self) -> bool {
BTreeMap::is_empty(self)
}
fn to_vec(&self) -> Vec<V> {
self.values().cloned().collect()
}
fn get_item_by_id(&self, id: IdentificationValue) -> Option<&V> {
self.values().find(|&item| item.id() == id)
}
}