@harmoniclabs/plu-ts-onchain
Version:
An embedded DSL for Cardano smart contracts creation coupled with a library for Cardano transactions, all in Typescript
40 lines (39 loc) • 1.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getElemAtTerm = void 0;
var obj_utils_1 = require("@harmoniclabs/obj-utils");
var list_1 = require("../builtins/list/index.js");
var types_1 = require("../../type_system/types.js");
var IRVar_1 = require("../../../IR/IRNodes/IRVar.js");
var IRApp_1 = require("../../../IR/IRNodes/IRApp.js");
var IRHoisted_1 = require("../../../IR/IRNodes/IRHoisted.js");
var IRNative_1 = require("../../../IR/IRNodes/IRNative/index.js");
var IRFunc_1 = require("../../../IR/IRNodes/IRFunc.js");
var Term_1 = require("../../Term/index.js");
var elemAtCache = {};
function getElemAtTerm(n) {
if (n < 0 || n !== Math.round(n))
throw new Error("unexpected index in pmatch field extraction");
if (elemAtCache[n] !== undefined)
return elemAtCache[n];
if (n === 0)
return (0, list_1.phead)(types_1.data);
var funcName = "elem_at_" + n.toString();
var uplc = new IRVar_1.IRVar(0);
var initialN = n;
while (n > 0) {
uplc = new IRApp_1.IRApp(IRNative_1.IRNative.tailList, uplc);
n--;
}
// every use of this MUST be cloned
// headList and tailList are forced natives and WILL be hoisted out
uplc = new IRHoisted_1.IRHoisted(new IRFunc_1.IRFunc(1, new IRApp_1.IRApp(IRNative_1.IRNative.headList, uplc), funcName));
var term = new Term_1.Term((0, types_1.lam)((0, types_1.list)(types_1.data), types_1.data), function (_dbn) { return uplc.clone(); });
uplc.hash;
(0, obj_utils_1.defineReadOnlyProperty)(term, "$", function (lst) {
return new Term_1.Term(types_1.data, function (cfg, dbn) { return new IRApp_1.IRApp(uplc.clone(), lst.toIR(cfg, dbn)); });
});
elemAtCache[initialN] = term;
return term;
}
exports.getElemAtTerm = getElemAtTerm;