mathjs
Version:
Math.js is an extensive math library for JavaScript and Node.js. It features a flexible expression parser with support for symbolic computation, comes with a large set of built-in functions and constants, and offers an integrated solution to work with dif
95 lines (92 loc) • 3.83 kB
JavaScript
import { factory } from '../../../utils/factory.js';
var name = 'transformCallback';
var dependencies = ['typed'];
export var createTransformCallback = /* #__PURE__ */factory(name, dependencies, _ref => {
var {
typed
} = _ref;
/**
* Transforms the given callback function based on its type and number of arrays.
*
* @param {Function} callback - The callback function to transform.
* @param {number} numberOfArrays - The number of arrays to pass to the callback function.
* @returns {*} - The transformed callback function.
*/
return function (callback, numberOfArrays) {
if (typed.isTypedFunction(callback)) {
return _transformTypedCallbackFunction(callback, numberOfArrays);
} else {
return _transformCallbackFunction(callback, callback.length, numberOfArrays);
}
};
/**
* Transforms the given typed callback function based on the number of arrays.
*
* @param {Function} typedFunction - The typed callback function to transform.
* @param {number} numberOfArrays - The number of arrays to pass to the callback function.
* @returns {*} - The transformed callback function.
*/
function _transformTypedCallbackFunction(typedFunction, numberOfArrays) {
var signatures = Object.fromEntries(Object.entries(typedFunction.signatures).map(_ref2 => {
var [signature, callbackFunction] = _ref2;
var numberOfCallbackInputs = signature.split(',').length;
if (typed.isTypedFunction(callbackFunction)) {
return [signature, _transformTypedCallbackFunction(callbackFunction, numberOfArrays)];
} else {
return [signature, _transformCallbackFunction(callbackFunction, numberOfCallbackInputs, numberOfArrays)];
}
}));
if (typeof typedFunction.name === 'string') {
return typed(typedFunction.name, signatures);
} else {
return typed(signatures);
}
}
});
/**
* Transforms the callback function based on the number of callback inputs and arrays.
* There are three cases:
* 1. The callback function has N arguments.
* 2. The callback function has N+1 arguments.
* 3. The callback function has 2N+1 arguments.
*
* @param {Function} callbackFunction - The callback function to transform.
* @param {number} numberOfCallbackInputs - The number of callback inputs.
* @param {number} numberOfArrays - The number of arrays.
* @returns {Function} The transformed callback function.
*/
function _transformCallbackFunction(callbackFunction, numberOfCallbackInputs, numberOfArrays) {
if (numberOfCallbackInputs === numberOfArrays) {
return callbackFunction;
} else if (numberOfCallbackInputs === numberOfArrays + 1) {
return function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var vals = args.slice(0, numberOfArrays);
var idx = _transformDims(args[numberOfArrays]);
return callbackFunction(...vals, idx);
};
} else if (numberOfCallbackInputs > numberOfArrays + 1) {
return function () {
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
var vals = args.slice(0, numberOfArrays);
var idx = _transformDims(args[numberOfArrays]);
var rest = args.slice(numberOfArrays + 1);
return callbackFunction(...vals, idx, ...rest);
};
} else {
return callbackFunction;
}
}
/**
* Transforms the dimensions by adding 1 to each dimension.
*
* @param {Array} dims - The dimensions to transform.
* @returns {Array} The transformed dimensions.
*/
function _transformDims(dims) {
return dims.map(dim => dim + 1);
}