pub trait Observable {
fn is_present(&self) -> bool;
fn is_excluded(&self) -> bool {
!self.is_present()
}
}
pub trait ObservableFeatures {
type Feature;
fn present_features(&self) -> impl Iterator<Item = &Self::Feature>;
fn present_feature_count(&self) -> usize {
self.present_features().count()
}
fn excluded_features(&self) -> impl Iterator<Item = &Self::Feature>;
fn excluded_feature_count(&self) -> usize {
self.excluded_features().count()
}
}
impl<T> ObservableFeatures for &[T]
where
T: Observable,
{
type Feature = T;
fn present_features(&self) -> impl Iterator<Item = &Self::Feature> {
self.iter().filter(|&t| t.is_present())
}
fn excluded_features(&self) -> impl Iterator<Item = &Self::Feature> {
self.iter().filter(|&t| t.is_excluded())
}
}
impl<T, const N: usize> ObservableFeatures for [T; N]
where
T: Observable,
{
type Feature = T;
fn present_features(&self) -> impl Iterator<Item = &Self::Feature> {
self.iter().filter(|&t| t.is_present())
}
fn excluded_features(&self) -> impl Iterator<Item = &Self::Feature> {
self.iter().filter(|&t| t.is_excluded())
}
}
impl<T> ObservableFeatures for Vec<T>
where
T: Observable,
{
type Feature = T;
fn present_features(&self) -> impl Iterator<Item = &Self::Feature> {
self.iter().filter(|&t| t.is_present())
}
fn excluded_features(&self) -> impl Iterator<Item = &Self::Feature> {
self.iter().filter(|&t| t.is_excluded())
}
}