phenotypes/
observation.rs1pub trait Observable {
7 fn is_present(&self) -> bool;
9 fn is_excluded(&self) -> bool {
11 !self.is_present()
12 }
13}
14
15pub trait ObservableFeatures {
17 type Feature;
19
20 fn present_features(&self) -> impl Iterator<Item = &Self::Feature>;
22 fn present_feature_count(&self) -> usize {
24 self.present_features().count()
25 }
26
27 fn excluded_features(&self) -> impl Iterator<Item = &Self::Feature>;
29 fn excluded_feature_count(&self) -> usize {
31 self.excluded_features().count()
32 }
33}
34
35impl<T> ObservableFeatures for &[T]
36where
37 T: Observable,
38{
39 type Feature = T;
40
41 fn present_features(&self) -> impl Iterator<Item = &Self::Feature> {
42 self.iter().filter(|&t| t.is_present())
43 }
44
45 fn excluded_features(&self) -> impl Iterator<Item = &Self::Feature> {
46 self.iter().filter(|&t| t.is_excluded())
47 }
48}
49
50impl<T, const N: usize> ObservableFeatures for [T; N]
51where
52 T: Observable,
53{
54 type Feature = T;
55
56 fn present_features(&self) -> impl Iterator<Item = &Self::Feature> {
57 self.iter().filter(|&t| t.is_present())
58 }
59
60 fn excluded_features(&self) -> impl Iterator<Item = &Self::Feature> {
61 self.iter().filter(|&t| t.is_excluded())
62 }
63}
64
65impl<T> ObservableFeatures for Vec<T>
66where
67 T: Observable,
68{
69 type Feature = T;
70
71 fn present_features(&self) -> impl Iterator<Item = &Self::Feature> {
72 self.iter().filter(|&t| t.is_present())
73 }
74
75 fn excluded_features(&self) -> impl Iterator<Item = &Self::Feature> {
76 self.iter().filter(|&t| t.is_excluded())
77 }
78}