use crate::formula::omml::elements::{ElementContext, ElementType};
use crate::formula::omml::utils::extend_vec_efficient;
pub struct NumeratorHandler;
impl NumeratorHandler {
pub fn handle_end<'arena>(
context: &mut ElementContext<'arena>,
parent_context: Option<&mut ElementContext<'arena>>,
_arena: &'arena bumpalo::Bump,
) {
if let Some(parent) = parent_context {
if parent.element_type == ElementType::Fraction {
parent.numerator = Some(context.children.clone());
} else {
extend_vec_efficient(&mut parent.children, context.children.clone());
}
}
}
}
pub struct DenominatorHandler;
impl DenominatorHandler {
pub fn handle_end<'arena>(
context: &mut ElementContext<'arena>,
parent_context: Option<&mut ElementContext<'arena>>,
_arena: &'arena bumpalo::Bump,
) {
if let Some(parent) = parent_context {
if parent.element_type == ElementType::Fraction {
parent.denominator = Some(context.children.clone());
} else {
extend_vec_efficient(&mut parent.children, context.children.clone());
}
}
}
}
pub struct DegreeHandler;
impl DegreeHandler {
pub fn handle_end<'arena>(
context: &mut ElementContext<'arena>,
parent_context: Option<&mut ElementContext<'arena>>,
_arena: &'arena bumpalo::Bump,
) {
if let Some(parent) = parent_context {
if parent.element_type == ElementType::Radical {
parent.degree = Some(context.children.clone());
} else {
extend_vec_efficient(&mut parent.children, context.children.clone());
}
}
}
}
pub struct BaseHandler;
impl BaseHandler {
pub fn handle_end<'arena>(
context: &mut ElementContext<'arena>,
parent_context: Option<&mut ElementContext<'arena>>,
_arena: &'arena bumpalo::Bump,
) {
if let Some(parent) = parent_context {
match parent.element_type {
ElementType::Superscript | ElementType::Subscript | ElementType::SubSup => {
parent.base = Some(context.children.clone());
}
ElementType::Radical => {
parent.base = Some(context.children.clone());
}
ElementType::Accent | ElementType::Bar | ElementType::GroupChar => {
parent.base = Some(context.children.clone());
}
ElementType::Nary => {
parent.integrand = Some(context.children.clone());
}
ElementType::EqArr => {
parent.eq_array_rows.push(context.children.clone());
}
_ => {
extend_vec_efficient(&mut parent.children, context.children.clone());
}
}
}
}
}
pub struct LowerLimitHandler;
impl LowerLimitHandler {
pub fn handle_end<'arena>(
context: &mut ElementContext<'arena>,
parent_context: Option<&mut ElementContext<'arena>>,
_arena: &'arena bumpalo::Bump,
) {
if let Some(parent) = parent_context {
if parent.element_type == ElementType::Nary {
parent.lower_limit = Some(context.children.clone());
} else {
extend_vec_efficient(&mut parent.children, context.children.clone());
}
}
}
}
pub struct UpperLimitHandler;
impl UpperLimitHandler {
pub fn handle_end<'arena>(
context: &mut ElementContext<'arena>,
parent_context: Option<&mut ElementContext<'arena>>,
_arena: &'arena bumpalo::Bump,
) {
if let Some(parent) = parent_context {
if parent.element_type == ElementType::Nary {
parent.upper_limit = Some(context.children.clone());
} else {
extend_vec_efficient(&mut parent.children, context.children.clone());
}
}
}
}
pub struct IntegrandHandler;
impl IntegrandHandler {
pub fn handle_end<'arena>(
context: &mut ElementContext<'arena>,
parent_context: Option<&mut ElementContext<'arena>>,
_arena: &'arena bumpalo::Bump,
) {
if let Some(parent) = parent_context {
if parent.element_type == ElementType::Nary {
parent.integrand = Some(context.children.clone());
} else {
crate::formula::omml::utils::extend_vec_efficient(&mut parent.children, context.children.clone());
}
}
}
}
pub struct LimUppHandler;
impl LimUppHandler {
pub fn handle_end<'arena>(
context: &mut ElementContext<'arena>,
parent_context: Option<&mut ElementContext<'arena>>,
_arena: &'arena bumpalo::Bump,
) {
if let Some(parent) = parent_context {
if parent.element_type == ElementType::Nary {
parent.upper_limit = Some(context.children.clone());
} else {
crate::formula::omml::utils::extend_vec_efficient(&mut parent.children, context.children.clone());
}
}
}
}
pub struct LimLowHandler;
impl LimLowHandler {
pub fn handle_end<'arena>(
context: &mut ElementContext<'arena>,
parent_context: Option<&mut ElementContext<'arena>>,
_arena: &'arena bumpalo::Bump,
) {
if let Some(parent) = parent_context {
if parent.element_type == ElementType::Nary {
parent.lower_limit = Some(context.children.clone());
} else {
crate::formula::omml::utils::extend_vec_efficient(&mut parent.children, context.children.clone());
}
}
}
}