typegpu 0.11.9 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (362) hide show
  1. package/builtin.d.ts +51 -53
  2. package/builtin.js +30 -34
  3. package/common/fullScreenTriangle.d.ts +2 -10
  4. package/common/fullScreenTriangle.js +20 -28
  5. package/common/index.d.ts +2 -9
  6. package/common/index.js +3 -12
  7. package/common/writeSoA.d.ts +11 -12
  8. package/common/writeSoA.js +88 -76
  9. package/core/buffer/buffer.d.ts +79 -62
  10. package/core/buffer/buffer.js +279 -205
  11. package/core/buffer/bufferBinding.d.ts +71 -0
  12. package/core/buffer/bufferBinding.js +154 -0
  13. package/core/buffer/bufferUsage.d.ts +14 -45
  14. package/core/buffer/bufferUsage.js +1 -171
  15. package/core/buffer/laidOutBuffer.d.ts +25 -0
  16. package/core/buffer/laidOutBuffer.js +55 -0
  17. package/core/commandEncoder/attachments.d.ts +125 -0
  18. package/core/commandEncoder/attachments.js +29 -0
  19. package/core/commandEncoder/commandEncoder.d.ts +53 -0
  20. package/core/commandEncoder/commandEncoder.js +56 -0
  21. package/core/commandEncoder/computePass.d.ts +58 -0
  22. package/core/commandEncoder/computePass.js +63 -0
  23. package/core/commandEncoder/renderPass.d.ts +121 -0
  24. package/core/commandEncoder/renderPass.js +196 -0
  25. package/core/constant/tgpuConstant.d.ts +26 -26
  26. package/core/constant/tgpuConstant.js +76 -65
  27. package/core/declare/tgpuDeclare.d.ts +3 -6
  28. package/core/declare/tgpuDeclare.js +36 -36
  29. package/core/function/autoIO.d.ts +61 -33
  30. package/core/function/autoIO.js +68 -73
  31. package/core/function/comptime.d.ts +11 -13
  32. package/core/function/comptime.js +60 -52
  33. package/core/function/createCallableSchema.d.ts +16 -0
  34. package/core/function/createCallableSchema.js +50 -40
  35. package/core/function/dualImpl.d.ts +44 -0
  36. package/core/function/dualImpl.js +71 -50
  37. package/core/function/entryInputRouter.d.ts +26 -0
  38. package/core/function/entryInputRouter.js +31 -33
  39. package/core/function/extractArgs.d.ts +38 -0
  40. package/core/function/extractArgs.js +202 -200
  41. package/core/function/fnCore.d.ts +44 -5
  42. package/core/function/fnCore.js +148 -93
  43. package/core/function/fnTypes.d.ts +31 -29
  44. package/core/function/fnTypes.js +1 -0
  45. package/core/function/ioSchema.d.ts +12 -10
  46. package/core/function/ioSchema.js +65 -47
  47. package/core/function/shelllessImpl.d.ts +9 -12
  48. package/core/function/shelllessImpl.js +17 -22
  49. package/core/function/templateUtils.d.ts +2 -0
  50. package/core/function/templateUtils.js +9 -8
  51. package/core/function/tgpuComputeFn.d.ts +26 -28
  52. package/core/function/tgpuComputeFn.js +47 -48
  53. package/core/function/tgpuFn.d.ts +34 -37
  54. package/core/function/tgpuFn.js +179 -153
  55. package/core/function/tgpuFragmentFn.d.ts +52 -53
  56. package/core/function/tgpuFragmentFn.js +63 -56
  57. package/core/function/tgpuVertexFn.d.ts +36 -39
  58. package/core/function/tgpuVertexFn.js +56 -53
  59. package/core/pipeline/computePipeline.d.ts +141 -53
  60. package/core/pipeline/computePipeline.js +291 -225
  61. package/core/pipeline/connectAttachmentToShader.d.ts +4 -0
  62. package/core/pipeline/connectAttachmentToShader.js +25 -22
  63. package/core/pipeline/connectTargetsToShader.d.ts +3 -0
  64. package/core/pipeline/connectTargetsToShader.js +29 -27
  65. package/core/pipeline/drawState.d.ts +52 -0
  66. package/core/pipeline/drawState.js +225 -0
  67. package/core/pipeline/limitsOverflow.d.ts +2 -0
  68. package/core/pipeline/limitsOverflow.js +13 -10
  69. package/core/pipeline/performanceTracker.d.ts +14 -0
  70. package/core/pipeline/performanceTracker.js +34 -0
  71. package/core/pipeline/pipelineUtils.d.ts +18 -0
  72. package/core/pipeline/pipelineUtils.js +54 -25
  73. package/core/pipeline/priors.d.ts +1 -0
  74. package/core/pipeline/priors.js +12 -0
  75. package/core/pipeline/renderPipeline.d.ts +246 -261
  76. package/core/pipeline/renderPipeline.js +487 -480
  77. package/core/pipeline/timeable.d.ts +28 -18
  78. package/core/pipeline/timeable.js +90 -52
  79. package/core/pipeline/typeGuards.d.ts +17 -0
  80. package/core/pipeline/typeGuards.js +52 -22
  81. package/core/querySet/querySet.d.ts +26 -21
  82. package/core/querySet/querySet.js +127 -103
  83. package/core/rawCodeSnippet/tgpuRawCodeSnippet.d.ts +13 -18
  84. package/core/rawCodeSnippet/tgpuRawCodeSnippet.js +89 -90
  85. package/core/resolve/externals.d.ts +25 -8
  86. package/core/resolve/externals.js +78 -54
  87. package/core/resolve/namespace.d.ts +22 -25
  88. package/core/resolve/namespace.js +16 -21
  89. package/core/resolve/resolvableString.d.ts +7 -0
  90. package/core/resolve/resolvableString.js +13 -0
  91. package/core/resolve/resolveData.d.ts +10 -0
  92. package/core/resolve/resolveData.js +162 -121
  93. package/core/resolve/stitch.d.ts +8 -0
  94. package/core/resolve/stitch.js +23 -21
  95. package/core/resolve/tgpuResolve.d.ts +55 -53
  96. package/core/resolve/tgpuResolve.js +106 -53
  97. package/core/root/configurableImpl.d.ts +10 -0
  98. package/core/root/configurableImpl.js +17 -19
  99. package/core/root/init.d.ts +76 -38
  100. package/core/root/init.js +346 -455
  101. package/core/root/rootTypes.d.ts +461 -636
  102. package/core/root/rootTypes.js +1 -0
  103. package/core/sampler/sampler.d.ts +50 -31
  104. package/core/sampler/sampler.js +120 -113
  105. package/core/simulate/tgpuSimulate.d.ts +9 -12
  106. package/core/simulate/tgpuSimulate.js +68 -71
  107. package/core/slot/accessor.d.ts +36 -13
  108. package/core/slot/accessor.js +138 -91
  109. package/core/slot/internalSlots.d.ts +2 -0
  110. package/core/slot/internalSlots.js +1 -6
  111. package/core/slot/lazy.d.ts +2 -6
  112. package/core/slot/lazy.js +71 -39
  113. package/core/slot/slot.d.ts +2 -6
  114. package/core/slot/slot.js +45 -38
  115. package/core/slot/slotTypes.d.ts +78 -80
  116. package/core/slot/slotTypes.js +11 -16
  117. package/core/texture/externalTexture.d.ts +20 -11
  118. package/core/texture/externalTexture.js +46 -46
  119. package/core/texture/texture.d.ts +152 -97
  120. package/core/texture/texture.js +407 -314
  121. package/core/texture/textureFormats.d.ts +42 -23
  122. package/core/texture/textureFormats.js +104 -75
  123. package/core/texture/textureProps.d.ts +7 -10
  124. package/core/texture/textureProps.js +1 -0
  125. package/core/texture/textureUtils.d.ts +8 -0
  126. package/core/texture/textureUtils.js +185 -179
  127. package/core/texture/usageExtension.d.ts +21 -18
  128. package/core/texture/usageExtension.js +13 -17
  129. package/core/unroll/tgpuUnroll.d.ts +20 -19
  130. package/core/unroll/tgpuUnroll.js +82 -91
  131. package/core/valueProxyUtils.d.ts +3 -0
  132. package/core/valueProxyUtils.js +52 -41
  133. package/core/variable/tgpuVariable.d.ts +26 -27
  134. package/core/variable/tgpuVariable.js +93 -96
  135. package/core/vertexLayout/connectAttributesToShader.d.ts +9 -0
  136. package/core/vertexLayout/connectAttributesToShader.js +61 -56
  137. package/core/vertexLayout/vertexAttribute.d.ts +21 -17
  138. package/core/vertexLayout/vertexAttribute.js +1 -0
  139. package/core/vertexLayout/vertexLayout.d.ts +24 -18
  140. package/core/vertexLayout/vertexLayout.js +130 -99
  141. package/core/whitespaces.d.ts +2 -0
  142. package/core/whitespaces.js +16 -0
  143. package/data/alignIO.d.ts +7 -0
  144. package/data/alignIO.js +13 -13
  145. package/data/alignmentOf.d.ts +5 -8
  146. package/data/alignmentOf.js +90 -75
  147. package/data/array.d.ts +6 -9
  148. package/data/array.js +48 -40
  149. package/data/atomic.d.ts +2 -7
  150. package/data/atomic.js +26 -23
  151. package/data/attributes.d.ts +19 -21
  152. package/data/attributes.js +192 -132
  153. package/data/autoStruct.d.ts +36 -3
  154. package/data/autoStruct.js +84 -81
  155. package/data/compiledIO.d.ts +5 -0
  156. package/data/compiledIO.js +231 -215
  157. package/data/dataIO.d.ts +13 -11
  158. package/data/dataIO.js +643 -589
  159. package/data/dataTypes.d.ts +83 -65
  160. package/data/dataTypes.js +66 -68
  161. package/data/deepEqual.d.ts +2 -7
  162. package/data/deepEqual.js +80 -55
  163. package/data/disarray.d.ts +6 -10
  164. package/data/disarray.js +52 -46
  165. package/data/float16Conversion.d.ts +4 -0
  166. package/data/float16Conversion.js +7 -0
  167. package/data/getLongestContiguousPrefix.d.ts +4 -8
  168. package/data/getLongestContiguousPrefix.js +6 -11
  169. package/data/index.d.ts +30 -31
  170. package/data/index.js +39 -172
  171. package/data/instanceToSchema.d.ts +24 -27
  172. package/data/instanceToSchema.js +1 -0
  173. package/data/isContiguous.d.ts +4 -8
  174. package/data/isContiguous.js +6 -11
  175. package/data/matrix.d.ts +21 -21
  176. package/data/matrix.js +513 -505
  177. package/data/numberOps.d.ts +6 -0
  178. package/data/numberOps.js +26 -20
  179. package/data/numeric.d.ts +21 -12
  180. package/data/numeric.js +287 -197
  181. package/data/offsetUtils.d.ts +9 -13
  182. package/data/offsetUtils.js +204 -144
  183. package/data/offsets.d.ts +8 -0
  184. package/data/offsets.js +33 -33
  185. package/data/partialIO.d.ts +13 -8
  186. package/data/partialIO.js +124 -113
  187. package/data/ptr.d.ts +12 -12
  188. package/data/ptr.js +42 -44
  189. package/data/ref.d.ts +40 -27
  190. package/data/ref.js +125 -95
  191. package/data/sampler.d.ts +99 -101
  192. package/data/sampler.js +17 -21
  193. package/data/schemaCallWrapper.d.ts +19 -0
  194. package/data/schemaCallWrapper.js +31 -26
  195. package/data/schemaMemoryLayout.d.ts +8 -0
  196. package/data/schemaMemoryLayout.js +213 -185
  197. package/data/sizeOf.d.ts +4 -8
  198. package/data/sizeOf.js +6 -11
  199. package/data/snippet.d.ts +96 -20
  200. package/data/snippet.js +75 -86
  201. package/data/struct.d.ts +4 -7
  202. package/data/struct.js +51 -39
  203. package/data/texture.d.ts +253 -250
  204. package/data/texture.js +238 -200
  205. package/data/unstruct.d.ts +2 -7
  206. package/data/unstruct.js +43 -37
  207. package/data/vector.d.ts +33 -21
  208. package/data/vector.js +234 -221
  209. package/data/vectorImpl.d.ts +231 -0
  210. package/data/vectorImpl.js +563 -515
  211. package/data/vectorOps.d.ts +63 -0
  212. package/data/vectorOps.js +642 -630
  213. package/data/vertexFormatData.d.ts +181 -184
  214. package/data/vertexFormatData.js +104 -106
  215. package/data/wgslTypes.d.ts +665 -600
  216. package/data/wgslTypes.js +220 -198
  217. package/errors.d.ts +50 -24
  218. package/errors.js +146 -126
  219. package/execMode.d.ts +16 -0
  220. package/execMode.js +47 -40
  221. package/extension.d.ts +13 -8
  222. package/extension.js +10 -16
  223. package/getGPUValue.d.ts +1 -0
  224. package/getGPUValue.js +2 -7
  225. package/index.d.ts +28 -68
  226. package/index.js +8 -28
  227. package/indexNamedExports.d.ts +69 -42
  228. package/indexNamedExports.js +25 -0
  229. package/internal.d.ts +16 -0
  230. package/internal.js +12 -0
  231. package/mathUtils.d.ts +5 -0
  232. package/mathUtils.js +7 -11
  233. package/memo.d.ts +11 -0
  234. package/memo.js +20 -22
  235. package/minify.d.ts +5 -0
  236. package/minify.js +93 -0
  237. package/nameUtils.d.ts +29 -0
  238. package/nameUtils.js +427 -394
  239. package/package.json +5 -1
  240. package/resolutionCtx.d.ts +162 -22
  241. package/resolutionCtx.js +911 -629
  242. package/serial/registry.d.ts +15 -0
  243. package/serial/registry.js +106 -0
  244. package/serial/restore.d.ts +49 -0
  245. package/serial/restore.js +68 -0
  246. package/serial/schema.d.ts +58 -0
  247. package/serial/schema.js +209 -0
  248. package/serial/types.d.ts +5 -0
  249. package/serial/types.js +1 -0
  250. package/shared/env.d.ts +9 -0
  251. package/shared/env.js +9 -12
  252. package/shared/generators.d.ts +4 -0
  253. package/shared/generators.js +10 -12
  254. package/shared/meta.d.ts +29 -14
  255. package/shared/meta.js +71 -55
  256. package/shared/normalizeMetadata.d.ts +32 -27
  257. package/shared/normalizeMetadata.js +23 -36
  258. package/shared/repr.d.ts +73 -55
  259. package/shared/repr.js +1 -0
  260. package/shared/soul.d.ts +17 -0
  261. package/shared/soul.js +1 -0
  262. package/shared/stringify.d.ts +2 -0
  263. package/shared/stringify.js +29 -20
  264. package/shared/symbols.d.ts +26 -20
  265. package/shared/symbols.js +79 -79
  266. package/shared/tseynit.d.ts +2 -0
  267. package/shared/tseynit.js +160 -75
  268. package/shared/utilityTypes.d.ts +30 -14
  269. package/shared/utilityTypes.js +2 -6
  270. package/shared/vertexFormat.d.ts +41 -43
  271. package/shared/vertexFormat.js +59 -62
  272. package/std/array.d.ts +2 -7
  273. package/std/array.js +18 -23
  274. package/std/atomic.d.ts +14 -18
  275. package/std/atomic.js +96 -95
  276. package/std/bitcast.d.ts +193 -10
  277. package/std/bitcast.js +309 -39
  278. package/std/boolean.d.ts +19 -33
  279. package/std/boolean.js +296 -288
  280. package/std/copy.d.ts +2 -7
  281. package/std/copy.js +27 -24
  282. package/std/derivative.d.ts +11 -15
  283. package/std/derivative.js +56 -79
  284. package/std/discard.d.ts +1 -6
  285. package/std/discard.js +7 -14
  286. package/std/environment.d.ts +19 -14
  287. package/std/environment.js +71 -51
  288. package/std/extensions.d.ts +2 -8
  289. package/std/extensions.js +10 -11
  290. package/std/index.d.ts +20 -24
  291. package/std/index.js +32 -187
  292. package/std/matrix.d.ts +6 -12
  293. package/std/matrix.js +60 -69
  294. package/std/numeric.d.ts +143 -146
  295. package/std/numeric.js +858 -749
  296. package/std/operators.d.ts +19 -27
  297. package/std/operators.js +227 -193
  298. package/std/packing.d.ts +5 -11
  299. package/std/packing.js +67 -75
  300. package/std/range.d.ts +6 -11
  301. package/std/range.js +48 -36
  302. package/std/subgroup.d.ts +33 -37
  303. package/std/subgroup.js +180 -217
  304. package/std/texture.d.ts +70 -38
  305. package/std/texture.js +176 -172
  306. package/taskQueue.d.ts +6 -0
  307. package/taskQueue.js +30 -0
  308. package/tgpu.d.ts +16 -0
  309. package/tgpu.js +17 -44
  310. package/tgpuBindGroupLayout.d.ts +132 -152
  311. package/tgpuBindGroupLayout.js +346 -268
  312. package/tgpuLogger.d.ts +34 -0
  313. package/tgpuLogger.js +63 -0
  314. package/tgpuUnstable.d.ts +16 -22
  315. package/tgpuUnstable.js +13 -35
  316. package/tgsl/accessIndex.d.ts +2 -0
  317. package/tgsl/accessIndex.js +76 -33
  318. package/tgsl/accessProp.d.ts +2 -0
  319. package/tgsl/accessProp.js +142 -101
  320. package/tgsl/accessStructProp.d.ts +5 -0
  321. package/tgsl/accessStructProp.js +13 -15
  322. package/tgsl/consoleLog/deserializers.d.ts +13 -0
  323. package/tgsl/consoleLog/deserializers.js +119 -103
  324. package/tgsl/consoleLog/logGenerator.d.ts +21 -0
  325. package/tgsl/consoleLog/logGenerator.js +85 -80
  326. package/tgsl/consoleLog/serializers.d.ts +21 -0
  327. package/tgsl/consoleLog/serializers.js +119 -100
  328. package/tgsl/consoleLog/types.d.ts +40 -39
  329. package/tgsl/consoleLog/types.js +1 -0
  330. package/tgsl/conversion.d.ts +33 -0
  331. package/tgsl/conversion.js +271 -216
  332. package/tgsl/forOfUtils.d.ts +15 -0
  333. package/tgsl/forOfUtils.js +85 -70
  334. package/tgsl/generationHelpers.d.ts +22 -39
  335. package/tgsl/generationHelpers.js +85 -58
  336. package/tgsl/infixDispatch.d.ts +70 -0
  337. package/tgsl/infixDispatch.js +48 -46
  338. package/tgsl/jsPolyfills.d.ts +16 -19
  339. package/tgsl/jsPolyfills.js +44 -42
  340. package/tgsl/makeDereferenceable.d.ts +48 -0
  341. package/tgsl/makeDereferenceable.js +86 -0
  342. package/tgsl/makeResolvable.d.ts +22 -0
  343. package/tgsl/makeResolvable.js +33 -0
  344. package/tgsl/shaderGenerator.d.ts +77 -17
  345. package/tgsl/shaderGenerator.js +1 -0
  346. package/tgsl/shellless.d.ts +6 -9
  347. package/tgsl/shellless.js +73 -43
  348. package/tgsl/wgslGenerator.d.ts +66 -59
  349. package/tgsl/wgslGenerator.js +1344 -760
  350. package/types.d.ts +287 -222
  351. package/types.js +61 -44
  352. package/unwrapper.d.ts +31 -26
  353. package/unwrapper.js +1 -0
  354. package/wgslExtensions.d.ts +3 -5
  355. package/wgslExtensions.js +12 -16
  356. package/_virtual/rolldown_runtime.js +0 -13
  357. package/core/buffer/bufferShorthand.d.ts +0 -50
  358. package/core/buffer/bufferShorthand.js +0 -55
  359. package/core/pipeline/applyPipelineState.js +0 -37
  360. package/package.js +0 -5
  361. package/tgsl/shaderGenerator_members.d.ts +0 -33
  362. package/tgsl/shaderGenerator_members.js +0 -12
