Skip to content

Commit 7456afd

Browse files
feat: Provide overloading methods with types
Also separate and better fine types for use therein.
1 parent f514e79 commit 7456afd

2 files changed

Lines changed: 194 additions & 120 deletions

File tree

README.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,75 @@ To assist with mostly unit tests, but perhaps in scenarios outside of GPU.js, th
957957

958958
## Typescript Typings
959959
Typescript is supported! Typings can be found [here](src/index.d.ts)!
960+
For strongly typed kernels:
961+
```ts
962+
import { GPU, IKernelFunctionThis } from './src';
963+
const gpu = new GPU();
964+
965+
function kernelFunction(this: IKernelFunctionThis): number {
966+
return 1 + this.thread.x;
967+
}
968+
969+
const kernelMap = gpu.createKernel<typeof kernelFunction>(kernelFunction)
970+
.setOutput([3,3,3]);
971+
972+
const result = kernelMap();
973+
974+
console.log(result as number[][][]);
975+
```
976+
977+
For strongly typed mapped kernels:
978+
```ts
979+
import { GPU, Texture, IKernelFunctionThis } from './src';
980+
const gpu = new GPU();
981+
982+
function kernelFunction(this: IKernelFunctionThis): [number, number] {
983+
return [1, 1];
984+
}
985+
986+
function subKernel(): [number, number] {
987+
return [1, 1];
988+
}
989+
990+
const kernelMap = gpu.createKernelMap<typeof kernelFunction>({
991+
test: subKernel,
992+
}, kernelFunction)
993+
.setOutput([1])
994+
.setPipeline(true);
995+
996+
const result = kernelMap();
997+
998+
console.log((result.test as Texture).toArray() as [number, number][]);
999+
```
1000+
1001+
For extending constants:
1002+
```ts
1003+
import { GPU, IKernelFunctionThis } from './src';
1004+
const gpu = new GPU();
1005+
1006+
interface IConstants {
1007+
screen: [number, number];
1008+
}
1009+
1010+
type This = {
1011+
constants: IConstants
1012+
} & IKernelFunctionThis;
1013+
1014+
function kernelFunction(this: This): number {
1015+
const { screen } = this.constants;
1016+
return 1 + screen[0];
1017+
}
1018+
1019+
const kernelMap = gpu.createKernel<typeof kernelFunction>(kernelFunction)
1020+
.setOutput([3,3,3])
1021+
.setConstants<IConstants>({
1022+
screen: [1, 1]
1023+
});
1024+
1025+
const result = kernelMap();
1026+
1027+
console.log(result as number[][][]);
1028+
```
9601029

9611030
## Destructured Assignments **New in V2!**
9621031
Destructured Objects and Arrays work in GPU.js.

src/index.d.ts

