UNPKG

@harmoniclabs/plu-ts-onchain

Version:

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

112 lines (111 loc) 5.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.pDataList = exports.pList = exports.pconstList = exports.pnil = exports.assertValidListType = void 0; var plutus_machine_1 = require("@harmoniclabs/plutus-machine"); var IRConst_1 = require("../../../../../IR/IRNodes/IRConst.js"); var assert_1 = require("../../../../../utils/assert.js"); var Term_1 = require("../../../../Term/index.js"); var type_system_1 = require("../../../../type_system/index.js"); var typeExtends_1 = require("../../../../type_system/typeExtends.js"); var types_1 = require("../../../../type_system/types.js"); var data_1 = require("../../../builtins/data/index.js"); var pprepend_1 = require("../../../builtins/pprepend/index.js"); var punsafeConvertType_1 = require("../../../punsafeConvertType/index.js"); var minimal_common_1 = require("../../data/conversion/minimal_common.js"); var plutus_data_1 = require("@harmoniclabs/plutus-data"); var uplc_1 = require("@harmoniclabs/uplc"); var plutus_machine_2 = require("@harmoniclabs/plutus-machine"); var TermList_1 = require("../../UtilityTerms/TermList.js"); function assertValidListType(elemsT) { (0, assert_1.assert)((0, type_system_1.isWellFormedType)(elemsT) && !((elemsT[0] === types_1.PrimType.Lambda) || (elemsT[0] === types_1.PrimType.Delayed)), "plutus only supports lists of types that can be converted to constants"); } exports.assertValidListType = assertValidListType; function pnil(elemsT) { assertValidListType(elemsT); if ((0, typeExtends_1.typeExtends)(elemsT, (0, types_1.pair)((0, types_1.tyVar)(), (0, types_1.tyVar)()))) { return (0, punsafeConvertType_1.punsafeConvertType)(data_1.pnilPairData, (0, types_1.list)(elemsT)); } if ((0, typeExtends_1.typeExtends)(elemsT, types_1.data)) { return (0, punsafeConvertType_1.punsafeConvertType)(data_1.pnilData, (0, types_1.list)(elemsT)); } return (0, TermList_1.addPListMethods)(new Term_1.Term((0, types_1.list)(elemsT), function (_dbn) { return IRConst_1.IRConst.listOf(elemsT)([]); }, true)); } exports.pnil = pnil; function pconstList(elemsT) { assertValidListType(elemsT); return function (elems) { (0, assert_1.assert)(Array.isArray(elems) && elems.every(function (el) { return el instanceof Term_1.Term && el.isConstant && (0, typeExtends_1.typeExtends)(el.type, elemsT); }), "invalid array of elements to construct a list with"); if (elems.length === 0) return pnil(elemsT); return (0, TermList_1.addPListMethods)(new Term_1.Term((0, types_1.list)(elemsT), function (cfg, dbn) { return IRConst_1.IRConst.listOf(elemsT)(elems.map(function (el) { var res = (plutus_machine_1.Machine.evalSimple(el.toUPLC(dbn))); if (!(res instanceof plutus_machine_2.CEKConst)) { console.log("------------------- pconstList -------------------"); console.log(res); console.log((0, uplc_1.showUPLC)(el.toUPLC(dbn))); throw res; } return res.value; })); }, true)); }; } exports.pconstList = pconstList; function pList(elemsT) { return function (elems) { (0, assert_1.assert)(Array.isArray(elems) && elems.every(function (el) { return el instanceof Term_1.Term && (0, typeExtends_1.typeExtends)(el.type, elemsT); }), "invalid array of elements to construct a list with"); var nConstantFromEnd = 0; for (var i = elems.length - 1; i >= 0; i--) { if (elems[i].isConstant) nConstantFromEnd++; else break; } /** * if nConstantFromEnd === 0 * * ```ts * elems.slice( elems.length - nConstantFromEnd ) * ``` * * evalueates to ```[]``` * * which makes calling * * ```ts * pconstList( elemsT )([]) * ``` * * equivalent to * * ```ts * pnil( elemsT ) * ``` */ var plist = pconstList(elemsT)(elems.slice(elems.length - nConstantFromEnd)); // all the elements where constants if (nConstantFromEnd === elems.length) return plist; for (var i = elems.length - nConstantFromEnd - 1; i >= 0; i--) { plist = (0, minimal_common_1._papp)((0, minimal_common_1._papp)((0, pprepend_1.pprepend)(elemsT), elems[i]), plist); } return (0, TermList_1.addPListMethods)(plist); }; } exports.pList = pList; function pDataList(datas) { (0, assert_1.assert)(Array.isArray(datas) && datas.every(plutus_data_1.isData), "invalid list of data passed to 'pDataList'"); return new Term_1.Term((0, types_1.list)(types_1.data), function (_dbn) { return IRConst_1.IRConst.listOf(types_1.data)(datas); }, true); } exports.pDataList = pDataList;