UNPKG

@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
"use strict"; 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;