use sim_kernel::{Expr, NumberLiteral, Symbol};
pub fn sym(name: &str) -> Expr {
Expr::Symbol(Symbol::new(name))
}
pub fn qsym(ns: &str, name: &str) -> Expr {
Expr::Symbol(Symbol::qualified(ns, name))
}
pub fn keyword(name: &str) -> Symbol {
Symbol::new(name)
}
pub fn int(value: i64) -> Expr {
num("i64", &value.to_string())
}
pub fn uint(value: u64) -> Expr {
num("i64", &value.to_string())
}
pub fn float(value: f64) -> Expr {
num("f64", &format!("{value}"))
}
pub fn num(domain: &str, canonical: &str) -> Expr {
Expr::Number(NumberLiteral {
domain: Symbol::new(domain),
canonical: canonical.to_owned(),
})
}
pub fn num_q(ns: Option<&str>, name: &str, canonical: &str) -> Expr {
let domain = match ns {
Some(ns) => Symbol::qualified(ns, name),
None => Symbol::new(name),
};
Expr::Number(NumberLiteral {
domain,
canonical: canonical.to_owned(),
})
}
pub fn text(value: impl Into<String>) -> Expr {
Expr::String(value.into())
}
pub fn list(items: Vec<Expr>) -> Expr {
Expr::List(items)
}
pub fn vector(items: Vec<Expr>) -> Expr {
Expr::Vector(items)
}
pub fn entry(name: &str, value: Expr) -> (Expr, Expr) {
(sym(name), value)
}
pub fn map(entries: Vec<(&str, Expr)>) -> Expr {
Expr::Map(
entries
.into_iter()
.map(|(key, value)| (sym(key), value))
.collect(),
)
}