number_types/
sub.rs

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
19/* (0 + 1) - (0 + 1):
20Sub<
21    N = Zero as Sub<N = Zero, Rhs = Zero, Output = N>,
22    Rhs = Zero,
23    Output = N::Output,
24*/
25/* (0 + 1 + 1) - (0 + 1):
26Sub<
27    N = Successor<Zero> as Sub<N = Successor<Zero>, Rhs = Zero, Output = N>,
28    Rhs = Zero,
29    Output = N::Output,
30*/
31impl<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
38// -a - -b = -a + b
39impl<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
46// a - -b = a + b
47impl<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
54// -a - b = -(a + b)
55impl<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}