From 20078d2c879bcbaa495eb60ec734665171b10433 Mon Sep 17 00:00:00 2001 From: Jos de Jong Date: Thu, 21 Sep 2023 14:58:51 +0200 Subject: [PATCH 1/2] use ts-macros directly from Github until v2.4.2 is published on npm --- package.json5 | 2 +- pnpm-lock.yaml | 23 +++++++++++++---------- src/interfaces/type.ts | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/package.json5 b/package.json5 index cd006e8..a0cd6c3 100644 --- a/package.json5 +++ b/package.json5 @@ -28,7 +28,7 @@ 'del-cli': '5.1.0', mkdirp: '3.0.1', 'source-map': '^0.7.4', - 'ts-macros': '^2.4.1', + 'ts-macros': 'github:GoogleFeud/ts-macros', 'ts-patch': '^3.0.2', typescript: '^5.1.6', }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index afb4e0a..8c865d2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ devDependencies: specifier: ^0.7.4 version: 0.7.4 ts-macros: - specifier: ^2.4.1 - version: 2.4.1(typescript@5.1.6) + specifier: github:GoogleFeud/ts-macros + version: github.com/GoogleFeud/ts-macros/4f8c22db77e3b5840e3a2f285e30436f71c27e15(typescript@5.1.6) ts-patch: specifier: ^3.0.2 version: 3.0.2 @@ -843,14 +843,6 @@ packages: engines: {node: '>=12'} dev: true - /ts-macros@2.4.1(typescript@5.1.6): - resolution: {integrity: sha512-DmrftFZ5pgM7dw8ySYcd90wGEfjp7yx9MFw/YyJHNdwKYdUb//lcy/XI/Lvg3LbrGIbjBMEj1rzuc5Kfkzvafg==} - peerDependencies: - typescript: 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x - dependencies: - typescript: 5.1.6 - dev: true - /ts-patch@3.0.2: resolution: {integrity: sha512-iTg8euqiNsNM1VDfOsVIsP0bM4kAVXU38n7TGQSkky7YQX/syh6sDPIRkvSS0HjT8ZOr0pq1h+5Le6jdB3hiJQ==} hasBin: true @@ -905,3 +897,14 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true + + github.com/GoogleFeud/ts-macros/4f8c22db77e3b5840e3a2f285e30436f71c27e15(typescript@5.1.6): + resolution: {tarball: https://codeload.github.com/GoogleFeud/ts-macros/tar.gz/4f8c22db77e3b5840e3a2f285e30436f71c27e15} + id: github.com/GoogleFeud/ts-macros/4f8c22db77e3b5840e3a2f285e30436f71c27e15 + name: ts-macros + version: 2.4.2 + peerDependencies: + typescript: 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x + dependencies: + typescript: 5.1.6 + dev: true diff --git a/src/interfaces/type.ts b/src/interfaces/type.ts index 3728f11..75d1b4c 100644 --- a/src/interfaces/type.ts +++ b/src/interfaces/type.ts @@ -84,5 +84,5 @@ export type AliasOf = T & {aliasOf?: Name} // For defining implementations with type reflection export function $implement(name: string, expr: Impl) { $$define!(name, expr, false, true); // Final `true` is export - $$ident!(name).reflectedType = $$typeToString!(); + $$ident!(name).reflectedType = $$typeToString!(true, false, true); } From 0ebaaf35eee8a67c97a442f52be17e777386278b Mon Sep 17 00:00:00 2001 From: Jos de Jong Date: Thu, 21 Sep 2023 15:02:42 +0200 Subject: [PATCH 2/2] feat: convert sqrt for numbers --- package.json5 | 2 +- src/index.ts | 19 ++++++++++++++++--- src/numbers/arithmetic.ts | 22 ++++++++++++---------- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/package.json5 b/package.json5 index a0cd6c3..b6575a1 100644 --- a/package.json5 +++ b/package.json5 @@ -7,7 +7,7 @@ test: 'echo "Error: no test specified" && exit 1', build: 'mkdirp build && cpy etc/package.json build --flat && tsc', start: 'node build', - go: 'pnpm --sequential "/build|start/"', + go: 'pnpm --sequential "/clean|build|start/"', clean: 'del-cli build', }, packageManager: 'pnpm', diff --git a/src/index.ts b/src/index.ts index 8b4ecfd..dc389e8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,17 +8,30 @@ import {absquare as absquare_complex} from './Complex/arithmetic.js' const mockRealAdd = (a: number, b: number) => a+b const mockComplexAbsquare = (z: Complex) => z.re*z.re + z.im*z.im +const mockComplex = (re: number, im: number) => ({ re, im }) + +const config = { + predictable: false, + epsilon: 1e-14 +} const quatAbsquare = absquare_complex({ - add: mockRealAdd, - absquare: mockComplexAbsquare + 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=', myabs) -console.log('Result is', myabs) +const sqrt = Specifications.numbers.sqrt({ + config, + complex: mockComplex +}) +console.log('Result of sqrt(16)=', sqrt(16)) +console.log('Result of sqrt(-4)=', sqrt(-4)) // Check type of the generic square implementation +console.log('Type of sqrt (number) is', Specifications.numbers.sqrt.reflectedType) console.log('Type of square is', Specifications.generic.square.reflectedType) console.log('Type of complex square root is', Specifications.complex.sqrt.reflectedType) diff --git a/src/numbers/arithmetic.ts b/src/numbers/arithmetic.ts index 11da5c2..d2d3414 100644 --- a/src/numbers/arithmetic.ts +++ b/src/numbers/arithmetic.ts @@ -1,5 +1,6 @@ import type {configDependency} from '../core/Config.js' import type {Dependencies, Signature} from '../interfaces/type.js' +import { $implement } from '../interfaces/type.js' export const add: Signature<'add', number> = (a, b) => a + b export const unaryMinus: Signature<'unaryMinus', number> = a => -a @@ -13,13 +14,14 @@ 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))) - } - } +$implement!('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))) + } + })