33 lines
1,007 B
JavaScript
33 lines
1,007 B
JavaScript
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])),
|
|
];
|
|
};
|