diff --git a/.gitignore b/.gitignore index c3b8f6b..df7c548 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ # Typescript # emitted code obj -build # ---> Node # Logs diff --git a/README.md b/README.md index 1c75e65..34649c2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ # typocomath -A final (?) prototype for a refactor of mathjs, culminating the picomath, pocomath, typomath series. Provides an extensible core with "fuzzy" types for its operations, that can at any time generate exact .d.ts file for its current state. +A final (?) prototype for a refactor of mathjs, culminating the picomath, pocomath, typomath series. Provides an extensible core with "fuzzy" types for its operations, that can at any time generate exact .d.ts file for its current state. \ No newline at end of file diff --git a/package.json5 b/package.json5 index 5c19d9e..874d5e3 100644 --- a/package.json5 +++ b/package.json5 @@ -4,7 +4,7 @@ description: 'A hopeful final typescipt-pragmatic mathjs proof-of-concept', main: 'index.ts', scripts: { - go: 'tsc && node build/infer.js' + test: 'echo "Error: no test specified" && exit 1', }, keywords: [ 'math', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c9669ff..095704b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,17 +1,14 @@ -lockfileVersion: '6.0' +lockfileVersion: 5.4 -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false +specifiers: + typescript: ^4.9.3 devDependencies: - typescript: - specifier: ^4.9.3 - version: 4.9.3 + typescript: 4.9.3 packages: - /typescript@4.9.3: + /typescript/4.9.3: resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} engines: {node: '>=4.2.0'} hasBin: true diff --git a/src/infer.ts b/src/infer.ts index 9eb09aa..7071c7b 100644 --- a/src/infer.ts +++ b/src/infer.ts @@ -5,79 +5,53 @@ * infer TypeScript interfaces from that using infer in template literal types. */ +type T = {} // TODO: how to do generics? + const create = createFactory<{ - number: number - bigint: bigint - string: string - any: any + number: number + bigint: bigint + T: T // TODO: how to do generics? + 'Complex': unknown // TODO: how to do generics? }>() -// These are our string based interfaces, which we can use both in typed-function and in TypeScript: -const Multiply = 'multiply(number,number)=>number' -const Sqrt = 'sqrt(number)=>number' -const Zero = 'zero(number)=>number' -// TODO: get generics working -// TODO: how to pass config? -const createSquare = create(Sqrt, [Multiply, Zero],dep => - x => dep.multiply(x, x) +// TODO: how to pass config? +// FIXME: multiple signatures do not work + +const createSquare = create({ + multiply: '(number, number) : number', + // zero: '(number) : number' + },dep => { + return (x: number) => dep.multiply(x, x) + } ) // the code works in JS, and works in TS const multiply = (a: number, b: number) => a * b -const zero = (a: number) => 0 -const square = createSquare({ multiply, zero }) +const square = createSquare({ multiply }) console.log('square', square(8)) // 64 function createFactory>() { - type BaseTypeNames = string & keyof BaseTypes - type ResolveType = BaseTypes[TypeName] + type K = string & keyof BaseTypes - type Value = K + type ResolveType = BaseTypes[T] - type ResolveArguments = S extends '' - ? [] - : S extends `${infer Arg extends BaseTypeNames},${infer Tail}` - ? [ResolveType, ...ResolveArguments] - : S extends `${infer Arg extends BaseTypeNames}` - ? [ResolveType] - : never + type ResolveArguments = + S extends '' ? [] : + S extends `${infer T extends K}, ${infer U}` + ? [ResolveType, ...ResolveArguments] + : S extends `${infer T extends K}` ? [ResolveType] + : never; - type DependencyRecord = - FnType extends Value - ? K extends `${infer Name}(${infer Args})=>${infer ReturnType extends BaseTypeNames}` - ? Record) => ResolveType> - : never - : never + type ResolveFunctionDef = + T extends `${infer Name}(${infer Args}) : ${infer L extends K}` + ? (...args: ResolveArguments) => ResolveType + : never - type CreatedFunctionType = - FnType extends Value - ? K extends `${infer Name}(${infer Args})=>${infer ReturnType extends BaseTypeNames}` - ? (...args: ResolveArguments) => ResolveType - : never - : never - - // inspired by: https://stackoverflow.com/questions/68391632/infer-type-from-array-literal - type DependenciesRecord< - Arr extends Array>, - Result extends Record = {} - > = Arr extends [] - ? Result - : Arr extends [infer H, ...infer Tail] - ? Tail extends Array> - ? H extends Value - ? DependenciesRecord> - : never - : never - : never - - return function create[], W extends Value>( - signature: W, - dependencies: [...Dependencies], - callback: (deps: DependenciesRecord<[...Dependencies]>) => CreatedFunctionType - ) { - console.log('Creating typed-function with', { signature, dependencies }) - // TODO: create a typed-function for real - return callback - } + return function create( + dependencies: { [L in T]: U }, + callback: (deps: { [L in T]: ResolveFunctionDef }) => V + ) { + return callback + } } diff --git a/tsconfig.json b/tsconfig.json index 797c2d5..aae3a94 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,6 +2,6 @@ "compilerOptions": { "target": "ES2022", "rootDir": "./src", - "outDir": "./build" + "outDir": "./obj" } }