@harmoniclabs/plu-ts-onchain
Version:
An embedded DSL for Cardano smart contracts creation coupled with a library for Cardano transactions, all in Typescript
70 lines (69 loc) • 4.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.addPStructMethods = void 0;
var Term_1 = require("../../../Term/index.js");
var type_system_1 = require("../../../type_system/index.js");
var data_1 = require("../../builtins/data/index.js");
var fromData_minimal_1 = require("../data/conversion/fromData_minimal.js");
var punsafeConvertType_1 = require("../../punsafeConvertType/index.js");
var TermInt_1 = require("./TermInt.js");
var TermList_1 = require("./TermList.js");
var obj_utils_1 = require("@harmoniclabs/obj-utils");
var IRHoisted_1 = require("../../../../IR/IRNodes/IRHoisted.js");
var IRFunc_1 = require("../../../../IR/IRNodes/IRFunc.js");
var IRApp_1 = require("../../../../IR/IRNodes/IRApp.js");
var IRNative_1 = require("../../../../IR/IRNodes/IRNative/index.js");
var IRVar_1 = require("../../../../IR/IRNodes/IRVar.js");
var IRLetted_1 = require("../../../../IR/IRNodes/IRLetted.js");
var addUserMethods_1 = require("./userMethods/addUserMethods.js");
var plet_1 = require("../../plet/index.js");
var getElemAtTerm_1 = require("../../pmatch/getElemAtTerm.js");
var BaseUtilityTerm_1 = require("./BaseUtilityTerm.js");
var hoisted_getFields = new IRHoisted_1.IRHoisted(new IRFunc_1.IRFunc(1, // struct
new IRApp_1.IRApp(IRNative_1.IRNative.sndPair, new IRApp_1.IRApp(IRNative_1.IRNative.unConstrData, new IRVar_1.IRVar(0))), "hoisted_getFields"));
hoisted_getFields.hash;
function addPStructMethods(struct) {
struct = (0, BaseUtilityTerm_1.addBaseUtilityTerm)(struct);
var t = struct.type;
if (!(0, type_system_1.isStructType)(t))
return struct;
var sDef = t[1];
if (typeof sDef === "symbol" || !(0, type_system_1.isStructDefinition)(sDef))
return struct;
var ctors = Object.keys(sDef);
// shortcut for single ctors structs
if (ctors.length === 1) {
var ctorName = ctors[0];
var ctor = sDef[ctorName];
var fieldsNames = Object.keys(ctor);
var nFields = fieldsNames.length;
var letted_fieldsListData = new Term_1.Term((0, type_system_1.list)(type_system_1.data), function (cfg, dbn) { return new IRLetted_1.IRLetted(Number(dbn), new IRApp_1.IRApp(hoisted_getFields.clone(), struct.toIR(cfg, dbn))); });
for (var i = 0; i < nFields; i++) {
var thisFieldName = fieldsNames[i];
var thisFieldType = ctor[thisFieldName];
(!(0, obj_utils_1.hasOwn)(struct, thisFieldName)) && Object.defineProperty(struct, thisFieldName, {
value: (0, punsafeConvertType_1.punsafeConvertType)((0, plet_1.plet)((0, fromData_minimal_1._fromData)(thisFieldType)((0, getElemAtTerm_1.getElemAtTerm)(i).$(letted_fieldsListData)), ctorName + "::" + thisFieldName), thisFieldType),
writable: false,
enumerable: true,
configurable: false
});
}
}
(0, obj_utils_1.definePropertyIfNotPresent)(struct, "peq", {
get: function () { return (0, plet_1.plet)(data_1.peqData.$(struct)); },
set: function () { },
configurable: false,
enumerable: true
});
(0, obj_utils_1.defineReadOnlyProperty)(struct, "eq", function (other) { return data_1.peqData.$(struct).$(other); });
var letted_unconstred = new Term_1.Term((0, type_system_1.pair)(type_system_1.int, (0, type_system_1.list)(type_system_1.data)), function (cfg, dbn) { return new IRLetted_1.IRLetted(Number(dbn), new IRApp_1.IRApp(IRNative_1.IRNative.unConstrData, struct.toIR(cfg, dbn))); });
var letted_ctorIdx = new Term_1.Term(type_system_1.int, function (cfg, dbn) { return new IRLetted_1.IRLetted(Number(dbn), new IRApp_1.IRApp(IRNative_1.IRNative.fstPair, letted_unconstred.toIR(cfg, dbn))); });
var letted_rawFields = new Term_1.Term((0, type_system_1.list)(type_system_1.data), function (cfg, dbn) { return new IRLetted_1.IRLetted(Number(dbn), new IRApp_1.IRApp(IRNative_1.IRNative.sndPair, letted_unconstred.toIR(cfg, dbn))); });
(0, obj_utils_1.defineReadOnlyProperty)(struct, "raw", Object.freeze({
index: (0, TermInt_1.addPIntMethods)(letted_ctorIdx),
fields: (0, TermList_1.addPListMethods)(letted_rawFields)
}));
struct = (0, addUserMethods_1.addUserMethods)(struct, t[2]);
return struct;
}
exports.addPStructMethods = addPStructMethods;