use crate::arena::{ContextStack, DataValue, bvec};
use crate::{CompiledNode, Engine, Result};
use bumpalo::Bump;
use super::helpers::item_is_null;
#[inline]
pub(crate) fn evaluate_merge<'a>(
args: &'a [CompiledNode],
ctx: &mut ContextStack<'a>,
engine: &Engine,
arena: &'a Bump,
) -> Result<&'a DataValue<'a>> {
let mut results: Option<bumpalo::collections::Vec<'a, DataValue<'a>>> = None;
let mut push = |item: DataValue<'a>| {
results
.get_or_insert_with(|| bvec::<DataValue<'a>>(arena, args.len().max(1)))
.push(item);
};
for arg in args {
let av = engine.dispatch_node(arg, ctx, arena)?;
match av {
DataValue::Array(items) => {
for item in items.iter() {
if !item_is_null(item) {
push(*item);
}
}
}
DataValue::Null => {}
other => push(*other),
}
}
match results {
Some(v) if !v.is_empty() => Ok(arena.alloc(DataValue::Array(v.into_bump_slice()))),
_ => Ok(crate::arena::singletons::singleton_empty_array()),
}
}