import { Config } from '../core/Config.js' import type { FnComplexBinary } from '../Complex/type.js' import { FnAdd, FnConj, FnSubtract, FnUnaryMinus, FnMultiply, FnAbsSquare, FnReciprocal, FnDivide, FnConservativeSqrt, FnSqrt } from '../interfaces/arithmetic.js' export const add: FnAdd = (a, b) => a + b export const addReal = add export const unaryMinus: FnUnaryMinus = (a) => -a export const conj: FnConj = (a) => a export const subtract: FnSubtract = (a, b) => a - b export const multiply: FnMultiply = (a, b) => a * b export const absquare: FnAbsSquare = (a) => a * a export const reciprocal: FnReciprocal = (a) => 1 / a export const divide: FnDivide = (a, b) => a / b export const divideByReal = divide export const conservativeSqrt: FnConservativeSqrt = (a) => isNaN(a) ? NaN : Math.sqrt(a) export const sqrt = (dep: { config: Config, complex: FnComplexBinary }): FnSqrt => { 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(unaryMinus(a))) } }