Glen Whitney
cc1e66c054
Adds a new subdirectory `interfaces` where standard interfaces are defined. Additional interfaces for a given operation can be added with an `AliasOf` type operator. Provides type operators that give the return type, full function type, and the type of a dependency on, a given operator. Resolves #6. Co-authored-by: Glen Whitney <glen@studioinfinity.org> Co-authored-by: Jos de Jong <wjosdejong@gmail.com> Reviewed-on: #8
26 lines
1.2 KiB
TypeScript
26 lines
1.2 KiB
TypeScript
import type {configDependency} from '../core/Config.js'
|
|
import type {Dependencies, Signature} 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
|
|
|
|
export const 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)))
|
|
}
|
|
}
|