fructose/properties/
general.rs

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
12// TODO: use this
13// TODO: impl this for exponentiation and tetration
14pub 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
31// marker trait for rings without a zero
32pub trait NonZero {}
33
34// TODO: implement those and add more
35// pub trait PartiallyEqual<O: Operator>: Set<O> {
36//     fn eq(&self, other: &Self) -> bool;
37// }
38// pub trait PartiallyOrdered<O: Operator>: PartiallyEqual<O> {
39//     fn partial_comparison(&self, other: &Self) -> Option<Ordering>;
40//     fn is_less(&self, other: &Self) -> bool;
41//     fn is_less_or_equal(&self, other: &Self) -> bool;
42//     fn is_greater(&self, other: &Self) -> bool;
43//     fn is_greater_or_equal(&self, other: &Self) -> bool;
44// }
45// pub trait Ordered<O: Operator>: PartiallyOrdered<O> {
46//
47// }
48
49impl_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    // PartiallyOrdered<Additive>          => u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, f32, f64;
63    // PartiallyOrdered<Multiplicative>    => u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize, f32, f64;
64    // Ordered<Additive>                   => u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize;
65    // Ordered<Multiplicative>             => u8, u16, u32, u64, u128, usize, i8, i16, i32, i64, i128, isize;
66
67    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);