use mumu::parser::types::Value;
use mumu::parser::interpreter::Interpreter;
use super::common::{is_placeholder, make_two_arg_partial};
pub fn array_drop_bridge(_interp: &mut Interpreter, args: Vec<Value>) -> Result<Value, String> {
match args.len() {
0 => Ok(make_two_arg_partial(do_drop, None, None, "array-transform-drop-partial")),
1 => {
if is_placeholder(&args[0]) {
Ok(make_two_arg_partial(do_drop, None, None, "array-transform-drop-partial"))
} else {
Ok(make_two_arg_partial(do_drop, Some(args[0].clone()), None, "array-transform-drop-partial"))
}
}
2 => {
let a1_pl = is_placeholder(&args[0]);
let a2_pl = is_placeholder(&args[1]);
if !a1_pl && !a2_pl {
do_drop(_interp, args[0].clone(), args[1].clone())
} else {
Ok(make_two_arg_partial(
do_drop,
if a1_pl { None } else { Some(args[0].clone()) },
if a2_pl { None } else { Some(args[1].clone()) },
"array-transform-drop-partial"
))
}
}
_ => Err("array:drop expects 2 arguments (count, array)".to_string()),
}
}
fn do_drop(_interp: &mut Interpreter, count: Value, arr: Value) -> Result<Value, String> {
let n = match count {
Value::Int(i) if i >= 0 => i as usize,
Value::IntArray(ref a) if a.len() == 1 && a[0] >= 0 => a[0] as usize,
_ => return Err("array:drop => first argument must be non-negative int".to_string()),
};
match arr {
Value::IntArray(xs) => Ok(Value::IntArray(xs.into_iter().skip(n).collect())),
Value::FloatArray(xs) => Ok(Value::FloatArray(xs.into_iter().skip(n).collect())),
Value::StrArray(xs) => Ok(Value::StrArray(xs.into_iter().skip(n).collect())),
Value::BoolArray(xs) => Ok(Value::BoolArray(xs.into_iter().skip(n).collect())),
Value::MixedArray(xs) => Ok(Value::MixedArray(xs.into_iter().skip(n).collect())),
_ => Err("array:drop => second argument must be an array".to_string()),
}
}