logic/operators/
or.rs

1use super::error::BinaryError;
2use crate::{Formula, Metric};
3
4pub struct Or<L, R> {
5    left: L,
6    right: R,
7}
8
9impl<L, R> Or<L, R> {
10    pub fn new(left: L, right: R) -> Or<L, R> {
11        Or { left, right }
12    }
13}
14
15impl<T, L, R> Formula<T> for Or<L, R>
16where
17    L: Formula<T>,
18    R: Formula<T>,
19{
20    type Error = BinaryError<L::Error, R::Error>;
21
22    fn satisfied_by(&self, value: &T) -> Result<bool, Self::Error> {
23        let left = self.left.satisfied_by(value).map_err(BinaryError::Left)?;
24        let right = self.right.satisfied_by(value).map_err(BinaryError::Right)?;
25
26        Ok(left || right)
27    }
28}
29
30impl<T, L, R> Metric<T> for Or<L, R>
31where
32    L: Metric<T>,
33    R: Metric<T>,
34{
35    type Error = BinaryError<L::Error, R::Error>;
36
37    fn distance(&self, value: &T) -> Result<f64, Self::Error> {
38        let left_dist = self.left.distance(value).map_err(BinaryError::Left)?;
39        let right_dist = self.right.distance(value).map_err(BinaryError::Right)?;
40
41        Ok(f64::max(left_dist, right_dist))
42    }
43}