2023-02-02 14:52:15 +00:00
|
|
|
import 'reflect-metadata'
|
|
|
|
|
2022-12-07 01:21:05 +00:00
|
|
|
import {Dispatcher} from './core/Dispatcher.js'
|
|
|
|
import * as Specifications from './all.js'
|
2023-01-22 01:34:57 +00:00
|
|
|
import {Complex} from './Complex/type.js'
|
|
|
|
import {absquare as absquare_complex} from './Complex/arithmetic.js'
|
|
|
|
|
2023-02-02 14:52:15 +00:00
|
|
|
import { CallSite, ReflectedObjectRef, reflect } from 'typescript-rtti'
|
2023-01-25 13:42:23 +00:00
|
|
|
import { square } from './generic/arithmetic.js'
|
|
|
|
|
|
|
|
// verify that typescript-rtti works (just as experiment)
|
|
|
|
const add = (a: number, b: number): number => a + b
|
|
|
|
console.log('reflect add')
|
|
|
|
console.log('parameterNames', reflect(add).parameterNames)
|
|
|
|
console.log('parameterTypes', reflect(add).parameterTypes.map(type => type.toString()))
|
|
|
|
console.log('returnType', reflect(add).returnType.toString())
|
|
|
|
console.log()
|
|
|
|
// output:
|
|
|
|
// reflect function add
|
|
|
|
// parameterNames [ 'a', 'b' ]
|
|
|
|
// parameterTypes [ 'class Number', 'class Number' ]
|
|
|
|
// returnType class Number
|
|
|
|
|
|
|
|
// try out a very simple case (just as experiment)
|
2023-02-02 14:52:15 +00:00
|
|
|
function createSquare(deps: {
|
|
|
|
multiply: (a: number, b: number) => number,
|
|
|
|
subtract: (a: number, b: number) => number
|
2023-01-25 13:42:23 +00:00
|
|
|
}) {
|
|
|
|
return (a: number) => deps.multiply(a, a)
|
|
|
|
}
|
|
|
|
console.log('reflect createSquare')
|
|
|
|
console.log('parameter names', reflect(createSquare).parameters.map(parameter => parameter.name))
|
2023-02-02 14:52:15 +00:00
|
|
|
// console.log('parameter[0]', (reflect(createSquare).parameters[0] as ReflectedFunctionParameter))
|
2023-01-25 13:42:23 +00:00
|
|
|
// @ts-ignore
|
|
|
|
console.log('parameterTypes[0]', (reflect(createSquare).parameterTypes[0] as ReflectedObjectRef)._ref.m)
|
2023-02-02 14:52:15 +00:00
|
|
|
console.log('parameterTypes[0].ref.m[0]',
|
2023-01-25 13:42:23 +00:00
|
|
|
// @ts-ignore
|
|
|
|
(reflect(createSquare).parameterTypes[0] as ReflectedObjectRef)._ref.m[0].n,
|
|
|
|
// @ts-ignore
|
|
|
|
(reflect(createSquare).parameterTypes[0] as ReflectedObjectRef)._ref.m[0]
|
|
|
|
)
|
2023-02-02 14:52:15 +00:00
|
|
|
console.log('parameterTypes[0].ref.m[0].t.m',
|
|
|
|
// @ts-ignore
|
|
|
|
(reflect(createSquare).parameterTypes[0] as ReflectedObjectRef)._ref.m[0].t.m
|
|
|
|
)
|
2023-01-25 13:42:23 +00:00
|
|
|
// @ts-ignore
|
2023-02-02 14:52:15 +00:00
|
|
|
// console.log('parameters[0]', reflect(createSquare).parameters[0])
|
2023-01-25 13:42:23 +00:00
|
|
|
// FIXME: where to find the information of the types of the dependencies multiply and subtract?
|
|
|
|
|
2023-02-02 14:52:15 +00:00
|
|
|
// Test whether we loose the type information when casting to a generic interface
|
|
|
|
// Conclusion: we keep the information, that is good.
|
|
|
|
console.log()
|
|
|
|
console.log('reflect createFunction')
|
|
|
|
type MathjsDependencies = Record<string, Function>
|
|
|
|
type MathjsCreateFunction = (deps: MathjsDependencies) => Function
|
|
|
|
const createFunction: MathjsCreateFunction = createSquare as MathjsCreateFunction
|
|
|
|
console.log('parameter names', reflect(createFunction).parameters.map(parameter => parameter.name))
|
|
|
|
// @ts-ignore
|
|
|
|
console.log('parameterTypes[0]', (reflect(createFunction).parameterTypes[0] as ReflectedObjectRef)._ref.m)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
console.log()
|
|
|
|
console.log('CallSite')
|
|
|
|
function foo<T>(call? : CallSite) {
|
|
|
|
console.log(reflect(call).typeParameters[0].isClass(String))
|
|
|
|
}
|
2023-01-25 13:42:23 +00:00
|
|
|
|
2023-02-02 14:52:15 +00:00
|
|
|
function bar<T>(call? : CallSite) {
|
|
|
|
foo<T>();
|
|
|
|
}
|
|
|
|
bar<String>();
|
2023-01-25 13:42:23 +00:00
|
|
|
|
|
|
|
// FIXME: get all types out of Specifications
|
|
|
|
// console.log('Specifications', reflect(Specifications)) // Throws errors
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: import all specificiations (turned off for debugging purposes)
|
|
|
|
// export default new Dispatcher(Specifications)
|
|
|
|
|
|
|
|
|
2023-01-22 01:34:57 +00:00
|
|
|
const mockRealAdd = (a: number, b: number) => a+b
|
|
|
|
const mockComplexAbsquare = (z: Complex<number>) => z.re*z.re + z.im*z.im
|
|
|
|
|
|
|
|
const quatAbsquare = absquare_complex({
|
|
|
|
add: mockRealAdd,
|
|
|
|
absquare: mockComplexAbsquare
|
|
|
|
})
|
|
|
|
|
|
|
|
const myabs = quatAbsquare({re: {re: 0, im: 1}, im: {re:2, im: 3}})
|
|
|
|
const typeTest: typeof myabs = 7 // check myabs is just a number
|
|
|
|
|
|
|
|
console.log('Result is', myabs)
|