UNPKG

@harmoniclabs/plu-ts-onchain

Version:

An embedded DSL for Cardano smart contracts creation coupled with a library for Cardano transactions, all in Typescript

46 lines (45 loc) 2.82 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.plam = void 0; var obj_utils_1 = require("@harmoniclabs/obj-utils"); var Term_1 = require("../Term/index.js"); var includesDynamicPairs_1 = require("../type_system/includesDynamicPairs.js"); var types_1 = require("../type_system/types.js"); var getCallStackAt_1 = require("../../utils/getCallStackAt/index.js"); var papp_1 = require("./papp.js"); var IRVar_1 = require("../../IR/IRNodes/IRVar.js"); var IRFunc_1 = require("../../IR/IRNodes/IRFunc.js"); var addUtilityForType_1 = require("./std/UtilityTerms/addUtilityForType.js"); function plam(inputType, outputType) { return function (termFunc, funcName) { var _a; var func_name = undefined; func_name = typeof funcName === "string" ? funcName : termFunc.name !== "" ? termFunc.name : (_a = (0, getCallStackAt_1.getCallStackAt)(3, { tryGetNameAsync: true, onNameInferred: function (inferred) { return func_name = inferred; } })) === null || _a === void 0 ? void 0 : _a.inferredName; var lambdaTerm = new Term_1.Term((0, types_1.lam)(inputType, outputType), function (cfg, dbn) { var thisLambdaPtr = dbn + BigInt(1); var boundVar = new Term_1.Term(inputType, function (cfg, dbnAccessLevel) { return new IRVar_1.IRVar(dbnAccessLevel - thisLambdaPtr); }); var body = termFunc((0, addUtilityForType_1.addUtilityForType)(inputType)(boundVar)); // here the debruijn level is incremented return new IRFunc_1.IRFunc(1, body.toIR(cfg, thisLambdaPtr), func_name); }); (0, obj_utils_1.defineReadOnlyHiddenProperty)(lambdaTerm, "unsafeWithInputOfType", function (inT) { return new Term_1.Term((0, types_1.lam)(inT, outputType), function (cfg, dbn) { var thisLambdaPtr = dbn + BigInt(1); var boundVar = new Term_1.Term(inT, function (cfg, dbnAccessLevel) { return new IRVar_1.IRVar(dbnAccessLevel - thisLambdaPtr); }); var body = termFunc((0, addUtilityForType_1.addUtilityForType)(inT)((0, obj_utils_1.defineReadOnlyHiddenProperty)(boundVar, "__isDynamicPair", (0, includesDynamicPairs_1.includesDynamicPairs)(inT)))); // here the debruijn level is incremented return new IRFunc_1.IRFunc(1, body.toIR(cfg, thisLambdaPtr)); }); }); // lambdaTerm = addBaseUtilityTerm( lambdaTerm ); // allows ```lambdaTerm.$( input )``` syntax // rather than ```papp( lambdaTerm, input )``` // preserving Term Type return (0, obj_utils_1.defineReadOnlyProperty)(lambdaTerm, "$", function (input) { return (0, papp_1.papp)(lambdaTerm, input); }); }; } exports.plam = plam;