series 0.15.0

Laurent series and polynomials
Documentation
use num_traits::Zero;

pub(crate) fn trim_zero<C: Zero>(coeffs: &mut Vec<C>) -> usize {
    trim_end_zero(coeffs);
    trim_start_zero(coeffs)
}

pub(crate) fn trim_start_zero<C: Zero>(coeffs: &mut Vec<C>) -> usize {
    let leading_zeros_end = coeffs
        .iter()
        .position(|c| !c.is_zero())
        .unwrap_or(coeffs.len());
    coeffs.drain(..leading_zeros_end);
    leading_zeros_end
}

fn trim_end_zero<C: Zero>(coeffs: &mut Vec<C>) -> usize {
    let old_len = coeffs.len();
    let trailing_zeros_start = coeffs
        .iter()
        .rposition(|c| !c.is_zero())
        .map(|p| p + 1)
        .unwrap_or(0);
    coeffs.truncate(trailing_zeros_start);
    old_len - trailing_zeros_start
}

pub(crate) fn trim_slice_zero<C: Zero>(coeffs: &mut &[C]) -> usize {
    trim_slice_end_zero(coeffs);
    trim_slice_start_zero(coeffs)
}

pub(crate) fn trim_slice_start_zero<C: Zero>(coeffs: &mut &[C]) -> usize {
    let leading_zeros_end = coeffs
        .iter()
        .position(|c| !c.is_zero())
        .unwrap_or(coeffs.len());
    *coeffs = &coeffs[leading_zeros_end..];
    leading_zeros_end
}

fn trim_slice_end_zero<C: Zero>(coeffs: &mut &[C]) -> usize {
    let old_len = coeffs.len();
    let trailing_zeros_start = coeffs
        .iter()
        .rposition(|c| !c.is_zero())
        .map(|p| p + 1)
        .unwrap_or(0);
    *coeffs = &coeffs[..trailing_zeros_start];
    old_len - trailing_zeros_start
}