ospf_rust_math/algebra/concept/
group.rs1use std::ops::*;
2
3pub trait PlusSemiGroup:
4 Sized
5 + Add<Output = Self>
6 + for<'a> Add<&'a Self, Output = Self>
7 + AddAssign
8 + for<'a> AddAssign<&'a Self>
9{
10}
11
12impl<
13 T: Sized
14 + Add<Output = Self>
15 + for<'a> Add<&'a Self, Output = Self>
16 + AddAssign
17 + for<'a> AddAssign<&'a Self>,
18 > PlusSemiGroup for T
19{
20}
21
22pub trait PlusGroup:
23 PlusSemiGroup
24 + Neg<Output = Self>
25 + Sub<Output = Self>
26 + for<'a> Sub<&'a Self, Output = Self>
27 + SubAssign
28 + for<'a> SubAssign<&'a Self>
29{
30}
31
32impl<
33 T: PlusSemiGroup
34 + Neg<Output = T>
35 + Sub<Output = T>
36 + for<'a> Sub<&'a T, Output = T>
37 + SubAssign
38 + for<'a> SubAssign<&'a Self>,
39 > PlusGroup for T
40{
41}
42
43pub trait TimesSemiGroup:
44 Sized
45 + Mul<Output = Self>
46 + for<'a> Mul<&'a Self, Output = Self>
47 + MulAssign
48 + for<'a> MulAssign<&'a Self>
49{
50}
51
52impl<
53 T: Sized
54 + Mul<Output = T>
55 + for<'a> Mul<&'a T, Output = T>
56 + MulAssign
57 + for<'a> MulAssign<&'a T>,
58 > TimesSemiGroup for T
59{
60}
61
62pub trait TimesGroup:
63 TimesSemiGroup
64 + Div<Output = Self>
65 + for<'a> Div<&'a Self, Output = Self>
66 + DivAssign
67 + for<'a> DivAssign<&'a Self>
68 + Rem<Output = Self>
69 + for<'a> Rem<&'a Self, Output = Self>
70 + RemAssign
71 + for<'a> RemAssign<&'a Self>
72{
73}
74
75impl<
76 T: TimesSemiGroup
77 + Div<Output = T>
78 + for<'a> Div<&'a T, Output = T>
79 + DivAssign
80 + for<'a> DivAssign<&'a T>
81 + Rem<Output = T>
82 + for<'a> Rem<&'a T, Output = T>
83 + RemAssign
84 + for<'a> RemAssign<&'a T>,
85 > TimesGroup for T
86{
87}
88
89pub trait NumberRing: PlusGroup + TimesSemiGroup {}
90
91impl<T: PlusGroup + TimesSemiGroup> NumberRing for T {}
92
93pub trait NumberField: NumberRing + TimesGroup {}
94
95impl<T: NumberRing + TimesGroup> NumberField for T {}