1use num::Float;
2
3#[derive(Debug, Clone, Copy, Eq, PartialEq)]
4pub enum RPNToken<T: Float + Copy> {
5 Operand(T),
6 Operator(Operator),
7 Var(char),
8}
9
10#[derive(Debug, Clone, Copy, Eq, PartialEq)]
11pub enum Operator {
12 PLUS,
13 MINUS,
14 MULTI,
15 DIVIDE,
16 POWER,
17 FACTORIAL,
18 LPAREN,
19 RPAREN,
20}
21
22impl Operator {
23 pub fn val(&self) -> u32 {
24 match *self {
25 Operator::LPAREN | Operator::RPAREN => 0,
26 Operator::PLUS | Operator::MINUS => 1,
27 Operator::MULTI | Operator::DIVIDE => 2,
28 Operator::POWER => 3,
29 Operator::FACTORIAL => 4,
30 }
31 }
32
33 pub fn try_from_char(c: char) -> Option<Operator> {
34 Some(match c {
35 '+' => Operator::PLUS,
36 '-' => Operator::MINUS,
37 '*' => Operator::MULTI,
38 '/' => Operator::DIVIDE,
39 '^' => Operator::POWER,
40 '(' => Operator::LPAREN,
41 ')' => Operator::RPAREN,
42 '!' => Operator::FACTORIAL,
43 _ => return None,
44 })
45 }
46}