silphius/app/astride/evaluators/array.js

42 lines
1.1 KiB
JavaScript
Raw Normal View History

2024-06-16 08:01:01 -05:00
export default function(node, {evaluate, scope}) {
const elements = [];
2024-06-26 04:15:52 -05:00
const asyncSpread = Object.create(null);
2024-06-16 08:01:01 -05:00
let isAsync = false;
2024-06-26 04:15:52 -05:00
for (const index in node.elements) {
const element = node.elements[index];
2024-06-30 14:20:37 -05:00
if ('SpreadElement' === element.type) {
2024-06-26 04:15:52 -05:00
const {async, value} = evaluate(element.argument, {scope});
isAsync = isAsync || async;
if (async) {
elements.push(value);
asyncSpread[elements.length - 1] = true;
}
else {
elements.push(...value);
}
}
else {
const {async, value} = evaluate(element, {scope});
isAsync = isAsync || async;
elements.push(value);
}
2024-06-16 08:01:01 -05:00
}
return {
async: !!isAsync,
2024-06-26 04:15:52 -05:00
value: !isAsync
? elements
: Promise.all(elements).then((elementsAndOrSpreads) => {
const elements = [];
for (let i = 0; i < elementsAndOrSpreads.length; ++i) {
if (asyncSpread[i]) {
elements.push(...elementsAndOrSpreads[i]);
}
else {
elements.push(elementsAndOrSpreads[i]);
}
}
return elements;
}),
2024-06-16 08:01:01 -05:00
};
}