use crate::rational_polynomial::RationalPolynomial;
use core::mem::take;
use malachite_nz::integer_polynomial::IntegerPolynomial;
use malachite_nz::natural::Natural;
impl RationalPolynomial {
pub fn mutate_numerator<F: FnOnce(&mut IntegerPolynomial) -> T, T>(&mut self, f: F) -> T {
let out = f(&mut self.numerator);
*self = Self::canonicalize(take(&mut self.numerator), take(&mut self.denominator));
out
}
pub fn mutate_denominator<F: FnOnce(&mut Natural) -> T, T>(&mut self, f: F) -> T {
let out = f(&mut self.denominator);
assert_ne!(self.denominator, 0u32, "the denominator may not be zero");
*self = Self::canonicalize(take(&mut self.numerator), take(&mut self.denominator));
out
}
pub fn mutate_numerator_and_denominator<
F: FnOnce(&mut IntegerPolynomial, &mut Natural) -> T,
T,
>(
&mut self,
f: F,
) -> T {
let out = f(&mut self.numerator, &mut self.denominator);
assert_ne!(self.denominator, 0u32, "the denominator may not be zero");
*self = Self::canonicalize(take(&mut self.numerator), take(&mut self.denominator));
out
}
}