use super::node::MathNode;
use bumpalo::Bump;
use std::borrow::Cow;
pub struct FormulaBuilder<'arena> {
arena: &'arena Bump,
}
impl<'arena> FormulaBuilder<'arena> {
pub fn new(arena: &'arena Bump) -> Self {
Self { arena }
}
pub fn alloc_str(&self, s: &str) -> &'arena str {
self.arena.alloc_str(s)
}
pub fn text(&self, text: impl Into<Cow<'arena, str>>) -> MathNode<'arena> {
MathNode::Text(text.into())
}
pub fn number(&self, num: impl Into<Cow<'arena, str>>) -> MathNode<'arena> {
MathNode::Number(num.into())
}
pub fn frac(
&self,
numerator: Vec<MathNode<'arena>>,
denominator: Vec<MathNode<'arena>>,
) -> MathNode<'arena> {
MathNode::Frac {
numerator,
denominator,
line_thickness: None,
frac_type: None,
}
}
pub fn sqrt(&self, base: Vec<MathNode<'arena>>) -> MathNode<'arena> {
MathNode::Root {
base,
index: None,
}
}
pub fn root(
&self,
base: Vec<MathNode<'arena>>,
index: Vec<MathNode<'arena>>,
) -> MathNode<'arena> {
MathNode::Root {
base,
index: Some(index),
}
}
pub fn power(
&self,
base: Vec<MathNode<'arena>>,
exponent: Vec<MathNode<'arena>>,
) -> MathNode<'arena> {
MathNode::Power {
base,
exponent,
}
}
pub fn sub(
&self,
base: Vec<MathNode<'arena>>,
subscript: Vec<MathNode<'arena>>,
) -> MathNode<'arena> {
MathNode::Sub {
base,
subscript,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::formula::ast::Formula;
#[test]
fn test_builder() {
let formula = Formula::new();
let builder = FormulaBuilder::new(formula.arena());
let node = builder.text("x");
match node {
MathNode::Text(ref text) => assert_eq!(text, "x"),
_ => panic!("Expected text node"),
}
}
}