Skip to content

Commit

Permalink
deepMap with number of arguments in callback
Browse files Browse the repository at this point in the history
  • Loading branch information
dvd101x committed Sep 6, 2024
1 parent 71b2ebb commit ff2f173
Show file tree
Hide file tree
Showing 37 changed files with 58 additions and 54 deletions.
2 changes: 1 addition & 1 deletion src/expression/function/compile.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export const createCompile = /* #__PURE__ */ factory(name, dependencies, ({ type
'Array | Matrix': function (expr) {
return deepMap(expr, function (entry) {
return parse(entry).compile()
})
}, false, 1)
}
})
})
4 changes: 2 additions & 2 deletions src/expression/function/evaluate.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,13 @@ export const createEvaluate = /* #__PURE__ */ factory(name, dependencies, ({ typ
const scope = createEmptyMap()
return deepMap(expr, function (entry) {
return parse(entry).compile().evaluate(scope)
})
}, false, 1)
},

'Array | Matrix, Map | Object': function (expr, scope) {
return deepMap(expr, function (entry) {
return parse(entry).compile().evaluate(scope)
})
}, false, 1)
}
})
})
4 changes: 2 additions & 2 deletions src/function/arithmetic/ceil.js
Original file line number Diff line number Diff line change
Expand Up @@ -124,12 +124,12 @@ export const createCeil = /* #__PURE__ */ factory(name, dependencies, ({ typed,

'Array | Matrix': typed.referToSelf(self => (x) => {
// deep map collection, skip zeros since ceil(0) = 0
return deepMap(x, self, true)
return deepMap(x, self, true, 1)
}),

'Array, number | BigNumber': typed.referToSelf(self => (x, n) => {
// deep map collection, skip zeros since ceil(0) = 0
return deepMap(x, i => self(i, n), true)
return deepMap(x, i => self(i, n), true, 1)
}),

'SparseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {
Expand Down
4 changes: 2 additions & 2 deletions src/function/arithmetic/fix.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,12 +105,12 @@ export const createFix = /* #__PURE__ */ factory(name, dependencies, ({ typed, C

'Array | Matrix': typed.referToSelf(self => (x) => {
// deep map collection, skip zeros since fix(0) = 0
return deepMap(x, self, true)
return deepMap(x, self, true, 1)
}),

'Array | Matrix, number | BigNumber': typed.referToSelf(self => (x, n) => {
// deep map collection, skip zeros since fix(0) = 0
return deepMap(x, i => self(i, n), true)
return deepMap(x, i => self(i, n), true, 1)
}),

'number | Complex | Fraction | BigNumber, Array':
Expand Down
4 changes: 2 additions & 2 deletions src/function/arithmetic/floor.js
Original file line number Diff line number Diff line change
Expand Up @@ -127,12 +127,12 @@ export const createFloor = /* #__PURE__ */ factory(name, dependencies, ({ typed,

'Array | Matrix': typed.referToSelf(self => (x) => {
// deep map collection, skip zeros since floor(0) = 0
return deepMap(x, self, true)
return deepMap(x, self, true, 1)
}),

'Array, number | BigNumber': typed.referToSelf(self => (x, n) => {
// deep map collection, skip zeros since ceil(0) = 0
return deepMap(x, i => self(i, n), true)
return deepMap(x, i => self(i, n), true, 1)
}),

'SparseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {
Expand Down
2 changes: 1 addition & 1 deletion src/function/arithmetic/log10.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,6 @@ export const createLog10 = /* #__PURE__ */ factory(name, dependencies, ({ typed,
}
},

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/function/arithmetic/log1p.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ export const createLog1p = /* #__PURE__ */ factory(name, dependencies, ({ typed,
}
},

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self)),
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1)),

'any, any': typed.referToSelf(self => (x, base) => {
// calculate logarithm for a specified base, log1p(x, base)
Expand Down
2 changes: 1 addition & 1 deletion src/function/arithmetic/log2.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export const createLog2 = /* #__PURE__ */ factory(name, dependencies, ({ typed,
}
},

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})

/**
Expand Down
4 changes: 2 additions & 2 deletions src/function/arithmetic/round.js
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ export const createRound = /* #__PURE__ */ factory(name, dependencies, ({ typed,

'Array | Matrix, number, Unit': typed.referToSelf(self => (x, n, unit) => {
// deep map collection, skip zeros since round(0) = 0
return deepMap(x, (value) => self(value, n, unit), true)
return deepMap(x, (value) => self(value, n, unit), true, 1)
}),

'Array | Matrix, BigNumber, Unit': typed.referToSelf(self => (x, n, unit) => self(x, n.toNumber(), unit)),
Expand All @@ -167,7 +167,7 @@ export const createRound = /* #__PURE__ */ factory(name, dependencies, ({ typed,

'Array | Matrix': typed.referToSelf(self => x => {
// deep map collection, skip zeros since round(0) = 0
return deepMap(x, self, true)
return deepMap(x, self, true, 1)
}),

'SparseMatrix, number | BigNumber': typed.referToSelf(self => (x, n) => {
Expand Down
2 changes: 1 addition & 1 deletion src/function/arithmetic/sign.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ export const createSign = /* #__PURE__ */ factory(name, dependencies, ({ typed,
},

// deep map collection, skip zeros since sign(0) = 0
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, true)),
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, true, 1)),

Unit: typed.referToSelf(self => x => {
if (!x._isDerived() && x.units[0].unit.offset !== 0) {
Expand Down
2 changes: 1 addition & 1 deletion src/function/arithmetic/unaryMinus.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ export const createUnaryMinus = /* #__PURE__ */ factory(name, dependencies, ({ t
}),

// deep map collection, skip zeros since unaryMinus(0) = 0
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, true))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, true, 1))

// TODO: add support for string
})
Expand Down
2 changes: 1 addition & 1 deletion src/function/arithmetic/unaryPlus.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ export const createUnaryPlus = /* #__PURE__ */ factory(name, dependencies, ({ ty
},

// deep map collection, skip zeros since unaryPlus(0) = 0
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, true)),
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, true, 1)),

boolean: function (x) {
return numeric(x ? 1 : 0, config.number)
Expand Down
2 changes: 1 addition & 1 deletion src/function/bitwise/bitNot.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,6 @@ export const createBitNot = /* #__PURE__ */ factory(name, dependencies, ({ typed
number: bitNotNumber,
BigNumber: bitNotBigNumber,
bigint: x => ~x,
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/function/complex/arg.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,6 @@ export const createArg = /* #__PURE__ */ factory(name, dependencies, ({ typed })

// TODO: implement BigNumber support for function arg

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/function/complex/conj.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,6 @@ export const createConj = /* #__PURE__ */ factory(name, dependencies, ({ typed }
return typed(name, {
'number | BigNumber | Fraction': x => x,
Complex: x => x.conjugate(),
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/function/complex/im.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,6 @@ export const createIm = /* #__PURE__ */ factory(name, dependencies, ({ typed })
number: () => 0,
'BigNumber | Fraction': x => x.mul(0),
Complex: x => x.im,
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/function/complex/re.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,6 @@ export const createRe = /* #__PURE__ */ factory(name, dependencies, ({ typed })
return typed(name, {
'number | BigNumber | Fraction': x => x,
Complex: x => x.re,
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/function/logical/not.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,6 @@ export const createNot = /* #__PURE__ */ factory(name, dependencies, ({ typed })

Unit: typed.referToSelf(self => x => typed.find(self, x.valueType())(x.value)),

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/function/probability/factorial.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,6 @@ export const createFactorial = /* #__PURE__ */ factory(name, dependencies, ({ ty
return gamma(n.plus(1))
},

'Array | Matrix': typed.referToSelf(self => n => deepMap(n, self))
'Array | Matrix': typed.referToSelf(self => n => deepMap(n, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/function/special/erf.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ export const createErf = /* #__PURE__ */ factory(name, dependencies, ({ typed })
return sign(x) * (1 - erfc3(y))
},

'Array | Matrix': typed.referToSelf(self => n => deepMap(n, self))
'Array | Matrix': typed.referToSelf(self => n => deepMap(n, self, false, 1))

// TODO: For complex numbers, use the approximation for the Faddeeva function
// from "More Efficient Computation of the Complex Error Function" (AMS)
Expand Down
2 changes: 1 addition & 1 deletion src/function/utils/isInteger.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,6 @@ export const createIsInteger = /* #__PURE__ */ factory(name, dependencies, ({ ty
return x.d === 1 && isFinite(x.n)
},

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/function/utils/isNaN.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,6 @@ export const createIsNaN = /* #__PURE__ */ factory(name, dependencies, ({ typed
return Number.isNaN(x.value)
},

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/function/utils/isNegative.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,6 @@ export const createIsNegative = /* #__PURE__ */ factory(name, dependencies, ({ t
Unit: typed.referToSelf(self =>
x => typed.find(self, x.valueType())(x.value)),

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/function/utils/isNumeric.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,6 @@ export const createIsNumeric = /* #__PURE__ */ factory(name, dependencies, ({ ty
return typed(name, {
'number | BigNumber | bigint | Fraction | boolean': () => true,
'Complex | Unit | string | null | undefined | Node': () => false,
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/function/utils/isPositive.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,6 @@ export const createIsPositive = /* #__PURE__ */ factory(name, dependencies, ({ t
Unit: typed.referToSelf(self =>
x => typed.find(self, x.valueType())(x.value)),

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/function/utils/isPrime.js
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,6 @@ export const createIsPrime = /* #__PURE__ */ factory(name, dependencies, ({ type
return true
},

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/function/utils/isZero.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,6 @@ export const createIsZero = /* #__PURE__ */ factory(name, dependencies, ({ typed
Unit: typed.referToSelf(self =>
x => typed.find(self, x.valueType())(x.value)),

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/type/bigint.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ export const createBigint = /* #__PURE__ */ factory(name, dependencies, ({ typed
return 0n
},

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})

// reviver function to parse a JSON object like:
Expand Down
2 changes: 1 addition & 1 deletion src/type/bignumber/function/bignumber.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,6 @@ export const createBignumber = /* #__PURE__ */ factory(name, dependencies, ({ ty
return new BigNumber(0)
},

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/type/boolean.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,6 @@ export const createBoolean = /* #__PURE__ */ factory(name, dependencies, ({ type
throw new Error('Cannot convert "' + x + '" to a boolean')
},

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/type/complex/function/complex.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,6 @@ export const createComplex = /* #__PURE__ */ factory(name, dependencies, ({ type
throw new Error('Expected object with properties (re and im) or (r and phi) or (abs and arg)')
},

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/type/fraction/function/fraction.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,6 @@ export const createFraction = /* #__PURE__ */ factory(name, dependencies, ({ typ
return new Fraction(x)
},

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
2 changes: 1 addition & 1 deletion src/type/number.js
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ export const createNumber = /* #__PURE__ */ factory(name, dependencies, ({ typed
return unit.toNumber(valuelessUnit)
},

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})

// reviver function to parse a JSON object like:
Expand Down
2 changes: 1 addition & 1 deletion src/type/string.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ export const createString = /* #__PURE__ */ factory(name, dependencies, ({ typed
return x
},

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self)),
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1)),

any: function (x) {
return String(x)
Expand Down
2 changes: 1 addition & 1 deletion src/type/unit/function/unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,6 @@ export const createUnitFunction = /* #__PURE__ */ factory(name, dependencies, ({
return new Unit(value)
},

'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self))
'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, false, 1))
})
})
28 changes: 16 additions & 12 deletions src/utils/collection.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { isCollection, isMatrix } from './is.js'
import { isCollection, isMatrix, isArray } from './is.js'
import { IndexError } from '../error/IndexError.js'
import { arraySize } from './array.js'
import { _switch } from './switch.js'

/**
* Test whether an array contains collections
* @param {Array} array
Expand Down Expand Up @@ -33,7 +32,7 @@ export function deepForEach (array, callback) {
for (let i = 0, ii = array.length; i < ii; i++) {
const value = array[i]

if (Array.isArray(value)) {
if (isArray(value)) {
deepForEach(value, callback)
} else {
callback(value)
Expand All @@ -57,13 +56,18 @@ export function deepMap (array, callback, skipZeros, numberOfArguments = 3) {
if (array && isMatrix(array)) {
return array.map(x => callback(x), numberOfArguments)
}
if (array && (typeof array.map === 'function')) {
// TODO: replace array.map with a for loop to improve performance
return array.map(function (x) {
return deepMap(x, callback, skipZeros)
})
} else {
return callback(array)
return _deepMapArray(array, callback)

function _deepMapArray (array, callback, skipZeros) {
const zerosCallback = skipZeros ? x => x === 0 ? 0 : callback(x) : callback
if (isArray(array)) {
// TODO: replace array.map with a for loop to improve performance
return array.map(function (x) {
return _deepMapArray(x, callback)
})
} else {
return zerosCallback(array)
}
}
}

Expand All @@ -77,7 +81,7 @@ export function deepMap (array, callback, skipZeros, numberOfArguments = 3) {
* @return {Array | Matrix} res
*/
export function reduce (mat, dim, callback) {
const size = Array.isArray(mat) ? arraySize(mat) : mat.size()
const size = isArray(mat) ? arraySize(mat) : mat.size()
if (dim < 0 || (dim >= size.length)) {
// TODO: would be more clear when throwing a DimensionError here
throw new IndexError(dim, size.length)
Expand All @@ -102,7 +106,7 @@ function _reduce (mat, dim, callback) {
let i, ret, val, tran

if (dim <= 0) {
if (!Array.isArray(mat[0])) {
if (!isArray(mat[0])) {
val = mat[0]
for (i = 1; i < mat.length; i++) {
val = callback(val, mat[i])
Expand Down
Loading

0 comments on commit ff2f173

Please sign in to comment.