1use core::ops::{Add, Div, Mul, Rem, Sub};
4
5#[derive(Copy, Clone, Debug, PartialEq, Eq)]
7pub enum Math {
8 Add,
10 Sub,
12 Mul,
14 Div,
16 Rem,
18}
19
20impl Math {
21 pub fn run<I, O>(&self, l: I, r: I) -> O
23 where
24 I: Add<Output = O> + Sub<Output = O> + Mul<Output = O> + Div<Output = O> + Rem<Output = O>,
25 {
26 match self {
27 Self::Add => l + r,
28 Self::Sub => l - r,
29 Self::Mul => l * r,
30 Self::Div => l / r,
31 Self::Rem => l % r,
32 }
33 }
34}
35
36impl Math {
37 pub fn as_str(&self) -> &'static str {
39 match self {
40 Self::Add => "+",
41 Self::Sub => "-",
42 Self::Mul => "*",
43 Self::Div => "/",
44 Self::Rem => "%",
45 }
46 }
47}
48
49#[derive(Copy, Clone, Debug, PartialEq, Eq)]
51pub enum Cmp {
52 Lt,
54 Le,
56 Gt,
58 Ge,
60 Eq,
62 Ne,
64}
65
66impl Cmp {
67 pub fn run<I: PartialOrd + PartialEq>(&self, l: &I, r: &I) -> bool {
69 match self {
70 Self::Gt => l > r,
71 Self::Ge => l >= r,
72 Self::Lt => l < r,
73 Self::Le => l <= r,
74 Self::Eq => l == r,
75 Self::Ne => l != r,
76 }
77 }
78}
79
80impl Cmp {
81 pub fn as_str(&self) -> &'static str {
83 match self {
84 Self::Lt => "<",
85 Self::Gt => ">",
86 Self::Le => "<=",
87 Self::Ge => ">=",
88 Self::Eq => "==",
89 Self::Ne => "!=",
90 }
91 }
92}