1use std::{
2 any::{Any, type_name_of_val},
3 fmt,
4};
5
6pub mod abc;
7pub mod expr;
8pub mod system;
9pub use expr::Equation;
10pub use expr::*;
11pub use system::System;
12
13pub enum KnownExpr<'a> {
14 Add(&'a Add),
15 Mul(&'a Mul),
16 Pow(&'a Pow),
17 Integer(&'a Integer),
18 Symbol(&'a Symbol),
19 Integral(&'a Integral),
20 Rational(&'a Rational),
21 Diff(&'a Diff),
22 Eq(&'a Equation),
23 Unknown,
24}
25
26impl<'a> KnownExpr<'a> {
27 pub fn from_expr_box(expr: &Box<dyn Expr>) -> KnownExpr {
28 KnownExpr::from_expr(&**expr)
29 }
30
31 pub fn from_expr(expr: &dyn Expr) -> KnownExpr {
32 let expr = (&*expr) as &dyn Any;
33 if expr.is::<Add>() {
34 KnownExpr::Add(expr.downcast_ref::<Add>().unwrap())
35 } else if expr.is::<Mul>() {
36 KnownExpr::Mul(expr.downcast_ref::<Mul>().unwrap())
37 } else if expr.is::<Pow>() {
38 KnownExpr::Pow(expr.downcast_ref::<Pow>().unwrap())
39 } else if expr.is::<Integer>() {
40 KnownExpr::Integer(expr.downcast_ref::<Integer>().unwrap())
41 } else if expr.is::<Symbol>() {
42 KnownExpr::Symbol(expr.downcast_ref::<Symbol>().unwrap())
43 } else if let Some(integral) = expr.downcast_ref::<Integral>() {
44 KnownExpr::Integral(integral)
45 } else if let Some(eq) = expr.downcast_ref::<Equation>() {
46 KnownExpr::Eq(eq)
47 } else if let Some(rational) = expr.downcast_ref::<Rational>() {
48 KnownExpr::Rational(rational)
49 } else {
50 KnownExpr::Unknown
51 }
52 }
53}