mod all;
mod any;
mod attributes;
use all::AllCapabilities;
use any::AnyCapabilities;
use attributes::AttributeCapabilities;
pub trait Capabilities<A: crate::SysAttribute, E: crate::SysEntityAttributes<A> + ?Sized> {
fn satisfies(&mut self, entity: &E) -> bool;
}
impl <F: FnMut(&E) -> bool, A: crate::SysAttribute, E: crate::SysEntityAttributes<A> + ?Sized> Capabilities<A, E> for F {
fn satisfies(&mut self, entity: &E) -> bool {
(self)(entity)
}
}
pub fn attributes<A: crate::SysAttribute, E: crate::SysEntityAttributes<A> + ?Sized>(iter: impl Iterator<Item=A>) -> impl Capabilities<A, E> {
AttributeCapabilities {
required: iter.collect(),
_entity_ty: Default::default(),
}
}
pub fn and<'a, A: crate::SysAttribute + 'a, E: crate::SysEntityAttributes<A> + ?Sized + 'a>(mut first: impl Capabilities<A, E> + 'a, mut second: impl Capabilities<A, E> + 'a) -> impl Capabilities<A, E> + 'a {
AllCapabilities {
required: vec![
Box::new(move |ent: &E| first.satisfies(ent)) as Box<dyn FnMut(&E) -> bool>,
Box::new(move |ent: &E| second.satisfies(ent)) as Box<dyn FnMut(&E) -> bool>,
],
_attr_ty: Default::default(),
_entity_ty: Default::default(),
}
}
pub fn or<'a, A: crate::SysAttribute + 'a, E: crate::SysEntityAttributes<A> + ?Sized + 'a>(mut first: impl Capabilities<A, E> + 'a, mut second: impl Capabilities<A, E> + 'a) -> impl Capabilities<A, E> + 'a {
AnyCapabilities {
required: vec![
Box::new(move |ent: &E| first.satisfies(ent)) as Box<dyn FnMut(&E) -> bool>,
Box::new(move |ent: &E| second.satisfies(ent)) as Box<dyn FnMut(&E) -> bool>,
],
_attr_ty: Default::default(),
_entity_ty: Default::default(),
}
}