use crate::integer_polynomial::IntegerPolynomial;
use core::fmt::{Debug, Display, Formatter, Result, Write};
use malachite_base::strings::latex::ToLatex;
use malachite_base::strings::typst::ToTypst;
use malachite_base::vars::xyz::XyzVars;
use malachite_base::vars::{Var, VarScheme};
#[derive(Clone, Copy, Eq, PartialEq)]
pub(crate) enum Language {
Plain,
Latex,
Typst,
}
impl IntegerPolynomial {
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 == 0u32 {
continue;
}
if first {
first = false;
} else if *coefficient > 0u32 {
w.write_char('+')?;
}
if exponent == 0 {
write!(w, "{coefficient}")?;
continue;
}
if *coefficient == -1i32 {
w.write_char('-')?;
} else if *coefficient != 1u32 {
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 Display for IntegerPolynomial {
#[inline]
fn fmt(&self, f: &mut Formatter) -> Result {
self.write_with_var(Var::new(&XyzVars, 0), Language::Plain, f)
}
}
impl Debug for IntegerPolynomial {
#[inline]
fn fmt(&self, f: &mut Formatter) -> Result {
Display::fmt(self, f)
}
}