use std::collections::{HashMap, BTreeMap, HashSet, BTreeSet};
use std::hash::Hash;
use derive_new::new;
use super::functions::evaluate::{EvaluateFunction, EvaluateFunctionRef};
pub trait MapHasKeyOrSequenceHasElement< Key > {
fn map_has_key_or_sequence_has_element( &self, key: &Key ) -> bool;
}
impl < Key: Hash + std::cmp::Eq, Val> MapHasKeyOrSequenceHasElement< Key > for HashMap< Key, Val > {
fn map_has_key_or_sequence_has_element( &self, key: &Key ) -> bool { self.contains_key( key ) }
}
impl < Key: Ord, Val> MapHasKeyOrSequenceHasElement< Key > for BTreeMap< Key, Val > {
fn map_has_key_or_sequence_has_element( &self, key: &Key ) -> bool { self.contains_key( key ) }
}
impl < Key: Hash + std::cmp::Eq > MapHasKeyOrSequenceHasElement< Key > for HashSet< Key > {
fn map_has_key_or_sequence_has_element( &self, key: &Key ) -> bool { self.contains( key ) }
}
impl < Key: Ord > MapHasKeyOrSequenceHasElement< Key > for BTreeSet< Key > {
fn map_has_key_or_sequence_has_element( &self, key: &Key ) -> bool { self.contains( key ) }
}
impl < Key: std::cmp::PartialEq > MapHasKeyOrSequenceHasElement< Key > for Vec< Key > {
fn map_has_key_or_sequence_has_element( &self, key: &Key ) -> bool { self.contains( key ) }
}
impl < 'a, Key, T: MapHasKeyOrSequenceHasElement< Key > > MapHasKeyOrSequenceHasElement< Key > for &'a T {
fn map_has_key_or_sequence_has_element( &self, key: &Key ) -> bool { (*self).map_has_key_or_sequence_has_element( key ) }
}
#[derive(Copy, Clone, Debug, new)]
pub struct MapHasKeyOrSequenceHasElementEvaluateFunctionWrapper< T >{
predicate: T
}
impl < T, Key >
EvaluateFunction
< Key, bool > for
MapHasKeyOrSequenceHasElementEvaluateFunctionWrapper
< T > where
T: MapHasKeyOrSequenceHasElement< Key >
{
fn evaluate_function( &self, input: Key ) -> bool {
self.predicate.map_has_key_or_sequence_has_element( & input )
}
}
impl < T, Key >
EvaluateFunctionRef
< Key, bool > for
MapHasKeyOrSequenceHasElementEvaluateFunctionWrapper
< T > where
T: MapHasKeyOrSequenceHasElement< Key >
{
fn evaluate_function_ref( &self, input: &Key ) -> bool {
self.predicate.map_has_key_or_sequence_has_element( input )
}
}