use crate::core::eval::eval;
use crate::core::eval::model_to_boolean;
use crate::core::Expr;
use crate::error::Result;
use crate::template::TModel;
pub struct AndExpression {
pub left: Expr,
pub right: Expr,
}
impl AndExpression {
pub fn new(left: Expr, right: Expr) -> Self {
AndExpression { left, right }
}
pub(crate) fn eval(&self, env: &mut crate::core::Environment) -> Result<TModel> {
eval_and(env, &self.left, &self.right)
}
}
pub(crate) fn eval_and(env: &mut crate::core::Environment, a: &Expr, b: &Expr) -> Result<TModel> {
let lm = eval(env, a)?;
let l = model_to_boolean(env, &lm)?;
if !l {
return Ok(TModel::from_boolean(false));
}
let rm = eval(env, b)?;
let r = model_to_boolean(env, &rm)?;
Ok(TModel::from_boolean(l && r))
}