tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

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 }