signal_processing 0.3.0

A signal processing library.
Documentation
use core::ops::Neg;

use num::complex::ComplexFloat;
use option_trait::Maybe;

use crate::{quantities::{MaybeList, MaybeOwnedList}, systems::{Sos, Tf}, transforms::system::{ToSos, ToTf}};

impl<T1, T2, B1, B2, A1, A2, S> Neg for Sos<T1, B1, A1, S>
where
    T1: ComplexFloat,
    T2: ComplexFloat,
    B1: Maybe<[T1; 3]> + MaybeOwnedList<T1>,
    B2: Maybe<[T2; 3]> + MaybeOwnedList<T2>,
    A1: Maybe<[T1; 3]> + MaybeOwnedList<T1>,
    A2: Maybe<[T2; 3]> + MaybeOwnedList<T2>,
    S: MaybeList<Tf<T1, B1, A1>>,
    Tf<T1, B1, A1>: Neg<Output = Tf<T2, B2, A2>> + ToTf<T2, B2, A2, (), ()> + Default,
    Self: ToSos<T1, B1, A1, Vec<Tf<T1, B1, A1>>, (), ()>
{
    type Output = Sos<T2, B2, A2, Vec<Tf<T2, B2, A2>>>;

    fn neg(self) -> Self::Output
    {
        let Sos::<_, _, _, Vec<_>> {sos} = self.to_sos((), ());
        let mut first = true;

        let mut sos: Vec<_> = sos.into_inner()
            .into_iter()
            .map(|sos| {
                if first
                {
                    first = false;
                    -sos
                }
                else
                {
                    sos.to_tf((), ())
                }
            }).collect();
        if first
        {
            sos.push(-Tf::one())
        }

        Sos::new(sos)
    }
}