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
use std::fmt;

#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, PartialOrd, Ord)]
pub enum Transient {
    Sin,
    Cos,
    Log,
    Exp
}
use self::Transient::*;

#[derive(Debug, Clone, Eq, PartialEq, Hash, PartialOrd, Ord)]
pub enum Func {
    Transient(Transient),
    Diff(String),
}
use self::Func::*;

impl From<Transient> for Func {
    fn from(t: Transient) -> Func {
        Func::Transient(t)
    }
}

impl fmt::Display for Func {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match *self {
            Transient(t) => {
                let name = match t {
                    Sin => "sin",
                    Cos => "cos",
                    Log => "log",
                    Exp => "exp"
                };
                f.write_str(name)
            },
            Diff(ref var) => write!(f, "d/d{}", var)
        }
    }
}