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
use crate::AST;
use std::fmt::{self, Display, Formatter};

fn o2<T: Clone + Display>(ast: &Box<AST<T>>) -> String {
    match **ast {
        AST::Plus(..) | AST::Minus(..) => format!("({})", ast),
        _ => format!("{}", ast),
    }
}

fn o3<T: Clone + Display>(ast: &Box<AST<T>>) -> String {
    match **ast {
        AST::Plus(..) | AST::Minus(..) | AST::Times(..) | AST::Divide(..) => format!("({})", ast),
        _ => format!("{}", ast),
    }
}

impl<T: Clone + Display> Display for AST<T> {
    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
        match self {
            AST::Number(n) => write!(f, "{}", n),
            AST::Factorial(n) => write!(f, "{}!", n),
            //
            AST::Plus(l, r) => write!(f, "{} + {}", l, r),
            AST::Minus(l, r) => write!(f, "{} - {}", l, r),
            AST::Times(l, r) => write!(f, "{} × {}", o2(l), o2(r)),
            AST::Divide(l, r) => write!(f, "{} ÷ {}", o2(l), o2(r)),
            AST::Power(l, r) => write!(f, "{}^{}", o3(l), o3(r)),
            AST::Surd(l, r) => write!(f, "{}√{}", o3(l), o3(r)),
            //
            AST::Connect(l, r) => write!(f, "{}{}", l, r),
        }
    }
}