use crate::arena::{ContextStack, DataValue};
use crate::{CompiledNode, Engine, Result};
use bumpalo::Bump;
#[inline]
pub(crate) fn evaluate_length<'a>(
args: &'a [CompiledNode],
ctx: &mut ContextStack<'a>,
engine: &Engine,
arena: &'a Bump,
) -> Result<&'a DataValue<'a>> {
if args.len() != 1 {
return Err(crate::Error::invalid_args());
}
let arg = engine.dispatch_node(&args[0], ctx, arena)?;
let n: i64 = match arg {
DataValue::String(s) => s.chars().count() as i64,
DataValue::Array(items) => items.len() as i64,
_ => return Err(crate::Error::invalid_args()),
};
if let Some(av) = crate::arena::singletons::singleton_small_int(n) {
return Ok(av);
}
Ok(arena.alloc(DataValue::Number(datavalue::NumberValue::from_i64(n))))
}