use crate::types::{ErrorKind, Value};
pub fn min_fn(args: &[Value]) -> Value {
if args.is_empty() {
return Value::Error(ErrorKind::NA);
}
let mut result: Option<f64> = None;
for arg in args {
match arg {
Value::Number(n) => {
result = Some(result.map_or(*n, |cur: f64| cur.min(*n)));
}
Value::Bool(b) => {
let n = if *b { 1.0 } else { 0.0 };
result = Some(result.map_or(n, |cur: f64| cur.min(n)));
}
Value::Text(s) => {
let trimmed = s.trim();
match trimmed.parse::<f64>() {
Ok(v) if v.is_finite() => {
result = Some(result.map_or(v, |cur: f64| cur.min(v)));
}
_ => return Value::Error(ErrorKind::Value),
}
}
Value::Empty => {}
Value::Array(elems) => {
for elem in elems {
match elem {
Value::Number(n) => {
result = Some(result.map_or(*n, |cur: f64| cur.min(*n)));
}
Value::Error(e) => return Value::Error(e.clone()),
_ => {}
}
}
}
Value::Error(e) => return Value::Error(e.clone()),
_ => {}
}
}
Value::Number(result.unwrap_or(0.0))
}
#[cfg(test)]
mod tests;