simplify 'struct'

This commit is contained in:
Joeri Exelmans 2025-06-02 15:28:07 +02:00
parent 43342e90d4
commit 366b1ec4e0
3 changed files with 57 additions and 52 deletions

View file

@ -1,33 +1,30 @@
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) {
export const makeConstructor = fieldNames => {
const internal = (fieldNames, ret) => {
if (fieldNames.length === 0) {
const result = ret(unit);
return result;
}
return nextParam => {
const wrappedName = 'wrapped_' + ret.name;
const [fieldName, ...rest] = fieldNames;
const wrappedName = 'ctor_' + fieldName;
const newRet = {
[wrappedName]: inner => newProduct(nextParam)(ret(inner)),
[wrappedName]: inner => ({[fieldName]: nextParam, ...ret(inner)}),
}[wrappedName];
return internal(nParams-1, newRet);
return internal(rest, newRet);
}
};
const id = x => x;
return internal(nParams, id);
return internal(fieldNames, 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])),
];
return fieldNames.map(fieldName => {
const getterName = `get${capitalizeFirstLetter(fieldName)}`;
return {
[getterName]: obj => obj[fieldName],
}[getterName];
})
};