27 lines
872 B
TypeScript
27 lines
872 B
TypeScript
|
import {implementations} from '@/core/Dispatcher'
|
||
|
import type {CommonSignature} from '@/interfaces/type'
|
||
|
|
||
|
const conservativeSqrt = (a: number) => isNaN(a) ? NaN : Math.sqrt(a)
|
||
|
|
||
|
export default implementations<CommonSignature<number>>()
|
||
|
.independent({
|
||
|
add: (a, b) => a + b,
|
||
|
unaryMinus: a => -a,
|
||
|
subtract: (a, b) => a - b,
|
||
|
multiply: (a, b) => a * b,
|
||
|
absquare: a => a * a,
|
||
|
reciprocal: a => 1 / a,
|
||
|
divide: (a, b) => a / b,
|
||
|
conj: a => a,
|
||
|
conservativeSqrt })
|
||
|
.dependent({config: {}, complex: {}}, {
|
||
|
sqrt: dep => {
|
||
|
if (dep.config().predictable || !dep.complex) return conservativeSqrt
|
||
|
return a => {
|
||
|
if (isNaN(a)) return NaN
|
||
|
if (a >= 0) return Math.sqrt(a)
|
||
|
return dep.complex(0, Math.sqrt(-a))
|
||
|
}
|
||
|
}})
|
||
|
.ship()
|