contracts.js (1685B)
1 import { list, text } from './codecs.js'; 2 // The portable annotation lowerer emits matchResult, withContract and err. 3 // Exported library trees already close over their own transitive dependencies. 4 // Keep general base names (id/pair/etc.) free for user definitions. 5 export const CONTRACT_BINDINGS = Object.freeze({ 6 matchResult: 'base.matchResult', withContract: 'base.withContract', err: 'base.err', 7 ok: 'base.ok', check: 'base.check', checkContract: 'base.checkContract', 8 contractOk: 'base.contractOk', contractErr: 'base.contractErr', 9 anyC: 'base.anyC', neverC: 'base.neverC', guardC: 'base.guardC', 10 'nat?': 'base.nat?', 'nonZero?': 'base.nonZero?', 'bool?': 'base.bool?', 11 andC: 'base.andC', orC: 'base.orC', notC: 'base.notC', mapC: 'base.mapC', bindC: 'base.bindC', 12 listOf: 'base.listOf', nonEmptyListOf: 'base.nonEmptyListOf', pairOf: 'base.pairOf', 13 fnContract: 'base.fnContract', fn2: 'base.fn2', 14 bindResult: 'base.bindResult', mapResult: 'base.mapResult', resultMapErr: 'base.resultMapErr', 15 resultIsOk: 'base.resultIsOk', resultIsErr: 'base.resultIsErr', 16 pureE: 'base.pureE', bindE: 'base.bindE', exceptE: 'base.exceptE', 17 pureM: 'base.pureM', bindM: 'base.bindM', checkM: 'base.checkM', 18 liftM: 'base.liftM', runM: 'base.runM', handleM: 'base.handleM', 19 }); 20 export function contractEnvironment(graph, exports) { 21 return list(graph, Object.entries(CONTRACT_BINDINGS).map(([name, exported]) => { 22 const value = exports.get(exported); 23 if (value === undefined) 24 throw new Error(`Compiler package is missing contract export ${exported}`); 25 return graph.fork(text(graph, name), value); 26 })); 27 }