typocomath/src/Complex/type.ts

33 lines
1.3 KiB
TypeScript

import {joinTypes, typeOfDependency, Dependency} from '../core/Dispatcher.js'
export type Complex<T> = {re: T; im: T;}
export const Complex_type = {
test: <T>(dep: {testT: (z: unknown) => z is T}) =>
(z: unknown): z is Complex<T> =>
typeof z === 'object' && 're' in z && 'im' in z
&& dep.testT(z.re) && dep.testT(z.im),
infer: (dep: typeOfDependency) =>
(z: Complex<unknown>) => joinTypes(dep.typeOf(z.re), dep.typeOf(z.im)),
from: {
T: <T>(dep: Dependency<'zero', [T]>) => (t: T) =>
({re: t, im: dep.zero(t)}),
Complex: <U,T>(dep: {convert: (from: U) => T}) =>
(z: Complex<U>) => ({re: dep.convert(z.re), im: dep.convert(z.im)})
}
}
export const typeImps = <T>() => ({
complex_unary: (dep: Dependency<'zero', [T]>) =>
(t: T) => ({re: t, im: dep.zero(t)}),
complex_binary: (t: T, u: T) => ({re: t, im: u}),
zero: (dep: Dependency<'zero', [T]>) =>
(z: Complex<T>) => ({re: dep.zero(z.re), im: dep.zero(z.im)}),
one: (dep: Dependency<'zero' | 'one', [T]>) =>
(z: Complex<T>) => ({re: dep.one(z.re), re: dep.zero(z.im)}),
nan: (dep: Dependency<'nan', [T]>) =>
(z: Complex<T>) => ({re: dep.nan(z.re), im: dep.nan(z.im)}),
re: (dep: Dependency<'re', [T]>) =>
(z: Complex<T>) => dep.re(z.re)
})