use crate::fuel::Fuel;
use crate::heap::Heap;
use crate::value::Value;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Outcome {
Normal(Value),
Throw(Value),
}
impl Outcome {
#[must_use]
pub fn map_normal(self, f: impl FnOnce(Value) -> Value) -> Self {
match self {
Self::Normal(v) => Self::Normal(f(v)),
Self::Throw(v) => Self::Throw(v),
}
}
}
pub type EvalResult = Result<(Outcome, Heap, Fuel), crate::error::Error>;
pub fn step<F>(result: EvalResult, k: F) -> EvalResult
where
F: FnOnce(Value, Heap, Fuel) -> EvalResult,
{
result.and_then(|(outcome, heap, fuel)| match outcome {
Outcome::Throw(v) => Ok((Outcome::Throw(v), heap, fuel)),
Outcome::Normal(v) => k(v, heap, fuel),
})
}