import { unit } from "../primitives/unit.js"; import { capitalizeFirstLetter } from "../util/util.js"; import { newProduct, getLeft, getRight } from "./product.js"; export const makeConstructor = nParams => { const internal = (nParams, ret) => { if (nParams === 0) { const result = ret(unit); return result; } return nextParam => { const wrappedName = 'wrapped_' + ret.name; const newRet = { [wrappedName]: inner => newProduct(nextParam)(ret(inner)), }[wrappedName]; return internal(nParams-1, newRet); } }; const id = x => x; return internal(nParams, id); }; export const makeGetters = fieldNames => { if (fieldNames.length === 0) { return []; } const [fieldName, ...rest] = fieldNames; const getterName = `get${capitalizeFirstLetter(fieldName)}`; return [ { [getterName]: obj => getLeft(obj) }[getterName], ...makeGetters(rest).map(getter => ({[getter.name]: obj => getter(getRight(obj))}[getter.name])), ]; };