Began work on rewriting parser without object orientation
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
This commit is contained in:
59
app/imports/parser/parseTree/if.js
Normal file
59
app/imports/parser/parseTree/if.js
Normal file
@@ -0,0 +1,59 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user