use std::rc::Rc; use crate::expressions::expression::Expression; use crate::expressions::operator::BinaryOperator; impl Expression { #[inline] #[must_use] pub fn and(self, other: impl Into>) -> Expression { and(self, other) } #[inline] #[must_use] pub fn or(self, other: impl Into>) -> Expression { or(self, other) } #[inline] #[must_use] pub fn implies(self, other: impl Into>) -> Expression { implies(self, other) } #[inline] #[must_use] pub fn not(self) -> Expression { not(self) } } #[inline] #[must_use] pub fn and(left: L, right: R) -> Expression where L: Into>, R: Into>, { binary(left, BinaryOperator::And, right) } #[inline] #[must_use] pub fn or(left: L, right: R) -> Expression where L: Into>, R: Into>, { binary(left, BinaryOperator::Or, right) } #[inline] #[must_use] pub fn implies(left: L, right: R) -> Expression where L: Into>, R: Into>, { binary(left, BinaryOperator::Implication, right) } #[inline] #[must_use] pub fn binary(left: L, operator: BinaryOperator, right: R) -> Expression where L: Into>, R: Into>, { Expression::Binary { left: left.into(), operator, right: right.into() } } #[inline] #[must_use] pub fn not>>(value: T) -> Expression { Expression::Not(value.into()) } #[inline] #[must_use] pub fn atomic>(value: T) -> Expression { Expression::Atomic(value.into()) } // TODO eval function using nom parser