@@ -1,49 +1,47 @@
1
- import { TgpuNamable } from "../../shared/meta.js";
2
- import { $internal } from "../../shared/symbols.js";
3
- import { AnyComputeBuiltin } from "../../builtin.js";
4
- import { IORecord, InferIO } from "./fnTypes.js";
5
- import { Void } from "../../data/wgslTypes.js";
6
-
7
- //#region src/core/function/tgpuComputeFn.d.ts
8
-
1
+ import type { AnyComputeBuiltin } from '../../builtin.ts';
2
+ import { Void } from '../../data/wgslTypes.ts';
3
+ import { type TgpuNamable } from '../../shared/meta.ts';
4
+ import { $internal } from '../../shared/symbols.ts';
5
+ import type { InferIO, IORecord } from './fnTypes.ts';
9
6
  /**
10
7
  * Describes a compute entry function signature (its arguments, return type and workgroup size)
11
8
  */
12
9
  type TgpuComputeFnShellHeader<ComputeIn extends IORecord<AnyComputeBuiltin>> = {
13
- readonly argTypes: ComputeIn[keyof ComputeIn][];
14
- readonly returnType: Void;
15
- readonly workgroupSize: number[];
16
- readonly entryPoint: 'compute';
10
+ readonly argTypes: ComputeIn[keyof ComputeIn][];
11
+ readonly returnType: Void;
12
+ readonly workgroupSize: number[];
13
+ readonly entryPoint: 'compute';
17
14
  };
