1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
use super::*;

impl Display for ValkyrieOperator {
    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
        match self {
            ValkyrieOperator::Not => f.write_char('!'),
            ValkyrieOperator::Concat => f.write_str("++"),
            ValkyrieOperator::Positive => f.write_char('+'),
            ValkyrieOperator::Negative => f.write_char('-'),
            ValkyrieOperator::Plus => f.write_char('+'),
            ValkyrieOperator::Minus => f.write_char('-'),
            ValkyrieOperator::Multiply => f.write_char('*'),
            ValkyrieOperator::Divide => f.write_char('/'),
            ValkyrieOperator::Power => f.write_char('^'),
            ValkyrieOperator::Unwrap => f.write_char('!'),
            ValkyrieOperator::Raise => f.write_char('?'),
            ValkyrieOperator::Celsius => f.write_char('℃'),
            ValkyrieOperator::Fahrenheit => f.write_char('℉'),
            ValkyrieOperator::Transpose => f.write_char('ᵀ'),
            ValkyrieOperator::Transjugate => f.write_char('ᴴ'),
            ValkyrieOperator::Hermitian => f.write_str("Hermitian"),
            ValkyrieOperator::Unbox => f.write_char('*'),
            ValkyrieOperator::Unpack => f.write_str("⁑"),
            ValkyrieOperator::UnpackAll => f.write_char('⁂'),
            ValkyrieOperator::Greater => f.write_char('>'),
            ValkyrieOperator::MuchGreater => f.write_char('≫'),
            ValkyrieOperator::VeryMuchGreater => f.write_char('⋙'),
            ValkyrieOperator::Less => f.write_char('<'),
            ValkyrieOperator::MuchLess => f.write_char('≪'),
            ValkyrieOperator::VeryMuchLess => f.write_char('⋘'),
            ValkyrieOperator::Belongs(v) => match v {
                true => f.write_char('∈'),
                false => f.write_char('∉'),
            },
            ValkyrieOperator::IsA(v) => match v {
                true => f.write_char('⊑'),
                false => f.write_char('⋢'),
            },
            ValkyrieOperator::Equal(v) => match v {
                true => f.write_char('≖'),
                false => f.write_char('≠'),
            },
            ValkyrieOperator::StrictlyEqual(v) => match v {
                true => f.write_char('≡'),
                false => f.write_char('≢'),
            },
            ValkyrieOperator::Inverse => f.write_char('i'),
            ValkyrieOperator::Surd(v) => match v {
                3 => f.write_char('∛'),
                4 => f.write_char('∜'),
                _ => f.write_char('√'),
            },
            ValkyrieOperator::DivideByDecimalPower(v) => match v {
                3 => f.write_char('‰'),
                4 => f.write_char('‱'),
                _ => f.write_char('%'),
            },
        }
    }
}

impl Display for OperatorNode {
    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
        write!(f, "{}", self.kind)
    }
}

impl<E: Display> Display for PrefixNode<E> {
    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
        write!(f, "{}{}", self.operator, self.body)
    }
}

impl<E: Display> Display for InfixNode<E> {
    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
        write!(f, "{} {} {}", self.lhs, self.operator, self.rhs)
    }
}

impl<E: Display> Display for PostfixNode<E> {
    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
        write!(f, "{}{}", self.body, self.operator)
    }
}