1use core::ops::Mul;
2
3#[repr(i8)]
5#[derive(PartialEq, Eq, PartialOrd, Ord, Debug, Clone, Copy)]
6pub enum Sign {
7 Positive = 1,
8 Negative = -1,
9}
10
11impl Sign {
12 pub const fn flip(self) -> Self {
13 match self {
14 Self::Positive => Self::Negative,
15 Self::Negative => Self::Positive,
16 }
17 }
18}
19
20impl Mul for Sign {
22 type Output = Self;
23
24 fn mul(self, rhs: Self) -> Self {
25 if self == rhs {
26 Self::Positive
27 } else {
28 Self::Negative
29 }
30 }
31}
32
33#[cfg(test)]
34mod tests {
35 use super::Sign::{Negative, Positive};
36
37 #[test]
38 fn flip() {
39 assert_eq!(Positive.flip(), Negative);
40 assert_eq!(Negative.flip(), Positive);
41 }
42
43 #[test]
44 fn mul() {
45 assert_eq!(Positive * Positive, Positive);
46 assert_eq!(Positive * Negative, Negative);
47 assert_eq!(Negative * Positive, Negative);
48 assert_eq!(Negative * Negative, Positive);
49 }
50
51 #[test]
52 fn negative_is_less_than_positive() {
53 assert!(Negative < Positive);
54 }
55}