use crate::ast::{Constant, NamedDeBruijn, Term}; use super::{cost_model::ExBudget, Error}; pub struct EvalResult { result: Result, Error>, remaining_budget: ExBudget, initial_budget: ExBudget, logs: Vec, } impl EvalResult { pub fn new( result: Result, Error>, remaining_budget: ExBudget, initial_budget: ExBudget, logs: Vec, ) -> EvalResult { EvalResult { result, remaining_budget, initial_budget, logs, } } pub fn cost(&self) -> ExBudget { self.initial_budget - self.remaining_budget } pub fn logs(&mut self) -> Vec { std::mem::take(&mut self.logs) } pub fn failed(&self, can_error: bool) -> bool { if can_error { self.result.is_ok() && !matches!(self.result, Ok(Term::Constant(ref con)) if matches!(con.as_ref(), Constant::Bool(false))) } else { self.result.is_err() || matches!(self.result, Ok(Term::Error)) || matches!(self.result, Ok(Term::Constant(ref con)) if matches!(con.as_ref(), Constant::Bool(false))) } } pub fn result(self) -> Result, Error> { self.result } }