From 1660056e4e9e7355aaa7316fbd88297e1c71b72e Mon Sep 17 00:00:00 2001 From: Lordfirespeed <28568841+Lordfirespeed@users.noreply.github.com> Date: Sat, 24 Aug 2024 18:45:57 +0100 Subject: [PATCH 1/3] add `index.d.ts` and declare it in `package.json` --- index.d.ts | 24 ++++++++++++++++++++++++ package.json | 2 ++ 2 files changed, 26 insertions(+) create mode 100644 index.d.ts diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..e420f62 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,24 @@ +type CPSFn< + Callbacks extends Array<(...args: unknown[]) => void> +> = (...args: Callbacks) => void + +type ChainFns< + FromCallbacks extends Array<(...args: unknown[]) => void>, + ToCallbacks extends Array<(...args: unknown[]) => void>, +> = { + [T in keyof FromCallbacks]?: (...args: Parameters) => CPSFn | undefined +} + +type CPS< + Callbacks extends Array<(...args: unknown[]) => void> +> = CPSFn & { + chain< + ToCallbacks extends Array<(...args: unknown[]) => void> + >(...fns: ChainFns): CPS +} + +declare function CPS< + Callbacks extends Array<(...args: unknown[]) => void> +>(fn: CPSFn): CPS + +export { CPS, CPSFn } diff --git a/package.json b/package.json index a4ded3b..a637d06 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,10 @@ "name": "cpsfy", "description": "Tiny goodies for Continuation-Passing-Style functions", "main": "index.js", + "types": "index.d.ts", "files": [ "index.js", + "index.d.ts", "utils.js" ], "repository": "https://github.com/dmitriz/cpsfy.git", From 3ce3b68473acd7f38a3e8b9a5e55d80c24c5616e Mon Sep 17 00:00:00 2001 From: Lordfirespeed <28568841+Lordfirespeed@users.noreply.github.com> Date: Sat, 24 Aug 2024 18:46:43 +0100 Subject: [PATCH 2/3] add a 'test' file for `CPS.chain` --- type-test/chain.ts | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 type-test/chain.ts diff --git a/type-test/chain.ts b/type-test/chain.ts new file mode 100644 index 0000000..34c322d --- /dev/null +++ b/type-test/chain.ts @@ -0,0 +1,35 @@ +import { CPS, type CPSFn } from "../index" + +const cpsFn: CPSFn<[ + (a: number, b: number) => void, + (a: number, b: string) => void, +]> = (cb1, cb2) => { cb1(2,3); cb2(7, "bar") } + +const f1 = (x: number, y: number): CPSFn<[ + (x: number, y?: string) => void, + (x: number) => void, +]> => (cb1, cb2) => { cb1(x+y); cb2(x-y) } + +const f2 = (x: number, y: string): CPSFn<[ + (x: number, y?: string) => void, +]> => (cb1) => { cb1(x, y) } + +const chainOneWay = CPS(cpsFn).chain(f1, f2) + +const chainSecondWay = CPS(cpsFn).chain<[ + (x: number, y?: string) => void, + (x: number) => void, +]>( + (x, y) => (cb1, cb2) => { cb1(x+y); cb2(x-y) }, + (x, y) => (cb1) => { cb1(x, y) } +) + +const chainThirdWay = CPS(cpsFn).chain( + (x: number, y: number) => ( + cb1: (x: number, y?: string) => void, + cb2: (x: number) => void + ) => { cb1(x+y); cb2(x-y) }, + (x: number, y: string) => ( + cb1: (x: number, y?: string) => void, + ) => { cb1(x, y) } +) From 09681241712cfdc4512bdcefee66524028f2d111 Mon Sep 17 00:00:00 2001 From: Lordfirespeed <28568841+Lordfirespeed@users.noreply.github.com> Date: Sat, 24 Aug 2024 18:51:46 +0100 Subject: [PATCH 3/3] parenthesize to mitigate ambiguity --- index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.d.ts b/index.d.ts index e420f62..b45cce9 100644 --- a/index.d.ts +++ b/index.d.ts @@ -6,7 +6,7 @@ type ChainFns< FromCallbacks extends Array<(...args: unknown[]) => void>, ToCallbacks extends Array<(...args: unknown[]) => void>, > = { - [T in keyof FromCallbacks]?: (...args: Parameters) => CPSFn | undefined + [T in keyof FromCallbacks]?: ((...args: Parameters) => CPSFn) | undefined } type CPS<