use crate::num::basic::unsigneds::PrimitiveUnsigned;
use crate::strings::latex::ToLatex;
use crate::strings::typst::ToTypst;
use crate::unsigned_polynomial::UnsignedPolynomial;
use crate::vars::xyz::XyzVars;
use crate::vars::{Var, VarScheme};
use core::fmt::{Debug, Display, Formatter, Result, Write};
#[derive(Clone, Copy, Eq, PartialEq)]
pub(crate) enum Language {
Plain,
Latex,
Typst,
}
impl<T: PrimitiveUnsigned> UnsignedPolynomial<T> {
pub(crate) fn write_with_var<W: Write, S: VarScheme + ?Sized>(
&self,
var: Var<'_, S>,
language: Language,
w: &mut W,
) -> Result {
let coefficients = self.coefficients_asc();
if coefficients.is_empty() {
return w.write_str("0");
}
let mut first = true;
for (exponent, coefficient) in coefficients.iter().enumerate().rev() {
if *coefficient == T::ZERO {
continue;
}
if first {
first = false;
} else {
w.write_char('+')?;
}
if exponent == 0 {
write!(w, "{coefficient}")?;
continue;
}
if *coefficient != T::ONE {
write!(w, "{coefficient}")?;
if language == Language::Plain {
w.write_char('*')?;
}
}
match language {
Language::Plain => write!(w, "{var}")?,
Language::Latex => write!(w, "{}", var.to_latex())?,
Language::Typst => write!(w, "{}", var.to_typst())?,
}
if exponent != 1 {
match language {
Language::Plain => write!(w, "^{exponent}")?,
_ if exponent < 10 => write!(w, "^{exponent}")?,
Language::Latex => write!(w, "^{{{exponent}}}")?,
Language::Typst => write!(w, "^({exponent})")?,
}
}
}
Ok(())
}
}
impl<T: PrimitiveUnsigned> Display for UnsignedPolynomial<T> {
#[inline]
fn fmt(&self, f: &mut Formatter) -> Result {
self.write_with_var(Var::new(&XyzVars, 0), Language::Plain, f)
}
}
impl<T: PrimitiveUnsigned> Debug for UnsignedPolynomial<T> {
#[inline]
fn fmt(&self, f: &mut Formatter) -> Result {
Display::fmt(self, f)
}
}