math = {
let math = _math
math.config({
matrix: 'Array',
number: 'Fraction',
})
math.typed.addType({
name: 'UnitSum',
test: x => x && x.isUnitSum,
})
if (!math.type.Unit.UNITS.usd) {
math.createUnit('usd')
math.createUnit('dollar', 'usd')
math.createUnit('dollars', 'dollar')
}
math.import({
'sum': math.typed(
Object.assign({}, math.sum.signatures, {
'Array': (a) => a.reduce((x, y) => math.add(x, y), 0),
})),
'dot': math.typed(
Object.assign({}, math.dot.signatures, {
'UnitSum,UnitSum': (a, b) => a.dot(b),
'Unit,UnitSum': (a, b) => UnitSum.fromUnits([a]).dot(b),
'UnitSum,Unit': (a, b) => a.dot(UnitSum.fromUnits([b])),
'Unit,Unit': (a, b) => UnitSum.fromUnits([a]).dot(UnitSum.fromUnits([b])),
'UnitSum,Fraction': (a, b) => a.multiplyScalar(b),
'Fraction,UnitSum': (a, b) => b.multiplyScalar(a),
'Unit,Fraction': (a, b) => math.multiply(a, b),
'Fraction,Unit': (a, b) => math.multiply(a, b),
'Fraction,Fraction': (a, b) => math.multiply(a, b),
'UnitSum,number': (a, b) => a.multiplyScalar(b),
'number,UnitSum': (a, b) => b.multiplyScalar(a),
'Unit,number': (a, b) => math.multiply(a, b),
'number,Unit': (a, b) => math.multiply(a, b),
'number,number': (a, b) => math.multiply(a, b),
})),
'dot2': math.typed(
Object.assign({}, math.dot.signatures, {
'UnitSum,UnitSum': (a, b) => a.dot2(b),
'Unit,UnitSum': (a, b) => UnitSum.fromUnits([a]).dot2(b),
'UnitSum,Unit': (a, b) => a.dot2(UnitSum.fromUnits([b])),
'Unit,Unit': (a, b) => UnitSum.fromUnits([a]).dot2(UnitSum.fromUnits([b])),
'UnitSum,Fraction': (a, b) => a.multiplyScalar(b),
'Fraction,UnitSum': (a, b) => b.multiplyScalar(a),
'Unit,Fraction': (a, b) => math.multiply(a, b),
'Fraction,Unit': (a, b) => math.multiply(a, b),
'Fraction,Fraction': (a, b) => math.multiply(a, b),
'UnitSum,number': (a, b) => a.multiplyScalar(b),
'number,UnitSum': (a, b) => b.multiplyScalar(a),
'Unit,number': (a, b) => math.multiply(a, b),
'number,Unit': (a, b) => math.multiply(a, b),
'number,number': (a, b) => math.multiply(a, b),
})),
'dot3': math.typed(
Object.assign({}, math.dot.signatures, {
'UnitSum,UnitSum': (a, b) => a.dot3(b),
'Unit,UnitSum': (a, b) => UnitSum.fromUnits([a]).dot3(b),
'UnitSum,Unit': (a, b) => a.dot3(UnitSum.fromUnits([b])),
'Unit,Unit': (a, b) => UnitSum.fromUnits([a]).dot3(UnitSum.fromUnits([b])),
'UnitSum,Fraction': (a, b) => a.multiplyScalar(b),
'Fraction,UnitSum': (a, b) => b.multiplyScalar(a),
'Unit,Fraction': (a, b) => math.multiply(a, b),
'Fraction,Unit': (a, b) => math.multiply(a, b),
'Fraction,Fraction': (a, b) => math.multiply(a, b),
'UnitSum,number': (a, b) => a.multiplyScalar(b),
'number,UnitSum': (a, b) => b.multiplyScalar(a),
'Unit,number': (a, b) => math.multiply(a, b),
'number,Unit': (a, b) => math.multiply(a, b),
'number,number': (a, b) => math.multiply(a, b),
})),
'multiply': math.typed(
Object.assign({}, math.multiply.signatures, {
'UnitSum,Unit': (a, b) => a.multiplyUnit(b),
'Unit,UnitSum': (a, b) => b.multiplyUnit(a),
'UnitSum,Fraction': (a, b) => a.multiplyScalar(b),
'Fraction,UnitSum': (a, b) => b.multiplyScalar(a),
'UnitSum,number': (a, b) => a.multiplyScalar(b),
'number,UnitSum': (a, b) => b.multiplyScalar(a),
})),
'divide': math.typed(
Object.assign({}, math.divide.signatures, {
'UnitSum,Fraction': (a, b) => a.divideScalar(b),
'UnitSum,number': (a, b) => a.divideScalar(b),
'UnitSum,Unit': (a, b) => a.divideUnit(b),
})),
'add': math.typed(
Object.assign({}, math.add.signatures, {
'Unit,number': (x, y) => y == 0 ? x : UnitSum.fromUnits([x, math.unit(y)]),
'number,Unit': (x, y) => x == 0 ? y : UnitSum.fromUnits([y, math.unit(x)]),
'number,UnitSum': (x, y) => x == 0 ? y : y.addUnit(math.unit(x)),
'UnitSum,number': (x, y) => y == 0 ? x : x.addUnit(math.unit(y)),
'Fraction,Unit': (x, y) => x == 0 ? y : UnitSum.fromUnits([y, math.unit(x)]),
'Unit,Fraction': (x, y) => y == 0 ? x : UnitSum.fromUnits([x, math.unit(y)]),
'Fraction,UnitSum': (x, y) => x == 0 ? y : y.addUnit(math.unit(x)),
'UnitSum,Fraction': (x, y) => y == 0 ? x : x.addUnit(math.unit(y)),
'Unit,Unit': function (x, y) {
if (x.value === null || x.value === undefined) {
throw new Error('Parameter x contains a unit with undefined value')
}
if (y.value === null || y.value === undefined) {
throw new Error('Parameter y contains a unit with undefined value')
}
if (!x.equalBase(y)) {
return UnitSum.fromUnits([x, y])
}
const res = x.clone()
res.value = math.add(res.value, y.value)
res.fixPrefix = false
return res
},
'Unit,UnitSum': (a, b) => b.addUnit(a),
'UnitSum,Unit': (a, b) => a.addUnit(b),
'UnitSum,UnitSum': (a, b) => a.add(b),
})
),
}, {override: true})
return math
}