@jplorg/jpl
Version:
JPL interpreter
90 lines (89 loc) • 3.85 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _library = require("../../../library");
var _utils = require("../utils");
var _opaAssignField = _interopRequireDefault(require("./opaAssignField"));
var _opaAssignIter = _interopRequireDefault(require("./opaAssignIter"));
var _opaAssignSlice = _interopRequireDefault(require("./opaAssignSlice"));
var _opuAddition = _interopRequireDefault(require("./opuAddition"));
var _opuDivision = _interopRequireDefault(require("./opuDivision"));
var _opuMultiplication = _interopRequireDefault(require("./opuMultiplication"));
var _opuNullCoalescence = _interopRequireDefault(require("./opuNullCoalescence"));
var _opuRemainder = _interopRequireDefault(require("./opuRemainder"));
var _opuSet = _interopRequireDefault(require("./opuSet"));
var _opuSubtraction = _interopRequireDefault(require("./opuSubtraction"));
var _opuUpdate = _interopRequireDefault(require("./opuUpdate"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
var _default = exports.default = {
/** { pipe: [op], selectors: [opa], assignment: [opu] } */
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.selectors?.length ?? 0)) {
const {
op,
params: opParams
} = params.assignment ?? {};
const operator = opus[op];
if (!operator) throw new _library.JPLFatalError(`invalid OPU '${op}'`);
return operator.op(runtime, input, value, opParams ?? {}, scope, output => [output]);
}
const {
op,
params: opParams
} = params.selectors[from];
const operator = opasAssign[op];
if (!operator) throw new _library.JPLFatalError(`invalid OPA '${op}' (assignment)`);
return operator.op(runtime, input, value, opParams ?? {}, scope, output => iter(from + 1, output));
};
return runtime.executeInstructions(params.pipe ?? [], [input], scope, async output => runtime.muxAll([await iter(0, output)], result => next(result === undefined ? output : result, scope)));
},
/** { pipe: function, selectors: [opa], assignment: opu } */
map(runtime, params) {
return {
pipe: (0, _utils.call)(params.pipe),
selectors: runtime.muxOne([params.selectors], ({
op,
params: opParams
}) => {
const operator = opasAssign[op];
if (!operator) throw new _library.JPLFatalError(`invalid OPA '${op}' (assignment)`);
return {
op: runtime.assertType(op, 'string'),
params: operator.map(runtime, opParams)
};
}),
assignment: (({
op,
params: opParams
}) => {
const operator = opus[op];
if (!operator) throw new _library.JPLFatalError(`invalid OPU '${op}'`);
return {
op: runtime.assertType(op, 'string'),
params: operator.map(runtime, opParams)
};
})(params.assignment)
};
}
};
const opasAssign = {
[_library.OPA_FIELD]: _opaAssignField.default,
[_library.OPA_ITER]: _opaAssignIter.default,
[_library.OPA_SLICE]: _opaAssignSlice.default
};
const opus = {
[_library.OPU_ADDITION]: _opuAddition.default,
[_library.OPU_DIVISION]: _opuDivision.default,
[_library.OPU_MULTIPLICATION]: _opuMultiplication.default,
[_library.OPU_NULL_COALESCENCE]: _opuNullCoalescence.default,
[_library.OPU_REMAINDER]: _opuRemainder.default,
[_library.OPU_SET]: _opuSet.default,
[_library.OPU_SUBTRACTION]: _opuSubtraction.default,
[_library.OPU_UPDATE]: _opuUpdate.default
};