use mathexpr::{eval, Expression};
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== One-liner Evaluation ===\n");
let result = eval("2 + 3 * 4", &[], &[])?;
println!("2 + 3 * 4 = {}", result);
let result = eval("sqrt(x^2 + y^2)", &["x", "y"], &[3.0, 4.0])?;
println!("sqrt(3^2 + 4^2) = {}", result);
println!("\n=== Reusable Expressions ===\n");
let distance =
Expression::parse("sqrt((x1 - x2)^2 + (y1 - y2)^2)")?.compile(&["x1", "y1", "x2", "y2"])?;
println!("Distance formula: sqrt((x1 - x2)^2 + (y1 - y2)^2)");
println!(
" (0,0) to (3,4) = {}",
distance.eval(&[0.0, 0.0, 3.0, 4.0])?
);
println!(
" (1,1) to (4,5) = {}",
distance.eval(&[1.0, 1.0, 4.0, 5.0])?
);
println!(
" (-2,3) to (4,-1) = {}",
distance.eval(&[-2.0, 3.0, 4.0, -1.0])?
);
println!("\n=== Constants ===\n");
let circumference = Expression::parse("2 * pi * r")?.compile(&["r"])?;
println!("Circumference (r=5): {:.4}", circumference.eval(&[5.0])?);
let area = Expression::parse("pi * r^2")?.compile(&["r"])?;
println!("Area (r=5): {:.4}", area.eval(&[5.0])?);
let growth = Expression::parse("e^x")?.compile(&["x"])?;
println!("e^2 = {:.4}", growth.eval(&[2.0])?);
println!("\n=== Current Value (_) ===\n");
let normalize = Expression::parse("(_ - min) / (max - min)")?.compile(&["min", "max"])?;
println!("Normalizing to [0, 100]:");
println!(
" 25 -> {}",
normalize.eval_with_current(25.0, &[0.0, 100.0])?
);
println!(
" 50 -> {}",
normalize.eval_with_current(50.0, &[0.0, 100.0])?
);
println!(
" 75 -> {}",
normalize.eval_with_current(75.0, &[0.0, 100.0])?
);
println!("\n=== Built-in Functions ===\n");
println!("Trigonometry:");
println!(" sin(pi/6) = {:.4}", eval("sin(pi/6)", &[], &[])?);
println!(" cos(pi/3) = {:.4}", eval("cos(pi/3)", &[], &[])?);
println!(" tan(pi/4) = {:.4}", eval("tan(pi/4)", &[], &[])?);
println!("\nLogarithms:");
println!(" log(e) = {:.4}", eval("log(e)", &[], &[])?);
println!(" log10(100) = {:.4}", eval("log10(100)", &[], &[])?);
println!(" log2(8) = {:.4}", eval("log2(8)", &[], &[])?);
println!("\nRounding:");
println!(" floor(3.7) = {}", eval("floor(3.7)", &[], &[])?);
println!(" ceil(3.2) = {}", eval("ceil(3.2)", &[], &[])?);
println!(" round(3.5) = {}", eval("round(3.5)", &[], &[])?);
println!("\nBounds:");
println!(" min(5, 3) = {}", eval("min(5, 3)", &[], &[])?);
println!(" max(5, 3) = {}", eval("max(5, 3)", &[], &[])?);
println!(
" clamp(15, 0, 10) = {}",
eval("clamp(15, 0, 10)", &[], &[])?
);
println!("\nDone!");
Ok(())
}