Files
DiceCloud/app/imports/parser/parseTree/array.js
2021-10-09 12:36:06 +02:00

54 lines
1.3 KiB
JavaScript

import resolve, { toString, traverse, map } from '../resolve.js';
import constant from './constant.js';
const array = {
create({values}) {
return {
parseType: 'array',
values,
};
},
fromConstantArray(array){
let values = array.map( value => {
let valueType = typeof value;
if (
valueType === 'string' ||
valueType === 'number' ||
valueType === 'boolean' ||
valueType === 'undefined'
){
return constant.create({value, valueType});
} else {
throw `Unexpected type in constant array: ${valueType}`
}
});
return array.create({values});
},
resolve(fn, node, scope, context){
let values = node.values.map(node => {
let { result } = resolve(fn, node, scope, context);
return result;
});
return {
result: array.create({values}),
context,
};
},
toString(node){
return `[${node.values.map(value => toString(value)).join(', ')}]`;
},
traverse(node, fn){
fn(node);
node.values.forEach(value => traverse(value, fn));
},
map(node, fn){
const resultingNode = fn(node);
if (resultingNode === node){
node.values = node.values.map(value => map(value, fn));
}
return resultingNode;
},
}
export default array;