24 lines
818 B
JavaScript
24 lines
818 B
JavaScript
import { LazyArbitrary } from './_internals/LazyArbitrary.js';
|
|
import { safeHasOwnProperty } from '../utils/globals.js';
|
|
const safeObjectCreate = Object.create;
|
|
export function letrec(builder) {
|
|
const lazyArbs = safeObjectCreate(null);
|
|
const tie = (key) => {
|
|
if (!safeHasOwnProperty(lazyArbs, key)) {
|
|
lazyArbs[key] = new LazyArbitrary(String(key));
|
|
}
|
|
return lazyArbs[key];
|
|
};
|
|
const strictArbs = builder(tie);
|
|
for (const key in strictArbs) {
|
|
if (!safeHasOwnProperty(strictArbs, key)) {
|
|
continue;
|
|
}
|
|
const lazyAtKey = lazyArbs[key];
|
|
const lazyArb = lazyAtKey !== undefined ? lazyAtKey : new LazyArbitrary(key);
|
|
lazyArb.underlying = strictArbs[key];
|
|
lazyArbs[key] = lazyArb;
|
|
}
|
|
return strictArbs;
|
|
}
|