@jplorg/jpl
Version:
JPL interpreter
59 lines (58 loc) • 2.38 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _library = require("../../../library");
var _utils = require("../utils");
var _opcEqual = _interopRequireDefault(require("./opcEqual"));
var _opcGreater = _interopRequireDefault(require("./opcGreater"));
var _opcGreaterEqual = _interopRequireDefault(require("./opcGreaterEqual"));
var _opcLess = _interopRequireDefault(require("./opcLess"));
var _opcLessEqual = _interopRequireDefault(require("./opcLessEqual"));
var _opcUnequal = _interopRequireDefault(require("./opcUnequal"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
var _default = exports.default = {
/** { pipe: [op], comparisons: [opc] } */
op(runtime, input, params, scope, next) {
const iter = async (from, value) => {
// Call stack decoupling - This is necessary as some browsers (i.e. Safari) have very limited call stack sizes which result in stack overflow exceptions in certain situations.
await undefined;
scope.signal.checkHealth();
if (from >= (params.comparisons?.length ?? 0)) return next(value, scope);
const {
op,
params: opParams
} = params.comparisons[from];
const operator = opcs[op];
if (!operator) throw new _library.JPLFatalError(`invalid OPC '${op}'`);
return operator.op(runtime, input, value, opParams ?? {}, scope, output => iter(from + 1, output));
};
return runtime.executeInstructions(params.pipe ?? [], [input], scope, output => iter(0, output));
},
/** { pipe: function, comparisons: [opc] } */
map(runtime, params) {
return {
pipe: (0, _utils.call)(params.pipe),
comparisons: runtime.muxOne([params.comparisons], ({
op,
params: opParams
}) => {
const operator = opcs[op];
if (!operator) throw new _library.JPLFatalError(`invalid OPC '${op}'`);
return {
op: runtime.assertType(op, 'string'),
params: operator.map(runtime, opParams)
};
})
};
}
};
const opcs = {
[_library.OPC_EQUAL]: _opcEqual.default,
[_library.OPC_GREATER]: _opcGreater.default,
[_library.OPC_GREATEREQUAL]: _opcGreaterEqual.default,
[_library.OPC_LESS]: _opcLess.default,
[_library.OPC_LESSEQUAL]: _opcLessEqual.default,
[_library.OPC_UNEQUAL]: _opcUnequal.default
};