Skip to content

Commit d5212d3

Browse files
fix: Making typescript play more nice
1 parent 4396151 commit d5212d3

File tree

4 files changed

+69
-60
lines changed

4 files changed

+69
-60
lines changed

examples/advanced-typescript.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,14 @@
1010
* - kernel output
1111
*/
1212

13-
import { GPU, Texture, IKernelFunctionThis, IConstantsThis } from '../src';
13+
import {
14+
GPU,
15+
Texture,
16+
IKernelFunctionThis,
17+
IConstantsThis,
18+
KernelOutput,
19+
ISubKernelsResults
20+
} from '../src';
1421

1522
const gpu = new GPU();
1623

@@ -31,7 +38,11 @@ function subKernel(value: number): [number, number] {
3138
return [-value, value];
3239
}
3340

34-
const kernelMap = gpu.createKernelMap<typeof kernelFunction>({
41+
interface IKernelMapResult extends ISubKernelsResults {
42+
test: KernelOutput;
43+
}
44+
45+
const kernelMap = gpu.createKernelMap<IKernelMapResult, typeof kernelFunction>({
3546
test: subKernel,
3647
}, kernelFunction)
3748
.setConstants<IConstants>({
@@ -52,4 +63,4 @@ console.log(resultTexture.toArray() as [number, number][]);
5263
testTexture.delete();
5364
resultTexture.delete();
5465

55-
kernelMap.destroy();
66+
kernelMap.destroy();

examples/simple-typescript.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { GPU, KernelFunction, IKernelRunShortcut } from "../src";
1+
import { GPU, KernelFunction, IKernelRunShortcut } from '../src';
22

33
const gpu = new GPU({ mode: 'gpu' });
44

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/index.d.ts

Lines changed: 53 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export class GPU<ArgTypes extends ThreadKernelVariable[] = ThreadKernelVariable[]> {
1+
export class GPU {
22
static isGPUSupported: boolean;
33
static isCanvasSupported: boolean;
44
static isHeadlessGLSupported: boolean;
@@ -9,11 +9,11 @@ export class GPU<ArgTypes extends ThreadKernelVariable[] = ThreadKernelVariable[
99
static isGPUHTMLImageArraySupported: boolean;
1010
static isSinglePrecisionSupported: boolean;
1111
constructor(settings?: IGPUSettings);
12-
functions: GPUFunction<ArgTypes>[];
12+
functions: GPUFunction<ThreadKernelVariable[]>[];
1313
nativeFunctions: IGPUNativeFunction[];
1414
setFunctions(flag: any): this;
1515
setNativeFunctions(flag: IGPUNativeFunction[]): this;
16-
addFunction(kernel: GPUFunction<ArgTypes>, settings?: IGPUFunctionSettings): this;
16+
addFunction(kernel: GPUFunction, settings?: IGPUFunctionSettings): this;
1717
addNativeFunction(name: string, source: string, settings?: IGPUFunctionSettings): this;
1818
combineKernels(...kernels: KernelFunction[]): IKernelRunShortcut;
1919
combineKernels<KF extends KernelFunction>(...kernels: KF[]):
@@ -23,57 +23,45 @@ export class GPU<ArgTypes extends ThreadKernelVariable[] = ThreadKernelVariable[
2323
| ReturnType<KF>[][][]
2424
| Texture
2525
| void
26-
)
26+
)
2727
& IKernelRunShortcutBase;
28-
createKernel<MethodArgTypes extends ArgTypes>(kernel: KernelFunction<MethodArgTypes>, settings?: IGPUKernelSettings): IKernelRunShortcut;
29-
createKernel<KF extends KernelFunction>(kernel: KF, settings?: IGPUKernelSettings):
30-
((...args: Parameters<KF>) =>
31-
ReturnType<KF>[]
32-
| ReturnType<KF>[][]
33-
| ReturnType<KF>[][][]
28+
createKernel<ArgTypes extends ThreadKernelVariable[], ConstantsT extends IConstantsThis>(kernel: KernelFunction<ArgTypes, ConstantsT>, settings?: IGPUKernelSettings): IKernelRunShortcut;
29+
createKernel<KernelType extends KernelFunction>(kernel: KernelType, settings?: IGPUKernelSettings):
30+
((...args: Parameters<KernelType>) =>
31+
ReturnType<KernelType>[]
32+
| ReturnType<KernelType>[][]
33+
| ReturnType<KernelType>[][][]
3434
| Texture
3535
| void
36-
)
37-
& IKernelRunShortcutBase;
38-
createKernelMap(
39-
subKernels: {
40-
[targetLocation: string]: KernelFunction
41-
}
42-
| KernelFunction[],
43-
rootKernel: KernelFunction,
44-
settings?: IGPUKernelSettings): ((() => IMappedKernelResult) & IKernelRunShortcut);
45-
// this needs further refined
46-
createKernelMap<KF extends KernelFunction>(
47-
subKernels: {
48-
[targetLocation: string]: KF
49-
}
50-
| KF[],
51-
rootKernel: KF,
52-
settings?: IGPUKernelSettings
53-
):
54-
((...args: Parameters<KF>) => {
55-
result?:
56-
ReturnType<KF>[]
57-
| ReturnType<KF>[][]
58-
| ReturnType<KF>[][][]
59-
| Texture
60-
| void;
61-
[targetLocation: string]:
62-
ReturnType<KF>[]
63-
| ReturnType<KF>[][]
64-
| ReturnType<KF>[][][]
65-
| Texture
66-
| void
67-
}
68-
)
36+
)
6937
& IKernelRunShortcutBase;
38+
createKernelMap<
39+
ResultType,
40+
KernelFunctionType,
41+
ConstantsType = {}
42+
>(
43+
subKernels: ISubKernelObject | ISubKernelArray,
44+
rootKernel: ThreadFunction,
45+
settings?: IGPUKernelSettings): ((() => IMappedKernelResult) & IKernelMapRunShortcut<ResultType>);
7046
destroy(): Promise<void>;
7147
Kernel: typeof Kernel;
7248
mode: string;
7349
canvas: any;
7450
context: any;
7551
}
7652

53+
export interface ISubKernelObject {
54+
[targetLocation: string]: KernelFunction
55+
}
56+
57+
export interface ISubKernelArray {
58+
[index: number]: KernelFunction
59+
}
60+
61+
export interface ISubKernelsResults {
62+
[resultsLocation: string]: KernelOutput
63+
}
64+
7765
export interface IGPUFunction extends IFunctionSettings {
7866
source: string;
7967
}
@@ -214,7 +202,7 @@ export class Kernel {
214202
setImmutable(flag: boolean): this;
215203
setCanvas(flag: any): this;
216204
setContext(flag: any): this;
217-
addFunction<MethodArgTypes extends ThreadKernelVariable[]>(flag: GPUFunction<MethodArgTypes>, settings?: IFunctionSettings): this;
205+
addFunction<ArgTypes extends ThreadKernelVariable[]>(flag: GPUFunction<ArgTypes>, settings?: IFunctionSettings): this;
218206
setFunctions(flag: any): this;
219207
setNativeFunctions(flag: IGPUNativeFunction[]): this;
220208
setStrictIntegers(flag: boolean): this;
@@ -244,14 +232,14 @@ export class Kernel {
244232
}
245233

246234

247-
export type GPUFunction<ArgTypes extends ThreadKernelVariable[]>
248-
= ThreadFunction<ArgTypes>
235+
export type GPUFunction<ArgTypes extends ThreadKernelVariable[] = ThreadKernelVariable[], ConstantsType extends IConstantsThis = {}>
236+
= ThreadFunction<ArgTypes, ConstantsType>
249237
| IFunction
250238
| IGPUFunction
251239
| string[];
252240

253-
export type ThreadFunction<ArgTypes extends ThreadKernelVariable[] = ThreadKernelVariable[]> =
254-
((...args: ArgTypes) => ThreadFunctionResult);
241+
export type ThreadFunction<ArgTypes extends ThreadKernelVariable[] = ThreadKernelVariable[], ConstantsType extends IConstantsThis = {}> =
242+
((this: IKernelFunctionThis<ConstantsType>, ...args: ArgTypes) => ThreadFunctionResult);
255243

256244
export type Precision = 'single' | 'unsigned';
257245

@@ -315,8 +303,8 @@ export interface IConstantsThis {
315303

316304
export interface IKernelXYZ {
317305
x: number;
318-
y?: number;
319-
z?: number;
306+
y: number;
307+
z: number;
320308
}
321309

322310
export interface FunctionList {
@@ -370,6 +358,14 @@ export interface IKernelRunShortcut extends IKernelRunShortcutBase {
370358
exec(): Promise<KernelOutput>;
371359
}
372360

361+
export interface IKernelMapRunShortcut<SubKernelResultTypes> extends IKernelRunShortcutBase {
362+
kernel: Kernel;
363+
(...args: KernelVariable[]): {
364+
result: KernelOutput
365+
} & SubKernelResultTypes;
366+
exec(): Promise<KernelOutput>;
367+
}
368+
373369
export interface IKernelFeatures {
374370
isFloatRead: boolean;
375371
kernelMap: boolean;
@@ -387,10 +383,10 @@ export interface IKernelFeatures {
387383
highFloatPrecision: { rangeMax: number };
388384
}
389385

390-
export interface IKernelFunctionThis {
386+
export interface IKernelFunctionThis<ConstantsT = Object> {
391387
output: IKernelXYZ;
392388
thread: IKernelXYZ;
393-
constants: IConstantsThis;
389+
constants: ConstantsT;
394390
color(r: number): void,
395391
color(r: number, g: number): void,
396392
color(r: number, g: number, b: number): void,
@@ -414,6 +410,8 @@ export type KernelVariable =
414410

415411
export type ThreadFunctionResult
416412
= number
413+
| number[]
414+
| number[][]
417415
| [number, number]
418416
| [number, number, number]
419417
| [number, number, number, number]
@@ -457,8 +455,8 @@ export type Pixel = {
457455
a: number;
458456
};
459457

460-
export type KernelFunction<ArgT extends ThreadKernelVariable[] = ThreadKernelVariable[]> = ((
461-
this: IKernelFunctionThis,
458+
export type KernelFunction<ArgT extends ThreadKernelVariable[] = ThreadKernelVariable[], ConstantsT extends IConstantsThis = {}> = ((
459+
this: IKernelFunctionThis<ConstantsT>,
462460
...args: ArgT
463461
) => KernelOutput);
464462

@@ -608,7 +606,7 @@ export interface IPlugin {
608606
onBeforeRun: (kernel: Kernel) => void;
609607
}
610608

611-
export type OutputDimensions = [number, number, number] | Int32Array;
609+
export type OutputDimensions = [number] | [number, number] | [number, number, number] | Int32Array;
612610
export type TextureDimensions = [number, number];
613611

614612
export class Input {

0 commit comments

Comments
 (0)