ospf_rust_math/algebra/concept/
group.rs

1use 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 {}