use arrow::array::{Array, ArrayRef, BooleanArray, MutableArrayData, make_array};
use arrow::compute::{SlicesIterator, and_kleene, is_not_null};
use crate::ILResult;
pub fn scatter(mask: &BooleanArray, truthy: &dyn Array) -> ILResult<ArrayRef> {
let truthy = truthy.to_data();
let mask = and_kleene(mask, &is_not_null(mask)?)?;
let mut mutable = MutableArrayData::new(vec![&truthy], true, mask.len());
let mut filled = 0;
let mut true_pos = 0;
for (start, end) in SlicesIterator::new(&mask) {
if start > filled {
mutable.try_extend_nulls(start - filled)?;
}
let len = end - start;
mutable.try_extend(0, true_pos, true_pos + len)?;
true_pos += len;
filled = end;
}
if filled < mask.len() {
mutable.try_extend_nulls(mask.len() - filled)?;
}
let data = mutable.freeze();
Ok(make_array(data))
}