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