1use crate::operators::{Additive, Multiplicative, Operator};
2use std::ops::{Add, Mul, Neg};
3
4pub trait Set<O: Operator> {
5 fn operate(&self, rhs: Self) -> Self;
6}
7
8pub trait Associative<O: Operator>: Set<O> {}
9
10pub trait Commutative<O: Operator>: Set<O> {}
11
12pub trait Distributive<O: Operator = Multiplicative, Over: Operator = Additive>:
15 Set<O> + Set<Over>
16{
17}
18
19pub trait Total<O: Operator>: Set<O> {}
20
21pub trait Invertible<O: Operator>: Set<O> + Neg<Output = Self> {
22 fn inverse(&self) -> Self;
23 fn inverted(&mut self);
24}
25
26pub trait Identity<O: Operator>: Set<O> {
27 fn identity() -> Self;
28 fn is_identity(&self) -> bool;
29}
30
31pub trait NonZero {}
33
34impl_set! {
50 Additive | add => u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, f32, f64;
51 Multiplicative | mul => u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, f32, f64;
52}
53
54impl_properties! {
55 Total<Additive> => u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, f32, f64;
56 Total<Multiplicative> => u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, f32, f64;
57 Associative<Additive> => u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, f32, f64;
58 Associative<Multiplicative> => u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, f32, f64;
59 Commutative<Additive> => u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, f32, f64;
60 Commutative<Multiplicative> => u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, f32, f64;
61
62 Distributive<Multiplicative, Additive> => u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, f32, f64;
68
69 NonZero => u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, f32, f64;
70}
71
72impl_identity! {
73 0 => Additive => u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize;
74 1 => Multiplicative => u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize;
75 0.0 => Additive => f32, f64;
76 1.0 => Multiplicative => f32, f64;
77}
78
79impl_invertible_add!(i8 i16 i32 i64 i128 isize f32 f64);
80impl_invertible_mul!(f32 f64);