From a5618b5a25d9bad0b193108c23c688508bb2e6cd Mon Sep 17 00:00:00 2001 From: David Contreras Date: Fri, 20 Sep 2024 21:12:17 -0600 Subject: [PATCH] optimizeCallback returns a non typed function. --- src/function/matrix/filter.js | 2 +- src/function/matrix/forEach.js | 4 ++-- src/function/matrix/map.js | 4 ++-- src/type/matrix/DenseMatrix.js | 8 ++++---- src/type/matrix/SparseMatrix.js | 4 ++-- src/utils/optimizeCallback.js | 34 +++++++++++++++++++++------------ 6 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/function/matrix/filter.js b/src/function/matrix/filter.js index e56e745853..1b8c832647 100644 --- a/src/function/matrix/filter.js +++ b/src/function/matrix/filter.js @@ -58,7 +58,7 @@ export const createFilter = /* #__PURE__ */ factory(name, dependencies, ({ typed * @private */ function _filterCallback (x, callback) { - const fastCallback = optimizeCallback(callback, x, 'filter')[0] + const fastCallback = optimizeCallback(callback, x, 'filter') return filter(x, function (value, index, array) { // invoke the callback function with the right number of arguments return fastCallback(value, [index], array) diff --git a/src/function/matrix/forEach.js b/src/function/matrix/forEach.js index a8b7c3fa9f..21fb8baf00 100644 --- a/src/function/matrix/forEach.js +++ b/src/function/matrix/forEach.js @@ -45,6 +45,6 @@ export const createForEach = /* #__PURE__ */ factory(name, dependencies, ({ type * @private */ function _forEach (array, callback) { - const [fastCallback, numberOfArguments] = optimizeCallback(callback, array, name, { detailedError: true }) - deepForEach(array, array, fastCallback, numberOfArguments) + const fastCallback = optimizeCallback(callback, array, name, { detailedError: true }) + deepForEach(array, array, fastCallback, fastCallback.length) } diff --git a/src/function/matrix/map.js b/src/function/matrix/map.js index b295e600f6..cd09833dfc 100644 --- a/src/function/matrix/map.js +++ b/src/function/matrix/map.js @@ -151,7 +151,7 @@ export const createMap = /* #__PURE__ */ factory(name, dependencies, ({ typed }) * @private */ function _mapArray (array, callback) { - const [fastCallback, numberOfArguments] = optimizeCallback(callback, array, name, { detailedError: true }) - return deepMap(array, array, fastCallback, numberOfArguments) + const fastCallback = optimizeCallback(callback, array, name, { detailedError: true }) + return deepMap(array, array, fastCallback, fastCallback.length) } }) diff --git a/src/type/matrix/DenseMatrix.js b/src/type/matrix/DenseMatrix.js index d2e75b802e..bbbd3eea4a 100644 --- a/src/type/matrix/DenseMatrix.js +++ b/src/type/matrix/DenseMatrix.js @@ -537,11 +537,11 @@ export const createDenseMatrixClass = /* #__PURE__ */ factory(name, dependencies DenseMatrix.prototype.map = function (callback) { // matrix instance const me = this - const [fastCallback, numberOfArguments] = optimizeCallback(callback, me._data, 'map') + const fastCallback = optimizeCallback(callback, me._data, 'map') // determine the new datatype when the original matrix has datatype defined // TODO: should be done in matrix constructor instead - const data = deepMap(me._data, me, fastCallback, numberOfArguments) + const data = deepMap(me._data, me, fastCallback, fastCallback.length) const datatype = me._datatype !== undefined ? getArrayDataType(data, typeOf) : undefined @@ -558,8 +558,8 @@ export const createDenseMatrixClass = /* #__PURE__ */ factory(name, dependencies DenseMatrix.prototype.forEach = function (callback) { // matrix instance const me = this - const [fastCallback, numberOfArguments] = optimizeCallback(callback, me._data, 'forEach') - deepForEach(this._data, me, fastCallback, numberOfArguments) + const fastCallback = optimizeCallback(callback, me._data, 'forEach') + deepForEach(this._data, me, fastCallback, fastCallback.length) } /** diff --git a/src/type/matrix/SparseMatrix.js b/src/type/matrix/SparseMatrix.js index deed71442e..355cfb297d 100644 --- a/src/type/matrix/SparseMatrix.js +++ b/src/type/matrix/SparseMatrix.js @@ -853,7 +853,7 @@ export const createSparseMatrixClass = /* #__PURE__ */ factory(name, dependencie // rows and columns const rows = this._size[0] const columns = this._size[1] - const fastCallback = optimizeCallback(callback, me, 'map')[0] + const fastCallback = optimizeCallback(callback, me, 'map') // invoke callback const invoke = function (v, i, j) { // invoke callback @@ -962,7 +962,7 @@ export const createSparseMatrixClass = /* #__PURE__ */ factory(name, dependencie // rows and columns const rows = this._size[0] const columns = this._size[1] - const fastCallback = optimizeCallback(callback, me, 'forEach')[0] + const fastCallback = optimizeCallback(callback, me, 'forEach') // loop columns for (let j = 0; j < columns; j++) { // k0 <= k < k1 where k0 = _ptr[j] && k1 = _ptr[j+1] diff --git a/src/utils/optimizeCallback.js b/src/utils/optimizeCallback.js index f3f9ab90cc..049aad5eed 100644 --- a/src/utils/optimizeCallback.js +++ b/src/utils/optimizeCallback.js @@ -16,24 +16,34 @@ export function optimizeCallback (callback, array, name, options) { const firstValue = array.isMatrix ? array.get(firstIndex) : get(array, firstIndex) const hasSingleSignature = Object.keys(callback.signatures).length === 1 const numberOfArguments = _typedFindNumberOfArguments(callback, firstValue, firstIndex, array) - const fastCallback = hasSingleSignature ? Object.values(callback.signatures)[0] : (...args) => callback(...args) if (options && options.detailedError) { - if (numberOfArguments >= 1 && numberOfArguments <= 3) { - const limitedCallback = (...args) => tryFunctionWithArgs(fastCallback, args.slice(0, numberOfArguments), name, callback.name) - return [limitedCallback, numberOfArguments] - } else { - const enhancedCallback = (...args) => tryFunctionWithArgs(fastCallback, args, name, callback.name) - return [enhancedCallback, numberOfArguments] + const fastCallback = hasSingleSignature ? Object.values(callback.signatures)[0] : callback + switch (numberOfArguments) { + case 1: + return (val) => tryFunctionWithArgs(fastCallback, [val], name, callback.name) + case 2: + return (val, idx) => tryFunctionWithArgs(fastCallback, [val, idx], name, callback.name) + case 3: + return (val, idx, array) => tryFunctionWithArgs(fastCallback, [val, idx, array], name, callback.name) + default: + return (...args) => tryFunctionWithArgs(fastCallback, args, name, callback.name) } + } else if (hasSingleSignature) { + return Object.values(callback.signatures)[0] } else { - if (numberOfArguments >= 1 && numberOfArguments <= 3) { - return [(...args) => fastCallback(...args.slice(0, numberOfArguments)), numberOfArguments] - } else { - return [(...args) => fastCallback(...args), numberOfArguments] + switch (numberOfArguments) { + case 1: + return val => callback(val) + case 2: + return (val, idx) => callback(val, idx) + case 3: + return (val, idx, array) => callback(val, idx, array) + default: + return callback } } } - return [callback, callback.length] + return callback } export function findNumberOfArguments (callback, array) {