1use crate::*;
2
3pub trait Sub<Rhs: Number>: Number {
4 type Output: Number;
5}
6
7impl<Rhs: Number> Sub<Successor<Rhs>> for Zero {
8 type Output = <Successor<Rhs> as Neg>::Output;
9}
10
11impl<Rhs: Number> Sub<Negative<Successor<Rhs>>> for Zero {
12 type Output = Successor<Rhs>;
13}
14
15impl<N: Number> Sub<Zero> for N {
16 type Output = N;
17}
18
19impl<N: Number, Rhs: Number, O: Number> Sub<Successor<Rhs>> for Successor<N>
32where
33 N: Sub<Rhs, Output = O>,
34{
35 type Output = O;
36}
37
38impl<N: Number, Rhs: Number, O: Number> Sub<Negative<Rhs>> for Negative<N>
40where
41 Negative<N>: Add<Rhs, Output = O>,
42{
43 type Output = O;
44}
45
46impl<N: Number, Rhs: Number, O: Number> Sub<Negative<Rhs>> for Successor<N>
48where
49 N: Add<Rhs, Output = O>,
50{
51 type Output = Successor<O>;
52}
53
54impl<N: Number, Rhs: Number, O: Number + Neg> Sub<Successor<Rhs>> for Negative<N>
56where
57 N: Add<Successor<Rhs>, Output = O>,
58{
59 type Output = <O as Neg>::Output;
60}
61
62pub trait SubOp {
63 type Output: Number;
64}
65
66impl<Lhs: Number, Rhs: Number> SubOp for Op<Lhs, Rhs>
67where
68 Lhs: Sub<Rhs>,
69{
70 type Output = <Lhs as Sub<Rhs>>::Output;
71}