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}