From 5af43c186a434e2cfae3c8c4988c09b1a34a2bf4 Mon Sep 17 00:00:00 2001 From: Phodal Huang Date: Mon, 7 Nov 2022 23:07:43 +0800 Subject: [PATCH] feat: add max and min functions #13 --- extensions/ext-computing/src/expr/parser.rs | 31 +++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/extensions/ext-computing/src/expr/parser.rs b/extensions/ext-computing/src/expr/parser.rs index 718bf89..413410f 100644 --- a/extensions/ext-computing/src/expr/parser.rs +++ b/extensions/ext-computing/src/expr/parser.rs @@ -133,8 +133,24 @@ fn execute_func(func_name: &str, args: Vec) -> f64 { "ceil" => args[0].ceil(), "round" => args[0].round(), "signum" => args[0].signum(), - "max" => args[0].max(args[1]), - "min" => args[0].min(args[1]), + "max" => { + let mut max = args[0]; + for arg in args { + if arg > max { + max = arg; + } + } + max + }, + "min" => { + let mut min = args[0]; + for arg in args { + if arg < min { + min = arg; + } + } + min + }, "pow" => args[0].powf(args[1]), "clamp" => args[0].max(args[1]).min(args[2]), _ => panic!("Function not implemented: {}", func_name), @@ -167,6 +183,17 @@ mod tests { assert_eq!(parse("sqrt(1 - (3 / 3^2))", &vars), 0.816496580927726); } + #[test] + fn max_min() { + assert_eq!(parse("max(1, 2)", &Default::default()), 2.0); + assert_eq!(parse("min(1, 2)", &Default::default()), 1.0); + assert_eq!(parse("max(1, 2, 3)", &Default::default()), 3.0); + assert_eq!(parse("min(1, 2, 3)", &Default::default()), 1.0); + + let vars = BTreeMap::from_iter(vec![("x".to_string(), Instruction::Const(2.0))]); + assert_eq!(parse("1.2 + max(1, 2, 3, x)", &vars), 4.2); + } + #[test] fn const_e() { let vars2 = BTreeMap::from_iter(vec![("x".to_string(), Instruction::Const(2.0))]);