use crate::integer_polynomial::IntegerPolynomial;
use crate::natural::Natural;
use crate::natural_polynomial::NaturalPolynomial;
use alloc::vec::Vec;
use malachite_base::num::conversion::traits::ConvertibleFrom;
use malachite_base::polynomial::Polynomial;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct NaturalPolynomialFromIntegerPolynomialError;
impl TryFrom<IntegerPolynomial> for NaturalPolynomial {
type Error = NaturalPolynomialFromIntegerPolynomialError;
fn try_from(p: IntegerPolynomial) -> Result<Self, Self::Error> {
Ok(Self::from_coefficients_asc(
p.coefficients
.into_iter()
.map(|c| {
Natural::try_from(c).map_err(|_| NaturalPolynomialFromIntegerPolynomialError)
})
.collect::<Result<Vec<Natural>, _>>()?,
))
}
}
impl TryFrom<&IntegerPolynomial> for NaturalPolynomial {
type Error = NaturalPolynomialFromIntegerPolynomialError;
fn try_from(p: &IntegerPolynomial) -> Result<Self, Self::Error> {
Ok(Self::from_coefficients_asc(
p.coefficients
.iter()
.map(|c| {
Natural::try_from(c).map_err(|_| NaturalPolynomialFromIntegerPolynomialError)
})
.collect::<Result<Vec<Natural>, _>>()?,
))
}
}
impl ConvertibleFrom<&IntegerPolynomial> for NaturalPolynomial {
#[inline]
fn convertible_from(p: &IntegerPolynomial) -> bool {
p.coefficients.iter().all(Natural::convertible_from)
}
}