use crate::types::{ErrorKind, Value};
use super::criterion::{flatten_to_vec, matches_criterion, parse_criterion};
pub fn countifs_fn(args: &[Value]) -> Value {
if args.len() < 2 || !args.len().is_multiple_of(2) {
return Value::Error(ErrorKind::NA);
}
let pairs: Vec<(Vec<&Value>, _)> = args
.chunks(2)
.map(|chunk| {
let range = flatten_to_vec(&chunk[0]);
let crit = parse_criterion(&chunk[1]);
(range, crit)
})
.collect();
let row_count = pairs[0].0.len();
let mut count = 0usize;
for i in 0..row_count {
if pairs.iter().all(|(range, crit)| {
range.get(i).is_some_and(|v| matches_criterion(v, crit))
}) {
count += 1;
}
}
Value::Number(count as f64)
}
#[cfg(test)]
mod tests;