1use std::{borrow::BorrowMut, collections::HashMap};
2
3use crate::{engine::Engine, EngineSignal};
4
5macro_rules! function_map_entry {
7 ($function_map:expr,$name:expr,$func_name:ident) => {
8 $function_map.insert(
9 String::from($name),
10 Box::new(|engine: &mut Engine| engine.borrow_mut().$func_name()) as Box<EngineFunction>,
11 )
12 };
13}
14
15type EngineFunction = dyn Fn(&mut Engine) -> Result<EngineSignal, String> + Send + Sync + 'static;
17pub(crate) type CommandsMap = HashMap<String, Box<EngineFunction>>;
19
20pub fn create_function_map() -> CommandsMap {
22 let mut function_map = HashMap::new();
23
24 function_map_entry!(function_map, "add", add);
27 function_map_entry!(function_map, "subtract", subtract);
28 function_map_entry!(function_map, "divide", divide);
29 function_map_entry!(function_map, "multiply", multiply);
30 function_map_entry!(function_map, "power", power);
31 function_map_entry!(function_map, "sqrt", sqrt);
32 function_map_entry!(function_map, "mod", modulo);
33 function_map_entry!(function_map, "sin", sin);
34 function_map_entry!(function_map, "cos", cos);
35 function_map_entry!(function_map, "tan", tan);
36 function_map_entry!(function_map, "sec", sec);
37 function_map_entry!(function_map, "csc", csc);
38 function_map_entry!(function_map, "cot", cot);
39 function_map_entry!(function_map, "asin", asin);
40 function_map_entry!(function_map, "acos", acos);
41 function_map_entry!(function_map, "atan", atan);
42 function_map_entry!(function_map, "log", log);
43 function_map_entry!(function_map, "blog", blog);
44 function_map_entry!(function_map, "ln", ln);
45 function_map_entry!(function_map, "abs", abs);
46 function_map_entry!(function_map, "eq", equal);
47 function_map_entry!(function_map, "gt", gt);
48 function_map_entry!(function_map, "lt", lt);
49 function_map_entry!(function_map, "leq", geq);
50 function_map_entry!(function_map, "geq", leq);
51 function_map_entry!(function_map, "round", round);
52 function_map_entry!(function_map, "invert", invert);
53 function_map_entry!(function_map, "chs", chs);
54 function_map_entry!(function_map, "drop", drop);
55 function_map_entry!(function_map, "swap", swap);
56 function_map_entry!(function_map, "dup", dup);
57 function_map_entry!(function_map, "rolldown", roll_down);
58 function_map_entry!(function_map, "rollup", roll_up);
59 function_map_entry!(function_map, "store", store);
60 function_map_entry!(function_map, "purge", purge);
61 function_map_entry!(function_map, "invstore", invstore);
62 function_map_entry!(function_map, "clear", clear);
63 function_map_entry!(function_map, "clear", clear);
64 function_map_entry!(function_map, "undo", undo);
65 function_map_entry!(function_map, "redo", redo);
66 function_map_entry!(function_map, "quit", quit);
67
68 function_map.insert(
70 String::from("refresh"),
71 Box::new(|_engine: &mut Engine| Ok(EngineSignal::StackUpdated)),
72 );
73
74 function_map
75}