alga/general/
specialized.rs1use crate::general::{
2 AbstractField, AbstractGroup, AbstractGroupAbelian, AbstractLoop, AbstractMagma,
3 AbstractModule, AbstractMonoid, AbstractQuasigroup, AbstractRing, AbstractRingCommutative,
4 AbstractSemigroup, Additive, ClosedAdd, ClosedDiv, ClosedMul, ClosedNeg, ClosedSub,
5 Multiplicative,
6};
7use num::{One, Zero};
8
9macro_rules! specialize_structures(
10 ($specialized: ident, $abstract_trait: ident<$($ops: ident),*> : $($bounds: ident)*) => {
12 pub trait $specialized: $abstract_trait<$($ops),*> $(+ $bounds)* { }
14 impl<T: $abstract_trait<$($ops),*> $(+ $bounds)*> $specialized for T { }
15 };
16 ($specialized: ident, $abstract_trait: ident : $($bounds: ident)*) => {
18 pub trait $specialized: $abstract_trait $(+ $bounds)* { }
20 impl<T: $abstract_trait $(+ $bounds)*> $specialized for T { }
21 }
22);
23
24specialize_structures!(AdditiveMagma, AbstractMagma<Additive> : );
25specialize_structures!(AdditiveQuasigroup, AbstractQuasigroup<Additive> : AdditiveMagma ClosedSub);
26specialize_structures!(AdditiveLoop, AbstractLoop<Additive> : AdditiveQuasigroup ClosedNeg Zero);
27specialize_structures!(AdditiveSemigroup, AbstractSemigroup<Additive> : AdditiveMagma ClosedAdd);
28specialize_structures!(AdditiveMonoid, AbstractMonoid<Additive> : AdditiveSemigroup Zero);
29specialize_structures!(AdditiveGroup, AbstractGroup<Additive> : AdditiveLoop AdditiveMonoid);
30specialize_structures!(AdditiveGroupAbelian, AbstractGroupAbelian<Additive> : AdditiveGroup);
31
32specialize_structures!(MultiplicativeMagma, AbstractMagma<Multiplicative> : );
33specialize_structures!(MultiplicativeQuasigroup, AbstractQuasigroup<Multiplicative> : MultiplicativeMagma ClosedDiv);
34specialize_structures!(MultiplicativeLoop, AbstractLoop<Multiplicative> : MultiplicativeQuasigroup One);
35specialize_structures!(MultiplicativeSemigroup, AbstractSemigroup<Multiplicative> : MultiplicativeMagma ClosedMul);
36specialize_structures!(MultiplicativeMonoid, AbstractMonoid<Multiplicative> : MultiplicativeSemigroup One);
37specialize_structures!(MultiplicativeGroup, AbstractGroup<Multiplicative> : MultiplicativeLoop MultiplicativeMonoid);
38specialize_structures!(MultiplicativeGroupAbelian, AbstractGroupAbelian<Multiplicative> : MultiplicativeGroup);
39
40specialize_structures!(Ring, AbstractRing: AdditiveGroupAbelian MultiplicativeMonoid);
41specialize_structures!(RingCommutative, AbstractRingCommutative: Ring);
42specialize_structures!(Field, AbstractField: RingCommutative MultiplicativeGroupAbelian);
43
44pub trait Module:
46 AbstractModule<AbstractRing = <Self as Module>::Ring>
47 + AdditiveGroupAbelian
48 + ClosedMul<<Self as Module>::Ring>
49{
50 type Ring: RingCommutative;
52}
53
54impl<N: RingCommutative + num::NumAssign> Module for num_complex::Complex<N> {
56 type Ring = N;
57}
58
59macro_rules! impl_module(
60 ($($T:ty),*) => {
61 $(impl Module for $T{
62 type Ring = $T;
63 })*
64 }
65);
66
67impl_module!(i8, i16, i32, i64, isize, f32, f64);