@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
JavaScript
;
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;