use sim_kernel::{Expr, NumberLiteral, Symbol};
pub fn number(value: f64) -> Expr {
Expr::Number(NumberLiteral {
domain: Symbol::new("f64"),
canonical: format_f64(value),
})
}
pub fn as_f64(value: &Expr) -> Option<f64> {
match value {
Expr::Number(number) => number.canonical.parse::<f64>().ok(),
_ => None,
}
}
pub fn format_f64(value: f64) -> String {
if value.fract() == 0.0 && value.is_finite() {
format!("{}", value as i64)
} else {
format!("{value}")
}
}
pub fn point(x: f64, y: f64) -> Expr {
Expr::Vector(vec![number(x), number(y)])
}