use crate::arena::{ContextStack, DataValue, truthy_arena};
use crate::operators::eager::Cx;
use crate::operators::meta::{Logic, Truth};
use crate::{CompiledNode, Engine, Result};
use bumpalo::Bump;
#[inline(always)]
pub(crate) fn truth(_cx: &mut Cx<'_, '_>, value: Option<bool>, op: Truth) -> Result<bool> {
Ok(op.apply(value.unwrap_or(false)))
}
#[inline]
pub(crate) fn short_circuit<'a>(
args: &'a [CompiledNode],
ctx: &mut ContextStack<'a>,
engine: &Engine,
arena: &'a Bump,
op: Logic,
) -> Result<&'a DataValue<'a>> {
let last = args.len() - 1;
for arg in &args[..last] {
let v = engine.dispatch_node(arg, ctx, arena)?;
if truthy_arena(v, engine) == op.absorbing() {
return Ok(v);
}
}
engine.dispatch_node(&args[last], ctx, arena)
}