import type {configDependency} from '../core/Config.js' import type {Dependencies, Signature} from '../interfaces/type.js' import { $implement } from '../interfaces/type.js' export const add: Signature<'add', number> = (a, b) => a + b export const unaryMinus: Signature<'unaryMinus', number> = a => -a export const conj: Signature<'conj', number> = a => a export const subtract: Signature<'subtract', number> = (a, b) => a - b export const multiply: Signature<'multiply', number> = (a, b) => a * b export const absquare: Signature<'absquare', number> = a => a * a export const reciprocal: Signature<'reciprocal', number> = a => 1 / a export const divide: Signature<'divide', number> = (a, b) => a / b const basicSqrt = a => isNaN(a) ? NaN : Math.sqrt(a) export const conservativeSqrt: Signature<'conservativeSqrt', number> = basicSqrt $implement!('sqrt', (dep: configDependency & Dependencies<'complex', number>): Signature<'sqrt', number> => { if (dep.config.predictable || !dep.complex) { return basicSqrt } return a => { if (isNaN(a)) return NaN if (a >= 0) return Math.sqrt(a) return dep.complex(0, Math.sqrt(unaryMinus(a))) } })