Parsing is expensive, if the parse tree can be stored on the DB it can save a lot of compute time, but mongo can't store Classes, so we re-write without classes
60 lines
1.6 KiB
JavaScript
60 lines
1.6 KiB
JavaScript
import resolve, {traverse, toString, mergeResolvedNodes} from '../resolve';
|
|
import collate from '/imports/api/engine/computation/utility/collate.js';
|
|
|
|
const ifNode = {
|
|
create({condition, consequent, alternative}){
|
|
return {
|
|
type: 'if',
|
|
condition,
|
|
consequent,
|
|
alternative,
|
|
};
|
|
},
|
|
toString(node){
|
|
let {condition, consequent, alternative} = node;
|
|
return `${toString(condition)} ? ${toString(consequent)} : ${toString(alternative)}`
|
|
},
|
|
resolve(fn, node, scope){
|
|
let rest, condition, consequent, alternative;
|
|
let resolved = {};
|
|
|
|
({result: condition, ...rest} = resolve(fn, node.condition, scope));
|
|
mergeResolvedNodes(resolved, rest);
|
|
|
|
if (condition.type === 'constant'){
|
|
if (condition.value){
|
|
({result: consequent, ...rest} = resolve(fn, node.consequent, scope));
|
|
mergeResolvedNodes(resolved, rest);
|
|
return {
|
|
result: consequent,
|
|
...resolved
|
|
};
|
|
} else {
|
|
({result: alternative, ...rest} = resolve(fn, node.alternative, scope));
|
|
mergeResolvedNodes(resolved, rest);
|
|
return {
|
|
result: alternative,
|
|
...resolved
|
|
};
|
|
}
|
|
} else {
|
|
return {
|
|
result: ifNode.create({
|
|
condition: condition,
|
|
consequent: node.consequent,
|
|
alternative: node.alternative,
|
|
}),
|
|
...resolved
|
|
};
|
|
}
|
|
},
|
|
traverse(node, fn){
|
|
fn(node);
|
|
traverse(node.condition, fn);
|
|
traverse(node.consequent, fn);
|
|
traverse(node.alternative, fn);
|
|
},
|
|
}
|
|
|
|
export default ifNode;
|