Lines changed: 125 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,57 @@ export class GPU {
1313
nativeFunctions: IGPUNativeFunction[];
1414
addFunction(kernel: KernelFunction, settings?: IGPUFunctionSettings): this;
1515
addNativeFunction(name: string, source: string): this;
16-
combineKernels(...kernels: Function[]): KernelFunction;
16+
combineKernels(...kernels: KernelFunction[]): KernelFunction;
17+
combineKernels<KF extends KernelFunction>(...kernels: KF[]):
18+
((...args: Parameters<KF>) =>
19+
ReturnType<KF>[]
20+
| ReturnType<KF>[][]
21+
| ReturnType<KF>[][][]
22+
| Texture
23+
| void
24+
)
25+
& IKernelRunShortcutBase;
1726
createKernel(kernel: KernelFunction, settings?: IGPUKernelSettings): IKernelRunShortcut;
18-
createKernelMap(subKernels: Object | Array<Function>, rootKernel: Function, settings?: IGPUKernelSettings): IKernelRunShortcut;
27+
createKernel<KF extends KernelFunction>(kernel: KF, settings?: IGPUKernelSettings):
28+
((...args: Parameters<KF>) =>
29+
ReturnType<KF>[]
30+
| ReturnType<KF>[][]
31+
| ReturnType<KF>[][][]
32+
| Texture
33+
| void
34+
)
35+
& IKernelRunShortcutBase;
36+
createKernelMap(
37+
subKernels: {
38+
[targetLocation: string]: KernelFunction
39+
}
40+
| KernelFunction[],
41+
rootKernel: KernelFunction,
42+
settings?: IGPUKernelSettings): ((() => IMappedKernelResult) & IKernelRunShortcut);
43+
createKernelMap<KF extends KernelFunction>(
44+
subKernels: {
45+
[targetLocation: string]: KF
46+
}
47+
| KF[],
48+
rootKernel: KF,
49+
settings?: IGPUKernelSettings
50+
):
51+
((...args: Parameters<KF>) => {
52+
result?:
53+
ReturnType<KF>[]
54+
| ReturnType<KF>[][]
55+
| ReturnType<KF>[][][]
56+
| Texture
57+
| void;
58+
[targetLocation: string]:
59+
ReturnType<KF>[]
60+
| ReturnType<KF>[][]
61+
| ReturnType<KF>[][][]
62+
| Texture
63+
| void
64+
}
65+
)
66+
& IKernelRunShortcutBase;
1967
destroy(): void;
2068
Kernel: typeof Kernel;
2169
mode: string;
@@ -33,6 +81,11 @@ export interface IGPUNativeFunction extends IGPUFunctionSettings {
3381
settings: object;
3482
}
3583

84+
export interface IMappedKernelResult {
85+
result?: KernelVariable;
86+
[targetLocation: string]: KernelVariable
87+
}
88+
3689
export interface INativeFunctionList {
3790
[functionName: string]: string
3891
}
@@ -119,73 +172,11 @@ export abstract class Kernel {
119172
getPixels(flip?: boolean): Uint8ClampedArray[];
120173
prependString(value: string): void;
121174
hasPrependString(value: string): boolean;
122-
constructor(kernel: KernelFunction|IJSON, settings?: IDirectKernelSettings);
175+
constructor(kernel: KernelFunction|IJSON|string, settings?: IDirectKernelSettings);
123176
onRequestSwitchKernel?: Kernel;
124-
build(
125-
arg1?: KernelVariable,
126-
arg2?: KernelVariable,
127-
arg3?: KernelVariable,
128-
arg4?: KernelVariable,
129-
arg5?: KernelVariable,
130-
arg6?: KernelVariable,
131-
arg7?: KernelVariable,
132-
arg8?: KernelVariable,
133-
arg9?: KernelVariable,
134-
arg10?: KernelVariable,
135-
arg11?: KernelVariable,
136-
arg12?: KernelVariable,
137-
arg13?: KernelVariable,
138-
arg14?: KernelVariable,
139-
arg15?: KernelVariable,
140-
arg16?: KernelVariable,
141-
arg17?: KernelVariable,
142-
arg18?: KernelVariable,
143-
arg19?: KernelVariable,
144-
arg20?: KernelVariable): void;
145-
run(
146-
arg1?: KernelVariable,
147-
arg2?: KernelVariable,
148-
arg3?: KernelVariable,
149-
arg4?: KernelVariable,
150-
arg5?: KernelVariable,
151-
arg6?: KernelVariable,
152-
arg7?: KernelVariable,
153-
arg8?: KernelVariable,
154-
arg9?: KernelVariable,
155-
arg10?: KernelVariable,
156-
arg11?: KernelVariable,
157-
arg12?: KernelVariable,
158-
arg13?: KernelVariable,
159-
arg14?: KernelVariable,
160-
arg15?: KernelVariable,
161-
arg16?: KernelVariable,
162-
arg17?: KernelVariable,
163-
arg18?: KernelVariable,
164-
arg19?: KernelVariable,
165-
arg20?: KernelVariable
166-
): KernelVariable;
167-
toString(
168-
arg1?: KernelVariable,
169-
arg2?: KernelVariable,
170-
arg3?: KernelVariable,
171-
arg4?: KernelVariable,
172-
arg5?: KernelVariable,
173-
arg6?: KernelVariable,
174-
arg7?: KernelVariable,
175-
arg8?: KernelVariable,
176-
arg9?: KernelVariable,
177-
arg10?: KernelVariable,
178-
arg11?: KernelVariable,
179-
arg12?: KernelVariable,
180-
arg13?: KernelVariable,
181-
arg14?: KernelVariable,
182-
arg15?: KernelVariable,
183-
arg16?: KernelVariable,
184-
arg17?: KernelVariable,
185-
arg18?: KernelVariable,
186-
arg19?: KernelVariable,
187-
arg20?: KernelVariable
188-
): string;
177+
build(...args: KernelVariable[]): void;
178+
run(...args: KernelVariable[]): KernelVariable;
179+
toString(...args: KernelVariable[]): string;
189180
toJSON(): IJSON;
190181
setOutput(flag: number[]): this;
191182
setWarnVarUsage(flag: boolean): this;
@@ -194,7 +185,8 @@ export abstract class Kernel {
194185
setDebug(flag: boolean): this;
195186
setGraphical(flag: boolean): this;
196187
setLoopMaxIterations(flag: number): this;
197-
setConstants(flag: object): this;
188+
setConstants(flag: IConstants): this;
189+
setConstants<T>(flag: T & IConstants): this;
198190
setConstantTypes(flag: IKernelValueTypes): this;
199191
setDynamicOutput(flag: boolean): this;
200192
setDynamicArguments(flag: boolean): this;
@@ -332,30 +324,14 @@ export interface ITypesList {
332324
[typeName: string]: GPUVariableType
333325
}
334326

335-
export interface IKernelRunShortcut extends Kernel {
327+
export interface IKernelRunShortcutBase extends Kernel {
336328
kernel: Kernel;
337-
(
338-
arg1?: KernelVariable,
339-
arg2?: KernelVariable,
340-
arg3?: KernelVariable,
341-
arg4?: KernelVariable,
342-
arg5?: KernelVariable,
343-
arg6?: KernelVariable,
344-
arg7?: KernelVariable,
345-
arg8?: KernelVariable,
346-
arg9?: KernelVariable,
347-
arg10?: KernelVariable,
348-
arg11?: KernelVariable,
349-
arg12?: KernelVariable,
350-
arg13?: KernelVariable,
351-
arg14?: KernelVariable,
352-
arg15?: KernelVariable,
353-
arg16?: KernelVariable,
354-
arg17?: KernelVariable,
355-
arg18?: KernelVariable,
356-
arg19?: KernelVariable,
357-
arg20?: KernelVariable
358-
): KernelOutput;
329+
exec(): Promise<KernelOutput>;
330+
}
331+
332+
export interface IKernelRunShortcut extends IKernelRunShortcutBase {
333+
kernel: Kernel;
334+
(...args: KernelVariable[]): KernelOutput;
359335
exec(): Promise<KernelOutput>;
360336
}
361337

@@ -388,46 +364,59 @@ export interface IKernelFunctionThis {
388364
export type KernelVariable =
389365
boolean
390366
| number
391-
| number[]
392-
| number[][]
393-
| number[][][]
394367
| Texture
395368
| Input
396369
| HTMLImageElement
397370
| HTMLVideoElement
398371
| HTMLImageElement[]
399372
| KernelOutput;
400373

401-
export type ThreadKernelVariable = boolean | number | number[] | number[][] | number[][][];
374+
export type ThreadKernelVariable
375+
= boolean
376+
| number
377+
| number[]
378+
| number[][]
379+
| number[][][]
380+
381+
| [number, number]
382+
| [number, number][]
383+
| [number, number][][]
384+
| [number, number][][][]
385+
386+
| [number, number, number]
387+
| [number, number, number][]
388+
| [number, number, number][][]
389+
| [number, number, number][][][]
390+
391+
| [number, number, number, number]
392+
| [number, number, number, number][]
393+
| [number, number, number, number][][]
394+
| [number, number, number, number][][][]
395+
;
396+
402397
export type KernelFunction = ((
403398
this: IKernelFunctionThis,
404-
arg1?: ThreadKernelVariable,
405-
arg2?: ThreadKernelVariable,
406-
arg3?: ThreadKernelVariable,
407-
arg4?: ThreadKernelVariable,
408-
arg5?: ThreadKernelVariable,
409-
arg6?: ThreadKernelVariable,
410-
arg7?: ThreadKernelVariable,
411-
arg8?: ThreadKernelVariable,
412-
arg9?: ThreadKernelVariable,
413-
arg10?: ThreadKernelVariable,
414-
arg11?: ThreadKernelVariable,
415-
arg12?: ThreadKernelVariable,
416-
arg13?: ThreadKernelVariable,
417-
arg14?: ThreadKernelVariable,
418-
arg15?: ThreadKernelVariable,
419-
arg16?: ThreadKernelVariable,
420-
arg17?: ThreadKernelVariable,
421-
arg18?: ThreadKernelVariable,
422-
arg19?: ThreadKernelVariable,
423-
arg20?: ThreadKernelVariable,
424-
) => KernelOutput) | object | string;
399+
...args: ThreadKernelVariable[]
400+
) => KernelOutput);
425401

426402
export type KernelOutput = void
403+
| number
427404
| number[]
428405
| number[][]
429406
| number[][][]
430-
| number[][][][]
407+
408+
| [number, number][]
409+
| [number, number, number][]
410+
| [number, number, number, number][]
411+
412+
| [number, number][][]
413+
| [number, number, number][][]
414+
| [number, number, number, number][][]
415+
416+
| [number, number][][][]
417+
| [number, number, number][][][]
418+
| [number, number, number, number][][][]
419+
431420
| Texture;
432421

433422
export interface IFunction {
@@ -516,7 +505,23 @@ export class Texture {
516505
kernel: Kernel;
517506
}
518507

519-
export type TextureArrayOutput = number[] | number[][] | number[][][] | number[][][][];
508+
export type TextureArrayOutput
509+
= number[]
510+
| number[][]
511+
| number[][][]
512+
513+
| [number, number][]
514+
| [number, number][][]
515+
| [number, number][][][]
516+
517+
| [number, number, number][]
518+
| [number, number, number][][]
519+
| [number, number, number][][][]
520+
521+
| [number, number, number, number][]
522+
| [number, number, number, number][][]
523+
| [number, number, number, number][][][]
524+
;
520525

521526
export interface IPlugin {
522527
source: string;
@@ -538,7 +543,7 @@ export class Input {
538543

539544
export type input = (value: number[], size: OutputDimensions) => Input;
540545

541-
export function alias(name: string, source: KernelFunction):KernelFunction;
546+
export function alias(name: string, source: KernelFunction): KernelFunction;
542547

543548
export class KernelValue {
544549
constructor(value: KernelValue, settings: IKernelValueSettings);

0 commit comments

Comments
 (0)