UNPKG

functionalscript

Version:

FunctionalScript is a purely functional subset of JavaScript

53 lines (52 loc) 1.75 kB
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()