18
15
  /**
19
16
  * Describes a compute entry function signature (its arguments, return type and workgroup size).
20
17
  * Allows creating tgpu compute functions by calling this shell
21
18
  * and passing the implementation (as WGSL string or JS function) as the argument.
22
19
  */
23
- type TgpuComputeFnShell<ComputeIn extends IORecord<AnyComputeBuiltin>> = TgpuComputeFnShellHeader<ComputeIn> &
20
+ export type TgpuComputeFnShell<ComputeIn extends IORecord<AnyComputeBuiltin>> = TgpuComputeFnShellHeader<ComputeIn> &
24
21
  /**
25
22
  * Creates a type-safe implementation of this signature
26
23
  */
27
- ((implementation: (input: InferIO<ComputeIn>) => undefined) => TgpuComputeFn<ComputeIn>) &
24
+ ((implementation: (input: InferIO<ComputeIn>) => undefined) => TgpuComputeFn<ComputeIn>) &
28
25
  /**
29
26
  * @param implementation
30
27
  * Raw WGSL function implementation with header and body
31
28
  * without `fn` keyword and function name
32
29
  * e.g. `"(x: f32) -> f32 { return x; }"`;
33
- */
34
- ((implementation: string) => TgpuComputeFn<ComputeIn>) & ((strings: TemplateStringsArray, ...values: unknown[]) => TgpuComputeFn<ComputeIn>);
35
- interface TgpuComputeFn<ComputeIn extends IORecord<AnyComputeBuiltin> = any> extends TgpuNamable {
36
- readonly [$internal]: true;
37
- readonly shell: TgpuComputeFnShellHeader<ComputeIn>;
38
- $uses(dependencyMap: Record<string, unknown>): this;
30
+ */ ((implementation: string) => TgpuComputeFn<ComputeIn>) & ((strings: TemplateStringsArray, ...values: unknown[]) => TgpuComputeFn<ComputeIn>);
31
+ export interface TgpuComputeFn<ComputeIn extends IORecord<AnyComputeBuiltin> = any> extends TgpuNamable {
32
+ readonly [$internal]: true;
33
+ readonly shell: TgpuComputeFnShellHeader<ComputeIn>;
34
+ $uses(dependencyMap: Record<string, unknown>): this;
35
+ }
36
+ export interface ComputeFnOptions {
37
+ workgroupSize: number[];
39
38
  }
40
- declare function computeFn(options: {
41
- workgroupSize: number[];
39
+ export declare function computeFn(options: {
40
+ workgroupSize: number[];
42
41
  }): TgpuComputeFnShell<{}>;
43
- declare function computeFn<ComputeIn extends IORecord<AnyComputeBuiltin>>(options: {
44
- in: ComputeIn;
45
- workgroupSize: number[];
42
+ export declare function computeFn<ComputeIn extends IORecord<AnyComputeBuiltin>>(options: {
43
+ in: ComputeIn;
44
+ workgroupSize: number[];
46
45
  }): TgpuComputeFnShell<ComputeIn>;
47
- declare function isTgpuComputeFn<ComputeIn extends IORecord<AnyComputeBuiltin>>(value: unknown): value is TgpuComputeFn<ComputeIn>;
48
- //#endregion
49
- export { TgpuComputeFn, TgpuComputeFnShell, computeFn, isTgpuComputeFn };
46
+ export declare function isTgpuComputeFn<ComputeIn extends IORecord<AnyComputeBuiltin>>(value: unknown): value is TgpuComputeFn<ComputeIn>;
47
+ export {};
@@ -1,57 +1,56 @@
1
- import { $getNameForward, $internal, $resolve } from "../../shared/symbols.js";
2
1
  import { Void } from "../../data/wgslTypes.js";
3
2
  import { getName, setName } from "../../shared/meta.js";
4
- import { separateBuiltins } from "./ioSchema.js";
3
+ import { $getNameForward, $internal, $resolve } from "../../shared/symbols.js";
4
+ import { shaderStageSlot } from "../slot/internalSlots.js";
5
5
  import { createFnCore } from "./fnCore.js";
6
+ import { separateBuiltins } from "./ioSchema.js";
6
7
  import { stripTemplate } from "./templateUtils.js";
7
- import { shaderStageSlot } from "../slot/internalSlots.js";
8
-
9
- //#region src/core/function/tgpuComputeFn.ts
10
8
  /**
11
- * Creates a shell of a typed entry function for the compute shader stage. Any function
12
- * that implements this shell can perform general-purpose computation.
13
- *
14
- * @param options.in
15
- * Record with builtins used by the compute shader.
16
- * @param options.workgroupSize
17
- * Size of blocks that the thread grid will be divided into (up to 3 dimensions).
18
- */
19
- function computeFn(options) {
20
- const shell = {
21
- argTypes: Object.values(options.in ?? {}),
22
- returnType: Void,
23
- workgroupSize: options.workgroupSize,
24
- entryPoint: "compute"
25
- };
26
- const entryInput = separateBuiltins(options.in ?? {});
27
- const call = (arg, ...values) => createComputeFn(shell, options.workgroupSize, stripTemplate(arg, ...values), entryInput);
28
- return Object.assign(call, shell);
9
+ * Creates a shell of a typed entry function for the compute shader stage. Any function
10
+ * that implements this shell can perform general-purpose computation.
11
+ *
12
+ * @param options.in
13
+ * Record with builtins used by the compute shader.
14
+ * @param options.workgroupSize
15
+ * Size of blocks that the thread grid will be divided into (up to 3 dimensions).
16
+ */
17
+ export function computeFn(options) {
18
+ const shell = {
19
+ argTypes: Object.values(options.in ?? {}),
20
+ returnType: Void,
21
+ workgroupSize: options.workgroupSize,
22
+ entryPoint: 'compute',
23
+ };
24
+ const entryInput = separateBuiltins(options.in ?? {});
25
+ const call = (arg, ...values) => createComputeFn(shell, options.workgroupSize, stripTemplate(arg, ...values), entryInput);
26
+ return Object.assign(call, shell);
29
27
  }
30
- function isTgpuComputeFn(value) {
31
- return value?.shell?.entryPoint === "compute";
28
+ export function isTgpuComputeFn(value) {
29
+ return value?.shell?.entryPoint === 'compute';
32
30
  }
31
+ // --------------
32
+ // Implementation
33
+ // --------------
33
34
  function createComputeFn(shell, workgroupSize, implementation, entryInput) {
34
- const core = createFnCore(implementation, "compute", workgroupSize);
35
- return {
36
- shell,
37
- $uses(newExternals) {
38
- core.setExternals("userProvided", newExternals);
39
- return this;
40
- },
41
- [$internal]: true,
42
- [$getNameForward]: core,
43
- $name(newLabel) {
44
- setName(this, newLabel);
45
- return this;
46
- },
47
- [$resolve](ctx) {
48
- return ctx.withSlots([[shaderStageSlot, "compute"]], () => core.resolve(ctx, [], shell.returnType, entryInput));
49
- },
50
- toString() {
51
- return `computeFn:${getName(core) ?? "<unnamed>"}`;
52
- }
53
- };
35
+ const core = createFnCore(implementation, 'compute', workgroupSize);
36
+ const result = {
37
+ shell,
38
+ $uses(newExternals) {
39
+ core.setExternals('userProvided', newExternals);
40
+ return this;
41
+ },
42
+ [$internal]: true,
43
+ [$getNameForward]: core,
44
+ $name(newLabel) {
45
+ setName(this, newLabel);
46
+ return this;
47
+ },
48
+ [$resolve](ctx) {
49
+ return ctx.withSlots([[shaderStageSlot, 'compute']], () => core.resolve(ctx, [], shell.returnType, entryInput));
50
+ },
51
+ toString() {
52
+ return `computeFn:${getName(core) ?? '<unnamed>'}`;
53
+ },
54
+ };
55
+ return result;
54
56
  }
55
-
56
- //#endregion
57
- export { computeFn, isTgpuComputeFn };
@@ -1,53 +1,50 @@
1
- import { TgpuNamable } from "../../shared/meta.js";
2
- import { $internal, $providing } from "../../shared/symbols.js";
3
- import { Prettify } from "../../shared/utilityTypes.js";
4
- import { AnyFn, Implementation, InferArgs, InferImplSchema, InheritArgNames } from "./fnTypes.js";
5
- import { Providing } from "../slot/slotTypes.js";
6
- import { Withable } from "../root/rootTypes.js";
7
- import { DualFn } from "../../types.js";
8
- import { BaseData, Void } from "../../data/wgslTypes.js";
9
- import { InferGPU } from "../../shared/repr.js";
10
-
11
- //#region src/core/function/tgpuFn.d.ts
12
-
1
+ import { type BaseData, Void } from '../../data/wgslTypes.ts';
2
+ import type { TgpuNamable } from '../../shared/meta.ts';
3
+ import type { InferGPU } from '../../shared/repr.ts';
4
+ import { $internal, $providing } from '../../shared/symbols.ts';
5
+ import type { Prettify } from '../../shared/utilityTypes.ts';
6
+ import type { DualFn } from '../../types.ts';
7
+ import { type Providing } from '../slot/slotTypes.ts';
8
+ import type { AnyFn, Implementation, InferArgs, InferImplSchema, InheritArgNames } from './fnTypes.ts';
9
+ import type { Withable } from '../root/rootTypes.ts';
13
10
  /**
14
11
  * Describes a function signature (its arguments and return type)
15
12
  */
16
13
  type TgpuFnShellHeader<Args extends BaseData[], Return extends BaseData> = {
17
- readonly [$internal]: true;
18
- readonly argTypes: Args;
19
- readonly returnType: Return;
14
+ readonly [$internal]: true;
15
+ readonly argTypes: Args;
16
+ readonly returnType: Return;
20
17
  };
21
18
  /**
22
19
  * Describes a function signature (its arguments and return type).
23
20
  * Allows creating tgpu functions by calling this shell
24
21
  * and passing the implementation (as WGSL string or JS function) as the argument.
25
22
  */
26
- type TgpuFnShell<Args extends BaseData[], Return extends BaseData> = TgpuFnShellHeader<Args, Return> & (<T extends (...args: InferArgs<Args>) => InferGPU<Return>>(implementation: T) => TgpuFn<Prettify<InheritArgNames<(...args: Args) => Return, T>>['result']>) & ((implementation: string) => TgpuFn<(...args: Args) => Return>) & ((strings: TemplateStringsArray, ...values: unknown[]) => TgpuFn<(...args: Args) => Return>);
23
+ export type TgpuFnShell<Args extends BaseData[], Return extends BaseData> = TgpuFnShellHeader<Args, Return> & (<T extends (...args: InferArgs<Args>) => InferGPU<Return>>(implementation: T) => TgpuFn<Prettify<InheritArgNames<(...args: Args) => Return, T>>['result']>) & ((implementation: string) => TgpuFn<(...args: Args) => Return>) & ((strings: TemplateStringsArray, ...values: unknown[]) => TgpuFn<(...args: Args) => Return>);
27
24
  interface TgpuFnBase<ImplSchema extends AnyFn> extends TgpuNamable, Withable<TgpuFn<ImplSchema>> {
28
- [$internal]: {
29
- implementation: Implementation<ImplSchema>;
30
- };
31
- readonly resourceType: 'function';
32
- readonly shell: TgpuFnShellHeader<Parameters<ImplSchema>, Extract<ReturnType<ImplSchema>, BaseData>>;
33
- readonly [$providing]?: Providing | undefined;
34
- $uses(dependencyMap: Record<string, unknown>): this;
25
+ [$internal]: {
26
+ implementation: Implementation<ImplSchema>;
27
+ };
28
+ readonly resourceType: 'function';
29
+ readonly shell: TgpuFnShellHeader<Parameters<ImplSchema>, Extract<ReturnType<ImplSchema>, BaseData>>;
30
+ readonly [$providing]?: Providing | undefined;
31
+ $uses(dependencyMap: Record<string, unknown>): this;
35
32
  }
36
- type TgpuFn<ImplSchema extends AnyFn = (...args: any[]) => any> = DualFn<InferImplSchema<ImplSchema>> & TgpuFnBase<ImplSchema>;
33
+ export type TgpuFn<ImplSchema extends AnyFn = (...args: any[]) => any> = DualFn<InferImplSchema<ImplSchema>> & TgpuFnBase<ImplSchema>;
37
34
  /**
38
35
  * A function wrapper that allows providing slot and accessor overrides for shellless functions
39
36
  */
40
- interface TgpuGenericFn<T extends AnyFn> extends TgpuNamable, Withable<TgpuGenericFn<T>> {
41
- readonly [$internal]: {
42
- inner: T;
43
- };
44
- readonly [$providing]?: Providing | undefined;
45
- readonly resourceType: 'generic-function';
46
- (...args: Parameters<T>): ReturnType<T>;
37
+ export interface TgpuGenericFn<T extends AnyFn> extends TgpuNamable, Withable<TgpuGenericFn<T>> {
38
+ readonly [$internal]: {
39
+ inner: T;
40
+ };
41
+ readonly [$providing]?: Providing | undefined;
42
+ readonly resourceType: 'generic-function';
43
+ (...args: Parameters<T>): ReturnType<T>;
47
44
  }
48
- declare function fn<Args extends BaseData[] | []>(argTypes: Args, returnType?: undefined): TgpuFnShell<Args, Void>;
49
- declare function fn<Args extends BaseData[] | [], Return extends BaseData>(argTypes: Args, returnType: Return): TgpuFnShell<Args, Return>;
50
- declare function fn<T extends AnyFn>(inner: T): TgpuGenericFn<T>;
51
- declare function isTgpuFn<Args extends BaseData[] | [], Return extends BaseData>(value: unknown): value is TgpuFn<(...args: Args) => Return>;
52
- //#endregion
53
- export { TgpuFn, TgpuFnShell, TgpuGenericFn, fn, isTgpuFn };
45
+ export declare function fn<Args extends BaseData[] | []>(argTypes: Args, returnType?: undefined): TgpuFnShell<Args, Void>;
46
+ export declare function fn<Args extends BaseData[] | [], Return extends BaseData>(argTypes: Args, returnType: Return): TgpuFnShell<Args, Return>;
47
+ export declare function fn<T extends AnyFn>(inner: T): TgpuGenericFn<T>;
48
+ export declare function isTgpuFn<Args extends BaseData[] | [], Return extends BaseData>(value: unknown): value is TgpuFn<(...args: Args) => Return>;
49
+ export declare function isGenericFn<Callback extends AnyFn>(value: unknown): value is TgpuGenericFn<Callback>;
50
+ export {};
@@ -1,171 +1,197 @@
1
- import { $getNameForward, $internal, $providing, $resolve, isMarkedInternal } from "../../shared/symbols.js";
1
+ import { schemaCallWrapper } from "../../data/schemaCallWrapper.js";
2
2
  import { Void } from "../../data/wgslTypes.js";
3
- import { getName, setName } from "../../shared/meta.js";
4
3
  import { ExecutionError } from "../../errors.js";
5
- import { isAccessor, isMutableAccessor } from "../slot/slotTypes.js";
6
4
  import { provideInsideTgpuFn } from "../../execMode.js";
5
+ import { getName, setName } from "../../shared/meta.js";
6
+ import { isMarkedInternal } from "../../shared/symbols.js";
7
+ import { $getNameForward, $internal, $providing, $resolve } from "../../shared/symbols.js";
8
+ import { addArgTypesToExternals, addReturnTypeToExternals } from "../resolve/externals.js";
7
9
  import { stitch } from "../resolve/stitch.js";
8
- import { schemaCallWrapper } from "../../data/schemaCallWrapper.js";
10
+ import { isAccessor, isMutableAccessor, } from "../slot/slotTypes.js";
9
11
  import { dualImpl } from "./dualImpl.js";
10
- import { comptime } from "./comptime.js";
11
- import { addArgTypesToExternals, addReturnTypeToExternals } from "../resolve/externals.js";
12
12
  import { createFnCore } from "./fnCore.js";
13
13
  import { stripTemplate } from "./templateUtils.js";
14
-
15
- //#region src/core/function/tgpuFn.ts
16
- function fn(argTypesOrCallback, returnType) {
17
- if (typeof argTypesOrCallback === "function") return createGenericFn(argTypesOrCallback, []);
18
- const argTypes = argTypesOrCallback;
19
- const shell = {
20
- [$internal]: true,
21
- argTypes,
22
- returnType: returnType ?? Void
23
- };
24
- const call = (arg, ...values) => createFn(shell, stripTemplate(arg, ...values));
25
- return Object.assign(call, shell);
14
+ import { comptime } from "./comptime.js";
15
+ export function fn(argTypesOrCallback, returnType) {
16
+ if (typeof argTypesOrCallback === 'function') {
17
+ return createGenericFn(argTypesOrCallback, []);
18
+ }
19
+ const argTypes = argTypesOrCallback;
20
+ const shell = {
21
+ [$internal]: true,
22
+ argTypes,
23
+ returnType: returnType ?? Void,
24
+ };
25
+ const call = (arg, ...values) => createFn(shell, stripTemplate(arg, ...values));
26
+ return Object.assign(call, shell);
26
27
  }
27
- function isTgpuFn(value) {
28
- return isMarkedInternal(value) && value?.resourceType === "function";
28
+ export function isTgpuFn(value) {
29
+ return (isMarkedInternal(value) &&
30
+ value?.resourceType === 'function');
29
31
  }
30
- function isGenericFn(value) {
31
- return isMarkedInternal(value) && value?.resourceType === "generic-function";
32
+ export function isGenericFn(value) {
33
+ return (isMarkedInternal(value) &&
34
+ value?.resourceType === 'generic-function');
32
35
  }
36
+ // --------------
37
+ // Implementation
38
+ // --------------
33
39
  function stringifyPair([slot, value]) {
34
- return `${getName(slot) ?? "<unnamed>"}=${value}`;
40
+ return `${getName(slot) ?? '<unnamed>'}=${value}`;
35
41
  }
36
42
  function createFn(shell, _implementation) {
37
- let pairs = [];
38
- let implementation;
39
- if (isGenericFn(_implementation)) {
40
- pairs = _implementation[$providing]?.pairs ?? [];
41
- implementation = _implementation[$internal].inner;
42
- } else implementation = _implementation;
43
- const core = createFnCore(implementation, "normal");
44
- const fnBase = {
45
- shell,
46
- resourceType: "function",
47
- [$internal]: { implementation },
48
- $uses(newExternals) {
49
- core.setExternals("userProvided", newExternals);
50
- return this;
51
- },
52
- [$getNameForward]: core,
53
- $name(label) {
54
- setName(this, label);
55
- return this;
56
- },
57
- with: comptime((slot, value) => {
58
- return createBoundFunction(fn$1, [[isAccessor(slot) || isMutableAccessor(slot) ? slot.slot : slot, value]]);
59
- }),
60
- [$resolve](ctx) {
61
- if (typeof implementation === "string") {
62
- addArgTypesToExternals(implementation, shell.argTypes, core);
63
- addReturnTypeToExternals(implementation, shell.returnType, core);
64
- }
65
- return core.resolve(ctx, shell.argTypes, shell.returnType);
66
- }
67
- };
68
- const call = dualImpl({
69
- name: void 0,
70
- noComptime: true,
71
- signature: {
72
- argTypes: shell.argTypes,
73
- returnType: shell.returnType
74
- },
75
- normalImpl: (...args) => provideInsideTgpuFn(() => {
76
- try {
77
- if (typeof implementation === "string") throw new Error("Cannot execute on the CPU functions constructed with raw WGSL");
78
- const castAndCopiedArgs = args.map((arg, index) => schemaCallWrapper(shell.argTypes[index], arg));
79
- const result = implementation(...castAndCopiedArgs);
80
- return schemaCallWrapper(shell.returnType, result);
81
- } catch (err) {
82
- if (err instanceof ExecutionError) throw err.appendToTrace(fn$1);
83
- throw new ExecutionError(err, [fn$1]);
84
- }
85
- }),
86
- codegenImpl: (ctx, args) => ctx.withResetIndentLevel(() => stitch`${ctx.resolve(fn$1).value}(${args})`)
87
- });
88
- const fn$1 = Object.assign(call, fnBase);
89
- Object.defineProperty(fn$1, "toString", { value() {
90
- return `fn:${getName(core) ?? "<unnamed>"}`;
91
- } });
92
- if (pairs.length > 0) return createBoundFunction(fn$1, pairs);
93
- return fn$1;
43
+ let pairs = [];
44
+ // Unwrapping generic functions
45
+ let implementation;
46
+ if (isGenericFn(_implementation)) {
47
+ pairs = _implementation[$providing]?.pairs ?? [];
48
+ implementation = _implementation[$internal].inner;
49
+ }
50
+ else {
51
+ implementation = _implementation;
52
+ }
53
+ const core = createFnCore(implementation, 'normal');
54
+ const fnBase = {
55
+ shell,
56
+ resourceType: 'function',
57
+ [$internal]: { implementation },
58
+ $uses(newExternals) {
59
+ core.setExternals('userProvided', newExternals);
60
+ return this;
61
+ },
62
+ [$getNameForward]: core,
63
+ $name(label) {
64
+ setName(this, label);
65
+ return this;
66
+ },
67
+ with: comptime((slot, value) => {
68
+ const s = isAccessor(slot) || isMutableAccessor(slot) ? slot.slot : slot;
69
+ return createBoundFunction(fn, [[s, value]]);
70
+ }),
71
+ [$resolve](ctx) {
72
+ if (typeof implementation === 'string') {
73
+ addArgTypesToExternals(implementation, shell.argTypes, core);
74
+ addReturnTypeToExternals(implementation, shell.returnType, core);
75
+ }
76
+ return core.resolve(ctx, shell.argTypes, shell.returnType);
77
+ },
78
+ };
79
+ const call = dualImpl({
80
+ name: undefined, // the name is forwarded to the core anyway
81
+ noComptime: true,
82
+ signature: { argTypes: shell.argTypes, returnType: shell.returnType },
83
+ normalImpl: (...args) => provideInsideTgpuFn(() => {
84
+ try {
85
+ if (typeof implementation === 'string') {
86
+ throw new Error('Cannot execute on the CPU functions constructed with raw WGSL');
87
+ }
88
+ const castAndCopiedArgs = args.map((arg, index) => schemaCallWrapper(shell.argTypes[index], arg));
89
+ const result = implementation(...castAndCopiedArgs);
90
+ // Casting the result to the appropriate schema
91
+ return schemaCallWrapper(shell.returnType, result);
92
+ }
93
+ catch (err) {
94
+ if (err instanceof ExecutionError) {
95
+ throw err.appendToTrace(fn);
96
+ }
97
+ throw new ExecutionError(err, [fn]);
98
+ }
99
+ }),
100
+ codegenImpl: (ctx, args) => ctx.withResetIndentLevel(() => stitch `${ctx.resolve(fn).value}(${args})`),
101
+ sideEffects: true,
102
+ });
103
+ const fn = Object.assign(call, fnBase);
104
+ Object.defineProperty(fn, 'toString', {
105
+ value() {
106
+ return `fn:${getName(core) ?? '<unnamed>'}`;
107
+ },
108
+ });
109
+ if (pairs.length > 0) {
110
+ return createBoundFunction(fn, pairs);
111
+ }
112
+ return fn;
94
113
  }
95
114
  function createBoundFunction(innerFn, pairs) {
96
- const fnBase = {
97
- resourceType: "function",
98
- shell: innerFn.shell,
99
- [$internal]: { implementation: innerFn[$internal].implementation },
100
- [$providing]: {
101
- inner: innerFn,
102
- pairs
103
- },
104
- $uses(newExternals) {
105
- innerFn.$uses(newExternals);
106
- return this;
107
- },
108
- $name(label) {
109
- setName(this, label);
110
- return this;
111
- },
112
- with: comptime((slot, value) => {
113
- const s = isAccessor(slot) || isMutableAccessor(slot) ? slot.slot : slot;
114
- return createBoundFunction(innerFn, [...pairs, [s, value]]);
115
- })
116
- };
117
- const call = dualImpl({
118
- name: void 0,
119
- noComptime: true,
120
- signature: {
121
- argTypes: innerFn.shell.argTypes,
122
- returnType: innerFn.shell.returnType
123
- },
124
- normalImpl: innerFn,
125
- codegenImpl: (ctx, args) => ctx.withResetIndentLevel(() => stitch`${ctx.resolve(fn$1).value}(${args})`)
126
- });
127
- const fn$1 = Object.assign(call, fnBase);
128
- Object.defineProperty(fn$1, "toString", { value() {
129
- return `fn:${getName(this) ?? "<unnamed>"}[${pairs.map(stringifyPair).join(", ")}]`;
130
- } });
131
- const innerName = getName(innerFn);
132
- if (innerName) setName(fn$1, innerName);
133
- return fn$1;
115
+ const fnBase = {
116
+ resourceType: 'function',
117
+ shell: innerFn.shell,
118
+ [$internal]: { implementation: innerFn[$internal].implementation },
119
+ [$providing]: { inner: innerFn, pairs },
120
+ $uses(newExternals) {
121
+ innerFn.$uses(newExternals);
122
+ return this;
123
+ },
124
+ $name(label) {
125
+ setName(this, label);
126
+ return this;
127
+ },
128
+ with: comptime((slot, value) => {
129
+ const s = isAccessor(slot) || isMutableAccessor(slot) ? slot.slot : slot;
130
+ return createBoundFunction(innerFn, [...pairs, [s, value]]);
131
+ }),
132
+ };
133
+ const call = dualImpl({
134
+ name: undefined, // setting name here would override autonaming
135
+ noComptime: true,
136
+ signature: {
137
+ argTypes: innerFn.shell.argTypes,
138
+ returnType: innerFn.shell.returnType,
139
+ },
140
+ normalImpl: innerFn,
141
+ codegenImpl: (ctx, args) => ctx.withResetIndentLevel(() => stitch `${ctx.resolve(fn).value}(${args})`),
142
+ sideEffects: true,
143
+ });
144
+ const fn = Object.assign(call, fnBase);
145
+ Object.defineProperty(fn, 'toString', {
146
+ value() {
147
+ const fnLabel = getName(this) ?? '<unnamed>';
148
+ return `fn:${fnLabel}[${pairs.map(stringifyPair).join(', ')}]`;
149
+ },
150
+ });
151
+ const innerName = getName(innerFn);
152
+ if (innerName) {
153
+ setName(fn, innerName);
154
+ }
155
+ return fn;
134
156
  }
135
157
  function createGenericFn(inner, pairs) {
136
- const fnBase = {
137
- [$internal]: { inner },
138
- resourceType: "generic-function",
139
- [$providing]: pairs.length > 0 ? {
140
- inner,
141
- pairs
142
- } : void 0,
143
- $name(label) {
144
- setName(this, label);
145
- if (!getName(inner)) setName(inner, label);
146
- return this;
147
- },
148
- [$resolve](ctx) {
149
- return ctx.resolve(inner);
150
- },
151
- with(slot, value) {
152
- const s = isAccessor(slot) || isMutableAccessor(slot) ? slot.slot : slot;
153
- return createGenericFn(inner, [...pairs, [s, value]]);
154
- }
155
- };
156
- const call = (...args) => {
157
- return inner(...args);
158
- };
159
- const genericFn = Object.assign(call, fnBase);
160
- const innerName = getName(inner);
161
- if (innerName) setName(genericFn, innerName);
162
- Object.defineProperty(genericFn, "toString", { value() {
163
- const fnLabel = getName(genericFn) ?? "<unnamed>";
164
- if (pairs.length > 0) return `fn*:${fnLabel}[${pairs.map(stringifyPair).join(", ")}]`;
165
- return `fn*:${fnLabel}`;
166
- } });
167
- return genericFn;
158
+ const fnBase = {
159
+ [$internal]: { inner },
160
+ resourceType: 'generic-function',
161
+ [$providing]: pairs.length > 0 ? { inner, pairs } : undefined,
162
+ $name(label) {
163
+ setName(this, label);
164
+ // Giving `inner` a name if it doesn't have one
165
+ if (!getName(inner)) {
166
+ setName(inner, label);
167
+ }
168
+ return this;
169
+ },
170
+ [$resolve](ctx) {
171
+ return ctx.resolve(inner);
172
+ },
173
+ with(slot, value) {
174
+ const s = isAccessor(slot) || isMutableAccessor(slot) ? slot.slot : slot;
175
+ return createGenericFn(inner, [...pairs, [s, value]]);
176
+ },
177
+ };
178
+ const call = (...args) => {
179
+ return inner(...args);
180
+ };
181
+ const genericFn = Object.assign(call, fnBase);
182
+ // Inheriting name from `inner`, if it exists
183
+ const innerName = getName(inner);
184
+ if (innerName) {
185
+ setName(genericFn, innerName);
186
+ }
187
+ Object.defineProperty(genericFn, 'toString', {
188
+ value() {
189
+ const fnLabel = getName(genericFn) ?? '<unnamed>';
190
+ if (pairs.length > 0) {
191
+ return `fn*:${fnLabel}[${pairs.map(stringifyPair).join(', ')}]`;
192
+ }
193
+ return `fn*:${fnLabel}`;
194
+ },
195
+ });
196
+ return genericFn;
168
197
  }
169
-
170
- //#endregion
171
- export { fn, isGenericFn, isTgpuFn };