UNPKG

@harmoniclabs/plu-ts-onchain

Version:

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

87 lines (86 loc) 3.71 kB
"use strict"; var __values = (this && this.__values) || function(o) { var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; if (m) return m.call(o); if (o && typeof o.length === "number") return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; } }; throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.mockUserMethods = void 0; var obj_utils_1 = require("@harmoniclabs/obj-utils"); var getFnTypes_1 = require("../../../../Script/Parametrized/getFnTypes.js"); var type_system_1 = require("../../../../type_system/index.js"); var mockPapp_1 = require("./mockPapp.js"); var makeMockTerm_1 = require("./makeMockTerm.js"); // avoid potential dependecies and circular deps function getMethodsWithFirstInputOfType(methods, type) { var e_1, _a; var filtered = {}; var method; var methodNames = Object.keys(methods); try { for (var methodNames_1 = __values(methodNames), methodNames_1_1 = methodNames_1.next(); !methodNames_1_1.done; methodNames_1_1 = methodNames_1.next()) { var methodName = methodNames_1_1.value; method = methods[methodName]; if (method.type[0] !== type_system_1.PrimType.Lambda) throw new Error("user defined method is expected to be a funciton"); if ((0, type_system_1.typeExtends)(method.type[1], type)) { filtered[methodName] = method; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (methodNames_1_1 && !methodNames_1_1.done && (_a = methodNames_1.return)) _a.call(methodNames_1); } finally { if (e_1) throw e_1.error; } } return Object.freeze(filtered); } function mockUserMethods(term, methods) { var t = term.type; var filtered = getMethodsWithFirstInputOfType(methods, t); var method; var _loop_1 = function (methodName) { method = filtered[methodName]; var fnTypes = (0, getFnTypes_1.getFnTypes)(method.type); // don't add terms that do not accept `self_t` as first argument as methods if (!(0, type_system_1.typeExtends)(fnTypes[0], t)) return "continue"; // -1 (term application) // -1 (the output type) var missingArgsAfterApplication = fnTypes.length - 2; var appliedTerm = (0, mockPapp_1.mockPapp)(method, term); if (missingArgsAfterApplication === 0) { (0, obj_utils_1.defineReadOnlyProperty)(term, methodName, appliedTerm); return "continue"; } (0, obj_utils_1.defineReadOnlyProperty)(term, "p" + methodName, appliedTerm); (0, obj_utils_1.defineReadOnlyProperty)(term, methodName, function () { // let result: any = appliedTerm; var other_terms = []; for (var _i = 0; _i < arguments.length; _i++) { other_terms[_i] = arguments[_i]; } if (other_terms.length < missingArgsAfterApplication) throw new Error("not enough arguments for method + '" + methodName + "'"); // for( let i = 0 ; i < missingArgsAfterApplication; i++ ) // { // result = mockPapp( result, other_terms[i] ); // } // return result; return (0, makeMockTerm_1.makeMockTerm)(fnTypes[fnTypes.length - 1]); }); }; for (var methodName in filtered) { _loop_1(methodName); } return term; } exports.mockUserMethods = mockUserMethods;