UNPKG

1.81 kBJavaScriptView Raw
1import { isFunctionNode, isNode, isOperatorNode, isParenthesisNode, isSymbolNode } from '../../../utils/is.js';
2import { factory } from '../../../utils/factory.js';
3var name = 'resolve';
4var dependencies = ['parse', 'FunctionNode', 'OperatorNode', 'ParenthesisNode'];
5export var createResolve = /* #__PURE__ */factory(name, dependencies, (_ref) => {
6 var {
7 parse,
8 FunctionNode,
9 OperatorNode,
10 ParenthesisNode
11 } = _ref;
12
13 /**
14 * resolve(expr, scope) replaces variable nodes with their scoped values
15 *
16 * Syntax:
17 *
18 * simplify.resolve(expr, scope)
19 *
20 * Examples:
21 *
22 * math.simplify.resolve('x + y', {x:1, y:2}) // Node {1 + 2}
23 * math.simplify.resolve(math.parse('x+y'), {x:1, y:2}) // Node {1 + 2}
24 * math.simplify('x+y', {x:2, y:'x+x'}).toString() // "6"
25 *
26 * @param {Node} node
27 * The expression tree to be simplified
28 * @param {Object} scope with variables to be resolved
29 */
30 function resolve(node, scope) {
31 if (!scope) {
32 return node;
33 }
34
35 if (isSymbolNode(node)) {
36 var value = scope[node.name];
37
38 if (isNode(value)) {
39 return resolve(value, scope);
40 } else if (typeof value === 'number') {
41 return parse(String(value));
42 }
43 } else if (isOperatorNode(node)) {
44 var args = node.args.map(function (arg) {
45 return resolve(arg, scope);
46 });
47 return new OperatorNode(node.op, node.fn, args, node.implicit);
48 } else if (isParenthesisNode(node)) {
49 return new ParenthesisNode(resolve(node.content, scope));
50 } else if (isFunctionNode(node)) {
51 var _args = node.args.map(function (arg) {
52 return resolve(arg, scope);
53 });
54
55 return new FunctionNode(node.name, _args);
56 }
57
58 return node;
59 }
60
61 return resolve;
62});
\No newline at end of file