/
Value.re
executable file
·45 lines (39 loc) · 1 KB
/
Value.re
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
41
42
43
44
45
open AST_ReduceMap;
module AST = TechniCalcCalculator.AST_Types;
let parse = (elements: array(AST_Types.t)) => {
let error = ref(None);
let reduce = (accum, element, (i, _)) =>
if (error^ == None) {
switch (element) {
| `Superscript(_) =>
error := Some(i);
MutableListBuilder.empty;
| _ =>
let value = Value_Element.map(element, i);
MutableListBuilder.append(accum, value);
};
} else {
MutableListBuilder.empty;
};
let map = (accum, (i, _)): AST.t =>
if (error^ == None) {
let elements = MutableListBuilder.toList(accum);
switch (Value_Row.next(elements)) {
| `Ok(root) => root
| `Error(i) =>
error := Some(i);
AST.nan;
| `UnknownError =>
error := Some(i);
AST.nan;
};
} else {
AST.nan;
};
let root =
reduceMap(elements, ~reduce, ~map, ~initial=MutableListBuilder.empty);
switch (error^) {
| Some(i) => `Error(i)
| None => `Ok(root)
};
};