-
Notifications
You must be signed in to change notification settings - Fork 0
/
reduction.js
127 lines (100 loc) · 4.43 KB
/
reduction.js
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
Fōrmulæ chemistry package. Module for reduction.
Copyright (C) 2015-2025 Laurence R. Ugalde
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
'use strict';
export class Chemistry extends Formulae.Package {}
Chemistry.fromNumber = async (fromNumber, session) => {
let n = CanonicalArithmetic.getInteger(fromNumber.children[0]);
if (n === undefined) {
ReductionManager.setInError(fromNumber.children[0], "Expression must be a positive integer number");
throw new ReductionError();
}
if (n <= 0 || n > Chemistry.common.elements.length) {
ReductionManager.setInError(fromNumber.children[0], "Invalid number");
throw new ReductionError();
}
fromNumber.replaceBy(Formulae.createExpression("Chemistry.Element." + Chemistry.common.elements[n - 1][0]));
return true;
};
Chemistry.fromSymbol = async (fromSymbol, session) => {
let stringExpr = fromSymbol.children[0];
//if (stringExpr.getTag().equals(ChemistryDescriptor.TAG_SYMBOL)) {
// return false; // Ok, to keep is symbolically
//}
if (stringExpr.getTag() !== "String.String") {
ReductionManager.setInError(fromSymbol.children[0], "Expression must be a string");
throw new ReductionError();
}
let s = stringExpr.get("Value");
let i = 0, n = Chemistry.common.elements.length;
search: {
for (; i < n; ++i) {
if (Chemistry.common.elements[i][1] === s) {
break search;
}
}
ReductionManager.setInError(fromSymbol.children[0], "String does not match with any chemical symbol");
throw new ReductionError();
}
fromSymbol.replaceBy(Formulae.createExpression(
"Chemistry.Element." + Chemistry.common.elements[i][0])
);
return true;
};
Chemistry.getAtomicNumber = async (getAtomicNumber, session) => {
let elementExpr = getAtomicNumber.children[0];
if (!elementExpr.getTag().startsWith("Chemistry.Element.")) return false;
getAtomicNumber.replaceBy(
CanonicalArithmetic.createInternalNumber(
CanonicalArithmetic.createInteger(elementExpr.atomicNumber, session),
session
)
);
return true;
};
Chemistry.getAtomicSymbol = async (getAtomicSymbol, session) => {
let elementExpr = getAtomicSymbol.children[0];
if (!elementExpr.getTag().startsWith("Chemistry.Element.")) return false;
let result = Formulae.createExpression("String.String");
result.set("Value", Chemistry.common.elements[elementExpr.atomicNumber - 1][1]);
getAtomicSymbol.replaceBy(result);
return true;
};
Chemistry.getAtomicName = async (getAtomicName, session) => {
let elementExpr = getAtomicName.children[0];
if (!elementExpr.getTag().startsWith("Chemistry.Element.")) return false;
let result = Formulae.createExpression("String.String");
result.set("Value", Chemistry.common.elements[elementExpr.atomicNumber - 1][0]);
getAtomicName.replaceBy(result);
return true;
};
Chemistry.getAtomicMass = async (getAtomicMass, session) => {
let elementExpr = getAtomicMass.children[0];
if (!elementExpr.getTag().startsWith("Chemistry.Element.")) return false;
getAtomicMass.replaceBy(
CanonicalArithmetic.createInternalNumber(
CanonicalArithmetic.createDecimal(Chemistry.common.elements[elementExpr.atomicNumber - 1][2], session),
session
)
);
return true;
};
Chemistry.setReducers = () => {
ReductionManager.addReducer("Chemistry.ElementFromAtomicNumber", Chemistry.fromNumber, "Chemistry.fromNumber");
ReductionManager.addReducer("Chemistry.ElementFromSymbol", Chemistry.fromSymbol, "Chemistry.fromSymbol");
ReductionManager.addReducer("Chemistry.GetAtomicNumber", Chemistry.getAtomicNumber, "Chemistry.getAtomicNumber");
ReductionManager.addReducer("Chemistry.GetAtomicMass", Chemistry.getAtomicMass, "Chemistry.getAtomicMass");
ReductionManager.addReducer("Chemistry.GetElementSymbol", Chemistry.getAtomicSymbol, "Chemistry.getAtomicSymbol");
ReductionManager.addReducer("Chemistry.GetElementName", Chemistry.getAtomicName, "Chemistry.getAtomicName");
};