Added resolve function to allow users to force a calculation to reduce
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
import resolve from '/imports/parser/resolve.js'
|
||||
|
||||
export default {
|
||||
'abs': {
|
||||
comment: 'Returns the absolute value of a number',
|
||||
@@ -108,6 +110,18 @@ export default {
|
||||
}
|
||||
return arrayNode.values.length;
|
||||
}
|
||||
},
|
||||
'resolve': {
|
||||
comment: 'Forces the given calcultion to resolve into a number',
|
||||
examples: [
|
||||
{input: 'resolve(someUndefinedVariable + 3 + 4)', result: '7'},
|
||||
{input: 'resolve(3d6)', result: '2'},
|
||||
],
|
||||
arguments: ['parseNode'],
|
||||
fn: function resolveFn(node){
|
||||
let {result} = resolve('reduce', node, this.scope, this.context);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -61,8 +61,11 @@ const call = {
|
||||
}
|
||||
|
||||
// Map contant nodes to constants before attempting to run the function
|
||||
let mappedArgs = resolvedArgs.map(arg => {
|
||||
if (arg.parseType === 'constant'){
|
||||
let mappedArgs = resolvedArgs.map((arg, index) => {
|
||||
if (
|
||||
arg.parseType === 'constant' &&
|
||||
func.arguments[index] !== 'parseNode'
|
||||
){
|
||||
return arg.value;
|
||||
} else {
|
||||
return arg;
|
||||
@@ -71,7 +74,7 @@ const call = {
|
||||
|
||||
try {
|
||||
// Run the function
|
||||
let value = func.fn.apply(null, mappedArgs);
|
||||
let value = func.fn.apply({scope, context}, mappedArgs);
|
||||
|
||||
let valueType = typeof value;
|
||||
if (valueType === 'number' || valueType === 'string' || valueType === 'boolean'){
|
||||
@@ -132,6 +135,7 @@ const call = {
|
||||
} else {
|
||||
type = argumentsExpected[index];
|
||||
}
|
||||
if (type === 'parseNode') return;
|
||||
if (node.parseType !== type && node.valueType !== type) failed = true;
|
||||
if (failed && fn === 'reduce'){
|
||||
let typeName = typeof type === 'string' ? type : type.constructor.name;
|
||||
|
||||
Reference in New Issue
Block a user