@harmoniclabs/plu-ts-onchain
Version:
An embedded DSL for Cardano smart contracts creation coupled with a library for Cardano transactions, all in Typescript
63 lines (62 loc) • 2.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.isClosedIRTerm = void 0;
var IRConst_1 = require("../IRNodes/IRConst.js");
var IRFunc_1 = require("../IRNodes/IRFunc.js");
var IRApp_1 = require("../IRNodes/IRApp.js");
var IRError_1 = require("../IRNodes/IRError.js");
var IRNative_1 = require("../IRNodes/IRNative/index.js");
var IRHoisted_1 = require("../IRNodes/IRHoisted.js");
var IRLetted_1 = require("../IRNodes/IRLetted.js");
var IRVar_1 = require("../IRNodes/IRVar.js");
var IRForced_1 = require("../IRNodes/IRForced.js");
var IRDelayed_1 = require("../IRNodes/IRDelayed.js");
var IRConstr_1 = require("../IRNodes/IRConstr.js");
var IRCase_1 = require("../IRNodes/IRCase.js");
var IRRecursive_1 = require("../IRNodes/IRRecursive.js");
var IRSelfCall_1 = require("../IRNodes/IRSelfCall.js");
function _isClosedIRTerm(term, dbn, parent) {
if (term instanceof IRVar_1.IRVar) {
return term.dbn < dbn;
}
if (term instanceof IRSelfCall_1.IRSelfCall) {
return term.dbn < dbn;
}
if (term instanceof IRFunc_1.IRFunc) {
return _isClosedIRTerm(term.body, dbn + term.arity, term);
}
if (term instanceof IRRecursive_1.IRRecursive) {
return _isClosedIRTerm(term.body, dbn + term.arity, term);
}
if (term instanceof IRApp_1.IRApp) {
return _isClosedIRTerm(term.fn, dbn, term) && _isClosedIRTerm(term.arg, dbn, term);
}
if (term instanceof IRConstr_1.IRConstr) {
return Array.from(term.fields).every(function (f) { return _isClosedIRTerm(f, dbn, term); });
}
if (term instanceof IRCase_1.IRCase) {
return _isClosedIRTerm(term.constrTerm, dbn, term) &&
Array.from(term.continuations).every(function (cont) { return _isClosedIRTerm(cont, dbn, term); });
}
if (term instanceof IRConst_1.IRConst)
return true;
if (term instanceof IRError_1.IRError)
return true;
if (term instanceof IRNative_1.IRNative)
return true;
if (term instanceof IRHoisted_1.IRHoisted)
return true;
if (term instanceof IRLetted_1.IRLetted)
return _isClosedIRTerm(term.value, dbn, term);
if (term instanceof IRForced_1.IRForced)
return _isClosedIRTerm(term.forced, dbn, term);
if (term instanceof IRDelayed_1.IRDelayed)
return _isClosedIRTerm(term.delayed, dbn, term);
// not even an IRTerm
console.log(parent);
throw new Error("`isClosedIRTerm` called on non-IR argument");
}
function isClosedIRTerm(term) {
return _isClosedIRTerm(term, 0);
}
exports.isClosedIRTerm = isClosedIRTerm;