functionalscript
Version:
FunctionalScript is a purely functional subset of JavaScript
53 lines (52 loc) • 1.75 kB
JavaScript
import { concat, fold, last, map, take, toArray } from "../../types/list/module.f.js";
import { fromEntries } from "../../types/object/module.f.js";
const { entries } = Object;
const foldOp = ast => state => {
const djs = toDjs(state)(ast);
return { ...state, consts: concat(state.consts)([djs]) };
};
const foldAstObjectOp = entry => state => {
const e = concat(state.entries)([[entry[0], (toDjs(state.runState)(entry[1]))]]);
return { ...state, entries: e };
};
const toDjs = state => ast => {
switch (typeof ast) {
case 'boolean':
case 'number':
case 'string':
case 'bigint': {
return ast;
}
default: {
if (ast === null) {
return ast;
}
if (ast === undefined) {
return ast;
}
if (ast instanceof Array) {
switch (ast[0]) {
case 'aref': {
return state.args[ast[1]];
}
case 'cref': {
return last(null)(take(ast[1] + 1)(state.consts));
}
case 'array': {
return toArray(map(toDjs(state))(ast[1]));
}
}
}
const e = fold(foldAstObjectOp)({ runState: state, entries: null })(entries(ast)).entries;
return fromEntries(e);
}
}
};
export const run = body => args => {
const state = fold(foldOp)({ body, args, consts: null })(body);
return last(null)(state.consts);
};
// for functions
// export const astBodyToAstConst
// :(body: AstBody) => (args: AstArray) => AstConst
// = body => args => todo()