1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use core::ops::{Mul, Sub};

use num::complex::ComplexFloat;

use crate::{quantities::{MaybeList, MaybeLists, Polynomial}, operations::Simplify, systems::Tf};

impl<T1, B1, A1, T2, B2, A2, T3, B3, A3> Sub<Tf<T2, B2, A2>> for Tf<T1, B1, A1>
where
    T1: ComplexFloat,
    T2: ComplexFloat,
    T3: ComplexFloat,
    B1: MaybeLists<T1>,
    A1: MaybeList<T1> + Clone,
    B2: MaybeLists<T2>,
    A2: MaybeList<T2> + Clone,
    B3: MaybeLists<T3>,
    A3: MaybeList<T3>,
    Polynomial<T1, A1>: Mul<Polynomial<T2, A2>, Output = Polynomial<T3, A3>>,
    Polynomial<T1, B1>: Mul<Polynomial<T2, A2>, Output: Sub<<Polynomial<T2, B2> as Mul<Polynomial<T1, A1>>>::Output, Output = Polynomial<T3, B3>>>,
    Polynomial<T2, B2>: Mul<Polynomial<T1, A1>>,
    Tf<T3, B3, A3>: Simplify
{
    type Output = <Tf<T3, B3, A3> as Simplify>::Output;

    fn sub(self, rhs: Tf<T2, B2, A2>) -> Self::Output
    {
        Tf {
            b: self.b*rhs.a.clone() - rhs.b*self.a.clone(),
            a: self.a*rhs.a
        }.simplify()
    }
}