typegpu 0.10.0 → 0.10.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operators-d-PMVTo7.js","names":["wgsl.isDecorated","wgsl.isPtr","wgsl.isAlignAttrib","wgsl.isSizeAttrib","wgsl.isLocationAttrib","wgsl.isWgslData","#ptrType","vec2f","vec2h","vec2i","vec2u","vec2b","vec3f","vec3h","vec3i","vec3u","vec3b","vec4f","vec4h","vec4i","vec4u","vec4b","#usedNames","#scopeStack","#usedBlockScopeNames","#isUsedInBlocksBefore","#lastUniqueId","vec2f","vec3f","vec4f","vectorConstructors.vec2b","vectorConstructors.vec2f","vectorConstructors.vec2h","vectorConstructors.vec2i","vectorConstructors.vec2u","vectorConstructors.vec3b","vectorConstructors.vec3f","vectorConstructors.vec3h","vectorConstructors.vec3i","vectorConstructors.vec3u","vectorConstructors.vec4b","vectorConstructors.vec4f","vectorConstructors.vec4h","vectorConstructors.vec4i","vectorConstructors.vec4u"],"sources":["../package.json","../src/shared/env.ts","../src/shared/symbols.ts","../src/shared/meta.ts","../src/shared/vertexFormat.ts","../src/data/wgslTypes.ts","../src/data/dataTypes.ts","../src/data/snippet.ts","../src/errors.ts","../src/core/slot/slotTypes.ts","../src/types.ts","../src/execMode.ts","../src/core/resolve/stitch.ts","../src/data/ptr.ts","../src/data/ref.ts","../src/data/schemaCallWrapper.ts","../src/shared/stringify.ts","../src/shared/utilityTypes.ts","../src/tgsl/conversion.ts","../src/core/function/createCallableSchema.ts","../src/data/numeric.ts","../src/data/vectorImpl.ts","../src/data/vector.ts","../src/nameRegistry.ts","../src/data/struct.ts","../src/tgsl/generationHelpers.ts","../src/core/function/dualImpl.ts","../src/core/function/comptime.ts","../src/data/matrix.ts","../src/data/numberOps.ts","../src/data/vectorOps.ts","../src/std/operators.ts"],"sourcesContent":["","/**\n * This can be used to branch functionality between \"dev\" and \"prod\" modes, so that our\n * library can omit doing unnecessary work once it's out in the wild\n *\n * Even though the value of this constant uses Node.js specific APIs, pretty much every\n * bundler replaces the expression below with either `development` or `production`\n */\nexport const DEV = process.env.NODE_ENV === 'development';\n\nexport const TEST = process.env.NODE_ENV === 'test';\n","// The version is inlined during build-time 🎉\n// It helps us identify problems when two versions of\n// TypeGPU are used at the same time.\nimport { version } from '../../package.json';\n\nexport const $internal = Symbol(`typegpu:${version}:$internal`);\n/**\n * The getter to the value of this resource, accessible on the GPU\n */\nexport const $gpuValueOf = Symbol(`typegpu:${version}:$gpuValueOf`);\n/**\n * If this symbol is present, this means that getName and setName\n * will refer to object behind this property instead.\n */\nexport const $getNameForward = Symbol(`typegpu:${version}:$getNameForward`);\n/**\n * Marks an object with slot-value bindings\n */\nexport const $providing = Symbol(`typegpu:${version}:$providing`);\n\n/**\n * Objects can provide the snippet that represents them.\n */\nexport const $ownSnippet = Symbol(`typegpu:${version}:$ownSnippet`);\n\nexport const $resolve = Symbol(`typegpu:${version}:$resolve`);\n\n/**\n * A way for a schema to provide casting behavior, without the need to be explicitly\n * callable by the end-user (e.g. vertex formats)\n */\nexport const $cast = Symbol(`typegpu:${version}:$cast`);\n/**\n * Can be called on the GPU\n */\nexport const $gpuCallable = Symbol(`typegpu:${version}:$gpuCallable`);\n\n//\n// Type tokens\n//\n\n/**\n * Type token for the inferred (CPU & GPU) representation of a resource\n */\nexport const $repr = Symbol(`typegpu:${version}:$repr`);\n/**\n * Type token for the inferred (GPU-side) representation of a resource\n * If present, it shadows the value of `$repr` for GPU-side inference.\n */\nexport const $gpuRepr = Symbol(`typegpu:${version}:$gpuRepr`);\n/**\n * Type token for the inferred partial representation of a resource.\n * If present, it shadows the value of `$repr` for use in partial IO.\n */\nexport const $reprPartial = Symbol(`typegpu:${version}:$reprPartial`);\n/**\n * Type token holding schemas that are identical in memory layout.\n */\nexport const $memIdent = Symbol(`typegpu:${version}:$memIdent`);\n\n/**\n * Type token, signaling that a schema can be used in a storage buffer.\n */\nexport const $validStorageSchema = Symbol(\n `typegpu:${version}:$invalidStorageSchema`,\n);\n/**\n * Type token, signaling that a schema can be used in a uniform buffer.\n */\nexport const $validUniformSchema = Symbol(\n `typegpu:${version}:$validUniformSchema`,\n);\n/**\n * Type token, signaling that a schema can be used in a vertex buffer.\n */\nexport const $validVertexSchema = Symbol(\n `typegpu:${version}:$validVertexSchema`,\n);\n/**\n * Type token, containing a reason for why the schema is invalid (if it is).\n */\nexport const $invalidSchemaReason = Symbol(\n `typegpu:${version}:$invalidSchemaReason`,\n);\n\nexport function isMarkedInternal(\n value: unknown,\n): value is { [$internal]: Record<string, unknown> | true } {\n return !!(value as { [$internal]: Record<string, unknown> })?.[$internal];\n}\n","// The version is inlined during build-time 🎉\nimport { version } from '../../package.json';\nimport type { Block, FuncParameter } from 'tinyest';\nimport { DEV, TEST } from './env.ts';\nimport { $getNameForward, isMarkedInternal } from './symbols.ts';\n\nexport interface MetaData {\n v?: number;\n name?: string | undefined;\n ast?: {\n params: FuncParameter[];\n body: Block;\n externalNames: string[];\n } | undefined;\n externals?:\n // Passing a record happens prior to version 0.9.0\n // TODO: Support for this can be removed down the line\n | Record<string, unknown>\n | (() => Record<string, unknown>)\n | undefined;\n}\n\n/**\n * Don't use or you WILL get fired from your job.\n *\n * The information that this type describes is additional\n * properties that we add onto `globalThis`, used by tools\n * like `unplugin-typegpu` or our test suite.\n *\n * @internal\n */\nexport type INTERNAL_GlobalExt = typeof globalThis & {\n __TYPEGPU_VERSION__: string | undefined;\n __TYPEGPU_META__: WeakMap<object, MetaData>;\n __TYPEGPU_AUTONAME__: <T>(exp: T, label: string) => T;\n __TYPEGPU_MEASURE_PERF__?: boolean | undefined;\n __TYPEGPU_PERF_RECORDS__?: Map<string, unknown[]> | undefined;\n};\n\nconst globalWithMeta = globalThis as INTERNAL_GlobalExt;\n\nif (globalWithMeta.__TYPEGPU_VERSION__ !== undefined) {\n console.warn(\n `Found duplicate TypeGPU version. First was ${globalWithMeta.__TYPEGPU_VERSION__}, this one is ${version}. This may cause unexpected behavior.`,\n );\n}\n\nglobalWithMeta.__TYPEGPU_VERSION__ = version;\nglobalWithMeta.__TYPEGPU_AUTONAME__ = <T>(exp: T, label: string): T =>\n isNamable(exp) && isMarkedInternal(exp) && !getName(exp)\n ? exp.$name(label)\n : exp;\n\n/**\n * Performance measurements are only enabled in dev & test environments for now\n */\nexport const PERF = (DEV || TEST) && ({\n get enabled() {\n return !!globalWithMeta.__TYPEGPU_MEASURE_PERF__;\n },\n record(name: string, data: unknown) {\n const records = (globalWithMeta.__TYPEGPU_PERF_RECORDS__ ??= new Map());\n let entries = records.get(name);\n if (!entries) {\n entries = [];\n records.set(name, entries);\n }\n entries.push(data);\n },\n }) || undefined;\n\nfunction isForwarded(value: unknown): value is { [$getNameForward]: unknown } {\n return !!(value as { [$getNameForward]?: unknown })?.[$getNameForward];\n}\n\nexport function getName(definition: unknown): string | undefined {\n if (isForwarded(definition)) {\n return getName(definition[$getNameForward]);\n }\n return getMetaData(definition)?.name;\n}\n\nexport function setName(definition: object, name: string | undefined): void {\n if (isForwarded(definition)) {\n setName(definition[$getNameForward] as object, name);\n return;\n }\n setMetaData(definition, { name });\n}\n\n/**\n * Can be assigned a name. Not to be confused with just having a name.\n * The `$name` function should use `setName` to rename the object itself,\n * even if `$getNameForward` symbol is present.\n */\nexport interface TgpuNamable {\n $name(label: string): this;\n}\n\nexport function isNamable(value: unknown): value is TgpuNamable {\n return !!(value as TgpuNamable)?.$name;\n}\n\n/**\n * AST's are given to functions with a 'use gpu' directive, which this function checks for.\n */\nexport function hasTinyestMetadata(\n value: unknown,\n): value is (...args: never[]) => unknown {\n return !!getMetaData(value)?.ast;\n}\n\nexport function getMetaData(\n definition: unknown,\n): MetaData | undefined {\n return globalWithMeta.__TYPEGPU_META__.get(\n // it's fine, if it's not an object, the get will return undefined\n definition as object,\n );\n}\n\nexport function setMetaData(definition: object, metaData: object) {\n globalWithMeta.__TYPEGPU_META__ ??= new WeakMap();\n const map = globalWithMeta.__TYPEGPU_META__;\n map.set(definition, { ...map.get(definition), ...metaData });\n}\n","export const vertexFormats = [\n 'uint8',\n 'uint8x2',\n 'uint8x4',\n 'sint8',\n 'sint8x2',\n 'sint8x4',\n 'unorm8',\n 'unorm8x2',\n 'unorm8x4',\n 'snorm8',\n 'snorm8x2',\n 'snorm8x4',\n 'uint16',\n 'uint16x2',\n 'uint16x4',\n 'sint16',\n 'sint16x2',\n 'sint16x4',\n 'unorm16',\n 'unorm16x2',\n 'unorm16x4',\n 'snorm16',\n 'snorm16x2',\n 'snorm16x4',\n 'float16',\n 'float16x2',\n 'float16x4',\n 'float32',\n 'float32x2',\n 'float32x3',\n 'float32x4',\n 'uint32',\n 'uint32x2',\n 'uint32x3',\n 'uint32x4',\n 'sint32',\n 'sint32x2',\n 'sint32x3',\n 'sint32x4',\n 'unorm10-10-10-2',\n 'unorm8x4-bgra',\n] as const;\n\nexport type VertexFormat = (typeof vertexFormats)[number];\n\nexport const kindToDefaultFormatMap = {\n f32: 'float32',\n vec2f: 'float32x2',\n vec3f: 'float32x3',\n vec4f: 'float32x4',\n f16: 'float16',\n vec2h: 'float16x2',\n // vec3h has no direct equivalent in the spec\n vec4h: 'float16x4',\n u32: 'uint32',\n vec2u: 'uint32x2',\n vec3u: 'uint32x3',\n vec4u: 'uint32x4',\n i32: 'sint32',\n vec2i: 'sint32x2',\n vec3i: 'sint32x3',\n vec4i: 'sint32x4',\n} as const;\n\nexport type KindToDefaultFormatMap = typeof kindToDefaultFormatMap;\n\nexport interface TgpuVertexAttrib<TFormat extends VertexFormat = VertexFormat> {\n readonly format: TFormat;\n readonly offset: number;\n}\n\nexport type AnyVertexAttribs =\n | Record<string, TgpuVertexAttrib>\n | TgpuVertexAttrib;\n\n/**\n * All vertex attribute formats that can be interpreted as\n * an single or multi component u32 in a shader.\n * https://www.w3.org/TR/webgpu/#vertex-formats\n */\ntype U32CompatibleFormats =\n | TgpuVertexAttrib<'uint8'>\n | TgpuVertexAttrib<'uint8x2'>\n | TgpuVertexAttrib<'uint8x4'>\n | TgpuVertexAttrib<'uint16'>\n | TgpuVertexAttrib<'uint16x2'>\n | TgpuVertexAttrib<'uint16x4'>\n | TgpuVertexAttrib<'uint32'>\n | TgpuVertexAttrib<'uint32x2'>\n | TgpuVertexAttrib<'uint32x3'>\n | TgpuVertexAttrib<'uint32x4'>;\n\n/**\n * All vertex attribute formats that can be interpreted as\n * an single or multi component i32 in a shader.\n * https://www.w3.org/TR/webgpu/#vertex-formats\n */\ntype I32CompatibleFormats =\n | TgpuVertexAttrib<'sint8'>\n | TgpuVertexAttrib<'sint8x2'>\n | TgpuVertexAttrib<'sint8x4'>\n | TgpuVertexAttrib<'sint16'>\n | TgpuVertexAttrib<'sint16x2'>\n | TgpuVertexAttrib<'sint16x4'>\n | TgpuVertexAttrib<'sint32'>\n | TgpuVertexAttrib<'sint32x2'>\n | TgpuVertexAttrib<'sint32x3'>\n | TgpuVertexAttrib<'sint32x4'>;\n\n/**\n * All vertex attribute formats that can be interpreted as\n * an single or multi component f32 in a shader.\n * https://www.w3.org/TR/webgpu/#vertex-formats\n */\ntype F32CompatibleFormats =\n | TgpuVertexAttrib<'unorm8'>\n | TgpuVertexAttrib<'unorm8x2'>\n | TgpuVertexAttrib<'unorm8x4'>\n | TgpuVertexAttrib<'snorm8'>\n | TgpuVertexAttrib<'snorm8x2'>\n | TgpuVertexAttrib<'snorm8x4'>\n | TgpuVertexAttrib<'unorm16'>\n | TgpuVertexAttrib<'unorm16x2'>\n | TgpuVertexAttrib<'unorm16x4'>\n | TgpuVertexAttrib<'snorm16'>\n | TgpuVertexAttrib<'snorm16x2'>\n | TgpuVertexAttrib<'snorm16x4'>\n | TgpuVertexAttrib<'float16'>\n | TgpuVertexAttrib<'float16x2'>\n | TgpuVertexAttrib<'float16x4'>\n | TgpuVertexAttrib<'float32'>\n | TgpuVertexAttrib<'float32x2'>\n | TgpuVertexAttrib<'float32x3'>\n | TgpuVertexAttrib<'float32x4'>\n | TgpuVertexAttrib<'unorm10-10-10-2'>\n | TgpuVertexAttrib<'unorm8x4-bgra'>;\n\n/**\n * All vertex attribute formats that can be interpreted as\n * a single or multi component f16 in a shader. (same as f32 on the shader side)\n * https://www.w3.org/TR/webgpu/#vertex-formats\n */\ntype F16CompatibleFormats = F32CompatibleFormats;\n\nexport type KindToAcceptedAttribMap = {\n u32: U32CompatibleFormats;\n vec2u: U32CompatibleFormats;\n vec3u: U32CompatibleFormats;\n vec4u: U32CompatibleFormats;\n\n i32: I32CompatibleFormats;\n vec2i: I32CompatibleFormats;\n vec3i: I32CompatibleFormats;\n vec4i: I32CompatibleFormats;\n\n f16: F16CompatibleFormats;\n vec2h: F16CompatibleFormats;\n vec3h: F16CompatibleFormats;\n vec4h: F16CompatibleFormats;\n\n f32: F32CompatibleFormats;\n vec2f: F32CompatibleFormats;\n vec3f: F32CompatibleFormats;\n vec4f: F32CompatibleFormats;\n};\n","import 'tsover-runtime';\nimport type { TgpuNamable } from '../shared/meta.ts';\nimport type {\n ExtractInvalidSchemaError,\n Infer,\n InferGPU,\n InferGPURecord,\n InferPartial,\n InferPartialRecord,\n InferRecord,\n IsValidStorageSchema,\n IsValidUniformSchema,\n IsValidVertexSchema,\n MemIdentity,\n MemIdentityRecord,\n} from '../shared/repr.ts';\nimport type {\n $gpuRepr,\n $invalidSchemaReason,\n $memIdent,\n $repr,\n $reprPartial,\n $validStorageSchema,\n $validUniformSchema,\n $validVertexSchema,\n} from '../shared/symbols.ts';\nimport { $internal, isMarkedInternal } from '../shared/symbols.ts';\nimport type { Prettify, SwapNever } from '../shared/utilityTypes.ts';\nimport type {\n WgslExternalTexture,\n WgslStorageTexture,\n WgslTexture,\n} from './texture.ts';\nimport type { WgslComparisonSampler, WgslSampler } from './sampler.ts';\nimport type { _ref as ref } from './ref.ts';\nimport type { DualFn } from '../types.ts';\n\ntype DecoratedLocation<T extends BaseData> = Decorated<T, Location[]>;\n\nexport interface BaseData {\n readonly [$internal]: Record<string, unknown>;\n readonly type: string;\n readonly [$repr]: unknown;\n toString(): string;\n}\n\nexport interface NumberArrayView {\n readonly length: number;\n [n: number]: number;\n [Symbol.iterator]: () => Iterator<number>;\n}\n\n/**\n * Vector infix notation.\n *\n * @privateRemarks\n * These functions are not defined on vectors,\n * but are instead assigned to `VecBase` after both `data` and `std` are initialized.\n */\nexport interface vecInfixNotation<T extends vecBase> {\n add(other: T | number): T;\n sub(other: T | number): T;\n mul(other: mBaseForVec<T> | T | number): T;\n div(other: T | number): T;\n mod(other: T | number): T;\n\n [Symbol.operatorPlus](lhs: T | number, rhs: T | number): T;\n [Symbol.operatorMinus](lhs: T | number, rhs: T | number): T;\n [Symbol.operatorStar](\n lhs: mBaseForVec<T> | T | number,\n rhs: mBaseForVec<T> | T | number,\n ): T;\n [Symbol.operatorSlash](lhs: T | number, rhs: T | number): T;\n [Symbol.operatorPercent](lhs: T | number, rhs: T | number): T;\n}\n\n/**\n * Matrix infix notation.\n *\n * @privateRemarks\n * These functions are not defined on matrices,\n * but are instead assigned to `MatBase` after both `data` and `std` are initialized.\n */\nexport interface matInfixNotation<T extends matBase> {\n add(other: T): T;\n sub(other: T): T;\n mul(other: T | number): T;\n mul(other: vBaseForMat<T>): vBaseForMat<T>;\n\n [Symbol.operatorPlus](lhs: T, rhs: T): T;\n [Symbol.operatorMinus](lhs: T, rhs: T): T;\n [Symbol.operatorStar](lhs: T | number, rhs: T | number): T;\n [Symbol.operatorStar](lhs: T, rhs: vBaseForMat<T>): vBaseForMat<T>;\n [Symbol.operatorStar](lhs: vBaseForMat<T>, rhs: T): vBaseForMat<T>;\n}\n\n/**\n * Represents a 64-bit integer.\n */\nexport interface AbstractInt extends BaseData {\n readonly type: 'abstractInt';\n // Type-tokens, not available at runtime\n readonly [$repr]: number;\n readonly [$invalidSchemaReason]: 'Abstract numerics are not host-shareable';\n // ---\n}\n\n/**\n * Represents a 64-bit IEEE 754 floating point number.\n */\nexport interface AbstractFloat extends BaseData {\n readonly type: 'abstractFloat';\n // Type-tokens, not available at runtime\n readonly [$repr]: number;\n readonly [$invalidSchemaReason]: 'Abstract numerics are not host-shareable';\n // ---\n}\n\nexport interface Void extends BaseData {\n readonly type: 'void';\n // Type-tokens, not available at runtime\n readonly [$repr]: void;\n readonly [$invalidSchemaReason]: 'Void is not host-shareable';\n // ---\n}\nexport const Void = {\n [$internal]: {},\n type: 'void',\n toString() {\n return 'void';\n },\n} as Void;\n\n// #region Instance Types\n\ntype XY = 'x' | 'y';\ntype XYZ = 'x' | 'y' | 'z';\ntype XYZW = 'x' | 'y' | 'z' | 'w';\ntype RG = 'r' | 'g';\ntype RGB = 'r' | 'g' | 'b';\ntype RGBA = 'r' | 'g' | 'b' | 'a';\n\ntype Swizzle2<T2, T3, T4> =\n & {\n readonly [K in `${XY}${XY}` | `${RG}${RG}`]: T2;\n }\n & {\n readonly [K in `${XY}${XY}${XY}` | `${RG}${RG}${RG}`]: T3;\n }\n & {\n readonly [\n K in `${XY}${XY}${XY}${XY}` | `${RG}${RG}${RG}${RG}`\n ]: T4;\n };\n\ntype Swizzle3<T2, T3, T4> =\n & {\n readonly [K in `${XYZ}${XYZ}` | `${RGB}${RGB}`]: T2;\n }\n & {\n readonly [K in `${XYZ}${XYZ}${XYZ}` | `${RGB}${RGB}${RGB}`]: T3;\n }\n & {\n readonly [\n K in `${XYZ}${XYZ}${XYZ}${XYZ}` | `${RGB}${RGB}${RGB}${RGB}`\n ]: T4;\n };\n\ntype Swizzle4<T2, T3, T4> =\n & {\n readonly [K in `${XYZW}${XYZW}` | `${RGBA}${RGBA}`]: T2;\n }\n & {\n readonly [K in `${XYZW}${XYZW}${XYZW}` | `${RGBA}${RGBA}${RGBA}`]: T3;\n }\n & {\n readonly [\n K in `${XYZW}${XYZW}${XYZW}${XYZW}` | `${RGBA}${RGBA}${RGBA}${RGBA}`\n ]: T4;\n };\n\ntype Tuple2<S> = [S, S];\ntype Tuple3<S> = [S, S, S];\ntype Tuple4<S> = [S, S, S, S];\n\n/**\n * A type which every numeric vector is assignable to. In most cases the union v2f | v3f | v4f | v2h | v3h | v4h | v2i | v3i | v4i | v2u | v3u | v4u\n * is preferred, but when an implementation uses overloaded operators and is generic on the type,\n * this makes the type checking much more laid back.\n *\n * @example\n * ```ts\n * export function quinticInterpolation(t: d.v2f): d.v2f;\n * export function quinticInterpolation(t: d.v3f): d.v3f;\n * export function quinticInterpolation(t: d.vecBase): d.vecBase {\n * 'use gpu';\n * return t * t * t * (t * (t * 6 - 15) + 10);\n * }\n * ```\n */\nexport interface vecBase extends vecInfixNotation<vecBase> {\n readonly [$internal]: true;\n readonly kind:\n | 'vec2f'\n | 'vec3f'\n | 'vec4f'\n | 'vec2h'\n | 'vec3h'\n | 'vec4h'\n | 'vec2i'\n | 'vec3i'\n | 'vec4i'\n | 'vec2u'\n | 'vec3u'\n | 'vec4u';\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec2f or vec2<f32>.\n * A vector with 2 elements of type f32\n */\nexport interface v2f\n extends Tuple2<number>, Swizzle2<v2f, v3f, v4f>, vecInfixNotation<v2f> {\n readonly [$internal]: true;\n /** use to distinguish between vectors of the same size on the type level */\n readonly kind: 'vec2f';\n x: number;\n y: number;\n r: number;\n g: number;\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec2h or vec2<f16>.\n * A vector with 2 elements of type f16\n */\nexport interface v2h\n extends Tuple2<number>, Swizzle2<v2h, v3h, v4h>, vecInfixNotation<v2h> {\n readonly [$internal]: true;\n /** use to distinguish between vectors of the same size on the type level */\n readonly kind: 'vec2h';\n x: number;\n y: number;\n r: number;\n g: number;\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec2i or vec2<i32>.\n * A vector with 2 elements of type i32\n */\nexport interface v2i\n extends Tuple2<number>, Swizzle2<v2i, v3i, v4i>, vecInfixNotation<v2i> {\n readonly [$internal]: true;\n /** use to distinguish between vectors of the same size on the type level */\n readonly kind: 'vec2i';\n x: number;\n y: number;\n r: number;\n g: number;\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec2u or vec2<u32>.\n * A vector with 2 elements of type u32\n */\nexport interface v2u\n extends Tuple2<number>, Swizzle2<v2u, v3u, v4u>, vecInfixNotation<v2u> {\n readonly [$internal]: true;\n /** use to distinguish between vectors of the same size on the type level */\n readonly kind: 'vec2u';\n x: number;\n y: number;\n r: number;\n g: number;\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: `vec2<bool>`.\n * A vector with 2 elements of type `bool`\n */\nexport interface v2b extends Tuple2<boolean>, Swizzle2<v2b, v3b, v4b> {\n readonly [$internal]: true;\n /** use to distinguish between vectors of the same size on the type level */\n readonly kind: 'vec2<bool>';\n x: boolean;\n y: boolean;\n r: boolean;\n g: boolean;\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec3f or vec3<f32>.\n * A vector with 3 elements of type f32\n */\nexport interface v3f\n extends Tuple3<number>, Swizzle3<v2f, v3f, v4f>, vecInfixNotation<v3f> {\n readonly [$internal]: true;\n /** use to distinguish between vectors of the same size on the type level */\n readonly kind: 'vec3f';\n x: number;\n y: number;\n z: number;\n r: number;\n g: number;\n b: number;\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec3h or vec3<f16>.\n * A vector with 3 elements of type f16\n */\nexport interface v3h\n extends Tuple3<number>, Swizzle3<v2h, v3h, v4h>, vecInfixNotation<v3h> {\n readonly [$internal]: true;\n /** use to distinguish between vectors of the same size on the type level */\n readonly kind: 'vec3h';\n x: number;\n y: number;\n z: number;\n r: number;\n g: number;\n b: number;\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec3i or vec3<i32>.\n * A vector with 3 elements of type i32\n */\nexport interface v3i\n extends Tuple3<number>, Swizzle3<v2i, v3i, v4i>, vecInfixNotation<v3i> {\n readonly [$internal]: true;\n /** use to distinguish between vectors of the same size on the type level */\n readonly kind: 'vec3i';\n x: number;\n y: number;\n z: number;\n r: number;\n g: number;\n b: number;\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec3u or vec3<u32>.\n * A vector with 3 elements of type u32\n */\nexport interface v3u\n extends Tuple3<number>, Swizzle3<v2u, v3u, v4u>, vecInfixNotation<v3u> {\n readonly [$internal]: true;\n /** use to distinguish between vectors of the same size on the type level */\n readonly kind: 'vec3u';\n x: number;\n y: number;\n z: number;\n r: number;\n g: number;\n b: number;\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: `vec3<bool>`.\n * A vector with 3 elements of type `bool`\n */\nexport interface v3b extends Tuple3<boolean>, Swizzle3<v2b, v3b, v4b> {\n readonly [$internal]: true;\n /** use to distinguish between vectors of the same size on the type level */\n readonly kind: 'vec3<bool>';\n x: boolean;\n y: boolean;\n z: boolean;\n r: boolean;\n g: boolean;\n b: boolean;\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec4f or vec4<f32>.\n * A vector with 4 elements of type f32\n */\nexport interface v4f\n extends Tuple4<number>, Swizzle4<v2f, v3f, v4f>, vecInfixNotation<v4f> {\n readonly [$internal]: true;\n /** use to distinguish between vectors of the same size on the type level */\n readonly kind: 'vec4f';\n x: number;\n y: number;\n z: number;\n w: number;\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec4h or vec4<f16>.\n * A vector with 4 elements of type f16\n */\nexport interface v4h\n extends Tuple4<number>, Swizzle4<v2h, v3h, v4h>, vecInfixNotation<v4h> {\n readonly [$internal]: true;\n /** use to distinguish between vectors of the same size on the type level */\n readonly kind: 'vec4h';\n x: number;\n y: number;\n z: number;\n w: number;\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec4i or vec4<i32>.\n * A vector with 4 elements of type i32\n */\nexport interface v4i\n extends Tuple4<number>, Swizzle4<v2i, v3i, v4i>, vecInfixNotation<v4i> {\n readonly [$internal]: true;\n /** use to distinguish between vectors of the same size on the type level */\n readonly kind: 'vec4i';\n x: number;\n y: number;\n z: number;\n w: number;\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: vec4u or vec4<u32>.\n * A vector with 4 elements of type u32\n */\nexport interface v4u\n extends Tuple4<number>, Swizzle4<v2u, v3u, v4u>, vecInfixNotation<v4u> {\n readonly [$internal]: true;\n /** use to distinguish between vectors of the same size on the type level */\n readonly kind: 'vec4u';\n x: number;\n y: number;\n z: number;\n w: number;\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\n/**\n * Interface representing its WGSL vector type counterpart: `vec4<bool>`.\n * A vector with 4 elements of type `bool`\n */\nexport interface v4b extends Tuple4<boolean>, Swizzle4<v2b, v3b, v4b> {\n readonly [$internal]: true;\n /** use to distinguish between vectors of the same size on the type level */\n readonly kind: 'vec4<bool>';\n x: boolean;\n y: boolean;\n z: boolean;\n w: boolean;\n r: boolean;\n g: boolean;\n b: boolean;\n a: boolean;\n}\n\nexport type AnyFloat32VecInstance = v2f | v3f | v4f;\n\nexport type AnyFloat16VecInstance = v2h | v3h | v4h;\n\nexport type AnyFloatVecInstance = v2f | v2h | v3f | v3h | v4f | v4h;\n\nexport type AnyUnsignedVecInstance = v2u | v3u | v4u;\n\nexport type AnyIntegerVecInstance = v2i | v2u | v3i | v3u | v4i | v4u;\n\nexport type AnyBooleanVecInstance = v2b | v3b | v4b;\n\nexport type AnySignedVecInstance =\n | v2i\n | v2f\n | v2h\n | v3i\n | v3f\n | v3h\n | v4i\n | v4f\n | v4h;\n\nexport type AnyNumericVec2Instance = v2f | v2h | v2i | v2u;\nexport type AnyNumericVec3Instance = v3f | v3h | v3i | v3u;\nexport type AnyNumericVec4Instance = v4f | v4h | v4i | v4u;\n\nexport type AnyNumericVecInstance =\n | AnyNumericVec2Instance\n | AnyNumericVec3Instance\n | AnyNumericVec4Instance;\n\nexport type AnyVec2Instance = v2f | v2h | v2i | v2u | v2b;\nexport type AnyVec3Instance = v3f | v3h | v3i | v3u | v3b;\nexport type AnyVec4Instance = v4f | v4h | v4i | v4u | v4b;\n\nexport type AnyVecInstance =\n | AnyVec2Instance\n | AnyVec3Instance\n | AnyVec4Instance;\n\nexport type VecKind = AnyVecInstance['kind'];\n\n/**\n * A type which every matrix is assignable to. In most cases the union m2x2f | m3x3f | m4x4f\n * is preferred, but when an implementation uses overloaded operators and is generic on the type,\n * this makes the type checking much more laid back.\n */\nexport interface matBase extends matInfixNotation<matBase> {\n readonly [$internal]: true;\n readonly kind: 'mat2x2f' | 'mat3x3f' | 'mat4x4f';\n}\n\n/**\n * Interface representing its WGSL matrix type counterpart: mat2x2\n * A matrix with 2 rows and 2 columns, with elements of type `TColumn`\n */\nexport interface mat2x2<TColumn> extends NumberArrayView {\n readonly [$internal]: true;\n readonly length: 4;\n readonly kind: string;\n /* override */ readonly columns: readonly [TColumn, TColumn];\n [n: number]: number;\n}\n\n/**\n * Interface representing its WGSL matrix type counterpart: mat2x2f or mat2x2<f32>\n * A matrix with 2 rows and 2 columns, with elements of type d.f32\n */\nexport interface m2x2f extends mat2x2<v2f>, matInfixNotation<m2x2f> {\n readonly kind: 'mat2x2f';\n}\n\n/**\n * Interface representing its WGSL matrix type counterpart: mat3x3\n * A matrix with 3 rows and 3 columns, with elements of type `TColumn`\n */\nexport interface mat3x3<TColumn> extends NumberArrayView {\n readonly [$internal]: true;\n readonly length: 12;\n readonly kind: string;\n /* override */ readonly columns: readonly [TColumn, TColumn, TColumn];\n [n: number]: number;\n}\n\n/**\n * Interface representing its WGSL matrix type counterpart: mat3x3f or mat3x3<f32>\n * A matrix with 3 rows and 3 columns, with elements of type d.f32\n */\nexport interface m3x3f extends mat3x3<v3f>, matInfixNotation<m3x3f> {\n readonly kind: 'mat3x3f';\n}\n\n/**\n * Interface representing its WGSL matrix type counterpart: mat4x4\n * A matrix with 4 rows and 4 columns, with elements of type `TColumn`\n */\nexport interface mat4x4<TColumn> extends NumberArrayView {\n readonly [$internal]: true;\n readonly length: 16;\n readonly kind: string;\n /* override */ readonly columns: readonly [\n TColumn,\n TColumn,\n TColumn,\n TColumn,\n ];\n [n: number]: number;\n}\n\n/**\n * Interface representing its WGSL matrix type counterpart: mat4x4f or mat4x4<f32>\n * A matrix with 4 rows and 4 columns, with elements of type d.f32\n */\nexport interface m4x4f extends mat4x4<v4f>, matInfixNotation<m4x4f> {\n readonly kind: 'mat4x4f';\n}\n\nexport type AnyMatInstance = m2x2f | m3x3f | m4x4f;\n\nexport type vBaseForMat<T extends matBase> = T extends m2x2f ? v2f\n : T extends m3x3f ? v3f\n : T extends m4x4f ? v4f\n : vecBase;\n\nexport type mBaseForVec<T extends vecBase> = T extends v2f ? m2x2f\n : T extends v3f ? m3x3f\n : T extends v4f ? m4x4f\n : matBase;\n\n// #endregion\n\n// #region WGSL Schema Types\n/**\n * Boolean schema representing a single WGSL bool value.\n * Cannot be used inside buffers as it is not host-shareable.\n */\nexport interface Bool\n extends BaseData, DualFn<(v?: number | boolean) => boolean> {\n readonly type: 'bool';\n\n // Type-tokens, not available at runtime\n readonly [$repr]: boolean;\n readonly [$invalidSchemaReason]:\n 'Bool is not host-shareable, use U32 or I32 instead';\n // ---\n}\n\n/**\n * 32-bit float schema representing a single WGSL f32 value.\n */\nexport interface F32\n extends BaseData, DualFn<(v?: number | boolean) => number> {\n readonly type: 'f32';\n\n // Type-tokens, not available at runtime\n readonly [$repr]: number;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n readonly [$validVertexSchema]: true;\n // ---\n}\n\n/**\n * 16-bit float schema representing a single WGSL f16 value.\n */\nexport interface F16\n extends BaseData, DualFn<(v?: number | boolean) => number> {\n readonly type: 'f16';\n\n // Type-tokens, not available at runtime\n readonly [$repr]: number;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n readonly [$validVertexSchema]: true;\n // ---\n}\n\n/**\n * Signed 32-bit integer schema representing a single WGSL i32 value.\n */\nexport interface I32\n extends BaseData, DualFn<(v?: number | boolean) => number> {\n readonly type: 'i32';\n\n // Type-tokens, not available at runtime\n readonly [$repr]: number;\n readonly [$memIdent]: I32 | Atomic<I32> | DecoratedLocation<I32>;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n readonly [$validVertexSchema]: true;\n // ---\n}\n\n/**\n * Unsigned 32-bit integer schema representing a single WGSL u32 value.\n */\nexport interface U32\n extends BaseData, DualFn<(v?: number | boolean) => number> {\n readonly type: 'u32';\n\n // Type-tokens, not available at runtime\n readonly [$repr]: number;\n readonly [$memIdent]: U32 | Atomic<U32> | DecoratedLocation<U32>;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n readonly [$validVertexSchema]: true;\n // ---\n}\n\n/**\n * Unsigned 16-bit integer schema used exclusively for index buffer schemas.\n */\nexport interface U16 extends BaseData {\n readonly type: 'u16';\n\n // Type-tokens, not available at runtime\n readonly [$repr]: number;\n readonly [$invalidSchemaReason]:\n 'U16 is only usable inside arrays for index buffers, use U32 or I32 instead';\n // ---\n}\n\n/**\n * Type of the `d.vec2f` object/function: vector data type schema/constructor\n */\nexport interface Vec2f extends\n BaseData,\n DualFn<\n & ((x: number, y: number) => v2f)\n & ((xy: number) => v2f)\n & (() => v2f)\n & ((v: AnyNumericVec2Instance) => v2f)\n > {\n readonly type: 'vec2f';\n readonly primitive: F32;\n readonly componentCount: 2;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: v2f;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n readonly [$validVertexSchema]: true;\n // ---\n}\n\n/**\n * Type of the `d.vec2h` object/function: vector data type schema/constructor\n */\nexport interface Vec2h extends\n BaseData,\n DualFn<\n & ((x: number, y: number) => v2h)\n & ((xy: number) => v2h)\n & (() => v2h)\n & ((v: AnyNumericVec2Instance) => v2h)\n > {\n readonly type: 'vec2h';\n readonly primitive: F16;\n readonly componentCount: 2;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: v2h;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n readonly [$validVertexSchema]: true;\n // ---\n}\n\n/**\n * Type of the `d.vec2i` object/function: vector data type schema/constructor\n */\nexport interface Vec2i extends\n BaseData,\n DualFn<\n & ((x: number, y: number) => v2i)\n & ((xy: number) => v2i)\n & (() => v2i)\n & ((v: AnyNumericVec2Instance) => v2i)\n > {\n readonly type: 'vec2i';\n readonly primitive: I32;\n readonly componentCount: 2;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: v2i;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n readonly [$validVertexSchema]: true;\n // ---\n}\n\n/**\n * Type of the `d.vec2u` object/function: vector data type schema/constructor\n */\nexport interface Vec2u extends\n BaseData,\n DualFn<\n & ((x: number, y: number) => v2u)\n & ((xy: number) => v2u)\n & (() => v2u)\n & ((v: AnyNumericVec2Instance) => v2u)\n > {\n readonly type: 'vec2u';\n readonly primitive: U32;\n readonly componentCount: 2;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: v2u;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n readonly [$validVertexSchema]: true;\n // ---\n}\n\n/**\n * Type of the `d.vec2b` object/function: vector data type schema/constructor\n * Cannot be used inside buffers as it is not host-shareable.\n */\nexport interface Vec2b extends\n BaseData,\n DualFn<\n & ((x: boolean, y: boolean) => v2b)\n & ((xy: boolean) => v2b)\n & (() => v2b)\n & ((v: v2b) => v2b)\n > {\n readonly type: 'vec2<bool>';\n readonly primitive: Bool;\n readonly componentCount: 2;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: v2b;\n readonly [$invalidSchemaReason]:\n 'Boolean vectors is not host-shareable, use numeric vectors instead';\n // ---\n}\n\n/**\n * Type of the `d.vec3f` object/function: vector data type schema/constructor\n */\nexport interface Vec3f extends\n BaseData,\n DualFn<\n & ((x: number, y: number, z: number) => v3f)\n & ((xyz: number) => v3f)\n & (() => v3f)\n & ((v: AnyNumericVec3Instance) => v3f)\n & ((v0: AnyNumericVec2Instance, z: number) => v3f)\n & ((x: number, v0: AnyNumericVec2Instance) => v3f)\n > {\n readonly type: 'vec3f';\n readonly primitive: F32;\n readonly componentCount: 3;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: v3f;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n readonly [$validVertexSchema]: true;\n // ---\n}\n\n/**\n * Type of the `d.vec3h` object/function: vector data type schema/constructor\n */\nexport interface Vec3h extends\n BaseData,\n DualFn<\n & ((x: number, y: number, z: number) => v3h)\n & ((xyz: number) => v3h)\n & (() => v3h)\n & ((v: AnyNumericVec3Instance) => v3h)\n & ((v0: AnyNumericVec2Instance, z: number) => v3h)\n & ((x: number, v0: AnyNumericVec2Instance) => v3h)\n > {\n readonly type: 'vec3h';\n readonly primitive: F16;\n readonly componentCount: 3;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: v3h;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n readonly [$validVertexSchema]: true;\n // ---\n}\n\n/**\n * Type of the `d.vec3i` object/function: vector data type schema/constructor\n */\nexport interface Vec3i extends\n BaseData,\n DualFn<\n & ((x: number, y: number, z: number) => v3i)\n & ((xyz: number) => v3i)\n & (() => v3i)\n & ((v: AnyNumericVec3Instance) => v3i)\n & ((v0: AnyNumericVec2Instance, z: number) => v3i)\n & ((x: number, v0: AnyNumericVec2Instance) => v3i)\n > {\n readonly type: 'vec3i';\n readonly primitive: I32;\n readonly componentCount: 3;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: v3i;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n readonly [$validVertexSchema]: true;\n // ---\n}\n\n/**\n * Type of the `d.vec3u` object/function: vector data type schema/constructor\n */\nexport interface Vec3u extends\n BaseData,\n DualFn<\n & ((x: number, y: number, z: number) => v3u)\n & ((xyz: number) => v3u)\n & (() => v3u)\n & ((v: AnyNumericVec3Instance) => v3u)\n & ((v0: AnyNumericVec2Instance, z: number) => v3u)\n & ((x: number, v0: AnyNumericVec2Instance) => v3u)\n > {\n readonly type: 'vec3u';\n readonly primitive: U32;\n readonly componentCount: 3;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: v3u;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n readonly [$validVertexSchema]: true;\n // ---\n}\n\n/**\n * Type of the `d.vec3b` object/function: vector data type schema/constructor\n * Cannot be used inside buffers as it is not host-shareable.\n */\nexport interface Vec3b extends\n BaseData,\n DualFn<\n & ((x: boolean, y: boolean, z: boolean) => v3b)\n & ((xyz: boolean) => v3b)\n & (() => v3b)\n & ((v: v3b) => v3b)\n & ((v0: v2b, z: boolean) => v3b)\n & ((x: boolean, v0: v2b) => v3b)\n > {\n readonly type: 'vec3<bool>';\n readonly primitive: Bool;\n readonly componentCount: 3;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: v3b;\n readonly [$invalidSchemaReason]:\n 'Boolean vectors is not host-shareable, use numeric vectors instead';\n // ---\n}\n\n/**\n * Type of the `d.vec4f` object/function: vector data type schema/constructor\n */\nexport interface Vec4f extends\n BaseData,\n DualFn<\n & ((x: number, y: number, z: number, w: number) => v4f)\n & ((xyzw: number) => v4f)\n & (() => v4f)\n & ((v: AnyNumericVec4Instance) => v4f)\n & ((v0: AnyNumericVec3Instance, w: number) => v4f)\n & ((x: number, v0: AnyNumericVec3Instance) => v4f)\n & ((v0: AnyNumericVec2Instance, v1: AnyNumericVec2Instance) => v4f)\n & ((v0: AnyNumericVec2Instance, z: number, w: number) => v4f)\n & ((x: number, v0: AnyNumericVec2Instance, z: number) => v4f)\n & ((x: number, y: number, v0: AnyNumericVec2Instance) => v4f)\n > {\n readonly type: 'vec4f';\n readonly primitive: F32;\n readonly componentCount: 4;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: v4f;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n readonly [$validVertexSchema]: true;\n // ---\n}\n\n/**\n * Type of the `d.vec4h` object/function: vector data type schema/constructor\n */\nexport interface Vec4h extends\n BaseData,\n DualFn<\n & ((x: number, y: number, z: number, w: number) => v4h)\n & ((xyzw: number) => v4h)\n & (() => v4h)\n & ((v: AnyNumericVec4Instance) => v4h)\n & ((v0: AnyNumericVec3Instance, w: number) => v4h)\n & ((x: number, v0: AnyNumericVec3Instance) => v4h)\n & ((v0: AnyNumericVec2Instance, v1: AnyNumericVec2Instance) => v4h)\n & ((v0: AnyNumericVec2Instance, z: number, w: number) => v4h)\n & ((x: number, v0: AnyNumericVec2Instance, z: number) => v4h)\n & ((x: number, y: number, v0: AnyNumericVec2Instance) => v4h)\n > {\n readonly type: 'vec4h';\n readonly primitive: F16;\n readonly componentCount: 4;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: v4h;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n readonly [$validVertexSchema]: true;\n // ---\n}\n\n/**\n * Type of the `d.vec4i` object/function: vector data type schema/constructor\n */\nexport interface Vec4i extends\n BaseData,\n DualFn<\n & ((x: number, y: number, z: number, w: number) => v4i)\n & ((xyzw: number) => v4i)\n & (() => v4i)\n & ((v: AnyNumericVec4Instance) => v4i)\n & ((v0: AnyNumericVec3Instance, w: number) => v4i)\n & ((x: number, v0: AnyNumericVec3Instance) => v4i)\n & ((v0: AnyNumericVec2Instance, v1: AnyNumericVec2Instance) => v4i)\n & ((v0: AnyNumericVec2Instance, z: number, w: number) => v4i)\n & ((x: number, v0: AnyNumericVec2Instance, z: number) => v4i)\n & ((x: number, y: number, v0: AnyNumericVec2Instance) => v4i)\n > {\n readonly type: 'vec4i';\n readonly primitive: I32;\n readonly componentCount: 4;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: v4i;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n readonly [$validVertexSchema]: true;\n // ---\n}\n\n/**\n * Type of the `d.vec4u` object/function: vector data type schema/constructor\n */\nexport interface Vec4u extends\n BaseData,\n DualFn<\n & ((x: number, y: number, z: number, w: number) => v4u)\n & ((xyzw: number) => v4u)\n & (() => v4u)\n & ((v: AnyNumericVec4Instance) => v4u)\n & ((v0: AnyNumericVec3Instance, w: number) => v4u)\n & ((x: number, v0: AnyNumericVec3Instance) => v4u)\n & ((v0: AnyNumericVec2Instance, v1: AnyNumericVec2Instance) => v4u)\n & ((v0: AnyNumericVec2Instance, z: number, w: number) => v4u)\n & ((x: number, v0: AnyNumericVec2Instance, z: number) => v4u)\n & ((x: number, y: number, v0: AnyNumericVec2Instance) => v4u)\n > {\n readonly type: 'vec4u';\n readonly primitive: U32;\n readonly componentCount: 4;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: v4u;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n readonly [$validVertexSchema]: true;\n // ---\n}\n\n/**\n * Type of the `d.vec4b` object/function: vector data type schema/constructor\n * Cannot be used inside buffers as it is not host-shareable.\n */\nexport interface Vec4b extends\n BaseData,\n DualFn<\n & ((x: boolean, y: boolean, z: boolean, w: boolean) => v4b)\n & ((xyzw: boolean) => v4b)\n & (() => v4b)\n & ((v: v4b) => v4b)\n & ((v0: v3b, w: boolean) => v4b)\n & ((x: boolean, v0: v3b) => v4b)\n & ((v0: v2b, v1: v2b) => v4b)\n & ((v0: v2b, z: boolean, w: boolean) => v4b)\n & ((x: boolean, v0: v2b, z: boolean) => v4b)\n & ((x: boolean, y: boolean, v0: v2b) => v4b)\n > {\n readonly type: 'vec4<bool>';\n readonly primitive: Bool;\n readonly componentCount: 4;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: v4b;\n readonly [$invalidSchemaReason]:\n 'Boolean vectors is not host-shareable, use numeric vectors instead';\n // ---\n}\n\n/**\n * Type of the `d.mat2x2f` object/function: matrix data type schema/constructor\n */\nexport interface Mat2x2f extends BaseData {\n readonly type: 'mat2x2f';\n readonly primitive: F32;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: m2x2f;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n // ---\n\n (...elements: [number, number, number, number]): m2x2f;\n (...columns: [v2f, v2f]): m2x2f;\n (): m2x2f;\n identity(): m2x2f;\n}\n\n/**\n * Type of the `d.mat3x3f` object/function: matrix data type schema/constructor\n */\nexport interface Mat3x3f extends BaseData {\n readonly type: 'mat3x3f';\n readonly primitive: F32;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: m3x3f;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n // ---\n\n // deno-fmt-ignore\n (...elements: [number, number, number, number, number, number, number, number, number]): m3x3f;\n (...columns: [v3f, v3f, v3f]): m3x3f;\n (): m3x3f;\n identity(): m3x3f;\n}\n\n/**\n * Type of the `d.mat4x4f` object/function: matrix data type schema/constructor\n */\nexport interface Mat4x4f extends BaseData {\n readonly type: 'mat4x4f';\n readonly primitive: F32;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: m4x4f;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n // ---\n\n // deno-fmt-ignore\n (...elements: [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number]): m4x4f;\n (...columns: [v4f, v4f, v4f, v4f]): m4x4f;\n (): m4x4f;\n identity(): m4x4f;\n translation(vec: v3f): m4x4f;\n scaling(vec: v3f): m4x4f;\n rotationX(angle: number): m4x4f;\n rotationY(angle: number): m4x4f;\n rotationZ(angle: number): m4x4f;\n}\n\n/**\n * Array schema constructed via `d.arrayOf` function.\n *\n * Responsible for handling reading and writing array values\n * between binary and JS representation. Takes into account\n * the `byteAlignment` requirement of its elementType.\n */\n// We restrict the element type to being BaseData, which is the widest type\n// we can use internally to work with generic arrays. The default type of\n// `AnyWgslData` is the best choice for end-users.\nexport interface WgslArray<out TElement extends BaseData = BaseData>\n extends BaseData {\n <T extends TElement>(elements: Infer<T>[]): Infer<T>[];\n (): Infer<TElement>[];\n readonly type: 'array';\n readonly elementCount: number;\n readonly elementType: TElement;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: Infer<TElement>[];\n readonly [$gpuRepr]: InferGPU<TElement>[];\n readonly [$reprPartial]:\n | { idx: number; value: InferPartial<TElement> }[]\n | undefined;\n readonly [$memIdent]: WgslArray<MemIdentity<TElement>>;\n readonly [$validStorageSchema]: IsValidStorageSchema<TElement>;\n readonly [$validUniformSchema]: IsValidUniformSchema<TElement>;\n readonly [$validVertexSchema]: IsValidVertexSchema<TElement>;\n readonly [$invalidSchemaReason]:\n `in array element — ${ExtractInvalidSchemaError<TElement>}`;\n // ---\n}\n\n/**\n * Struct schema constructed via `d.struct` function.\n *\n * Responsible for handling reading and writing struct values\n * between binary and JS representation. Takes into account\n * the `byteAlignment` requirement of its members.\n */\nexport interface WgslStruct<\n // We restrict the type to being Record<string, BaseData>, which is the widest type\n // we can use internally to work with generic structs.\n // @ts-expect-error: Override variance, as we want structs to behave like objects\n out TProps extends Record<string, BaseData> = Record<string, BaseData>,\n> extends BaseData, TgpuNamable {\n readonly [$internal]: {\n isAbstruct: boolean;\n };\n readonly type: 'struct';\n readonly propTypes: TProps;\n\n (props: Prettify<InferRecord<TProps>>): Prettify<InferRecord<TProps>>;\n (): Prettify<InferRecord<TProps>>;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: Prettify<InferRecord<TProps>>;\n readonly [$gpuRepr]: Prettify<InferGPURecord<TProps>>;\n readonly [$memIdent]: WgslStruct<Prettify<MemIdentityRecord<TProps>>>;\n readonly [$reprPartial]:\n | Prettify<Partial<InferPartialRecord<TProps>>>\n | undefined;\n readonly [$invalidSchemaReason]: SwapNever<\n {\n [K in keyof TProps]: ExtractInvalidSchemaError<\n TProps[K],\n `in struct property '${K & string}' — `\n >;\n }[keyof TProps],\n undefined\n >;\n readonly [$validStorageSchema]: {\n [K in keyof TProps]: IsValidStorageSchema<TProps[K]>;\n }[keyof TProps] extends true ? true : false;\n readonly [$validUniformSchema]: {\n [K in keyof TProps]: IsValidUniformSchema<TProps[K]>;\n }[keyof TProps] extends true ? true : false;\n readonly [$validVertexSchema]: {\n [K in keyof TProps]: IsValidVertexSchema<TProps[K]>;\n }[keyof TProps] extends true ? true : false;\n // ---\n}\n\n/** @deprecated Just use `WgslStruct` without any type parameters */\nexport type AnyWgslStruct = WgslStruct;\n\nexport type AddressSpace =\n | 'uniform'\n | 'storage'\n | 'workgroup'\n | 'private'\n | 'function'\n | 'handle';\nexport type Access = 'read' | 'write' | 'read-write';\n\nexport interface Ptr<\n TAddr extends AddressSpace = AddressSpace,\n TInner extends BaseData = BaseData,\n TAccess extends Access = Access,\n> extends BaseData {\n readonly type: 'ptr';\n readonly inner: TInner;\n readonly addressSpace: TAddr;\n readonly access: TAccess;\n readonly implicit: boolean;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: ref<Infer<TInner>>;\n readonly [$invalidSchemaReason]: 'Pointers are not host-shareable';\n // ---\n}\n\n/**\n * Schema representing the `atomic<...>` WGSL data type.\n */\nexport interface Atomic<TInner extends U32 | I32 = U32 | I32> extends BaseData {\n readonly type: 'atomic';\n readonly inner: TInner;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: Infer<TInner>;\n readonly [$gpuRepr]: TInner extends U32 ? atomicU32 : atomicI32;\n readonly [$memIdent]: MemIdentity<TInner>;\n readonly [$validStorageSchema]: true;\n readonly [$validUniformSchema]: true;\n readonly [$validVertexSchema]: true;\n // ---\n}\n\nexport interface atomicU32 {\n readonly [$internal]: true;\n readonly type: 'atomicU32';\n}\n\nexport interface atomicI32 {\n readonly [$internal]: true;\n readonly type: 'atomicI32';\n}\n\nexport interface Align<T extends number> {\n readonly [$internal]: true;\n readonly type: '@align';\n readonly params: [T];\n}\n\nexport interface Size<T extends number> {\n readonly [$internal]: true;\n readonly type: '@size';\n readonly params: [T];\n}\n\nexport interface Location<T extends number = number> {\n readonly [$internal]: true;\n readonly type: '@location';\n readonly params: [T];\n}\n\nexport type PerspectiveOrLinearInterpolationType = `${\n | 'perspective'\n | 'linear'}${'' | ', center' | ', centroid' | ', sample'}`;\nexport type FlatInterpolationType = `flat${'' | ', first' | ', either'}`;\nexport type InterpolationType =\n | PerspectiveOrLinearInterpolationType\n | FlatInterpolationType;\n\nexport interface Interpolate<T extends InterpolationType = InterpolationType> {\n readonly [$internal]: true;\n readonly type: '@interpolate';\n readonly params: [T];\n}\n\nexport interface Builtin<T extends string> {\n readonly [$internal]: true;\n readonly type: '@builtin';\n readonly params: [T];\n}\n\nexport interface Invariant {\n readonly [$internal]: true;\n readonly type: '@invariant';\n readonly params: [];\n}\n\nexport interface Decorated<\n out TInner extends BaseData = BaseData,\n out TAttribs extends unknown[] = unknown[],\n> extends BaseData {\n readonly type: 'decorated';\n readonly inner: TInner;\n readonly attribs: TAttribs;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: Infer<TInner>;\n readonly [$gpuRepr]: InferGPU<TInner>;\n readonly [$reprPartial]: InferPartial<TInner>;\n readonly [$memIdent]: TAttribs extends Location[]\n ? MemIdentity<TInner> | Decorated<MemIdentity<TInner>, TAttribs>\n : Decorated<MemIdentity<TInner>, TAttribs>;\n readonly [$validStorageSchema]: IsValidStorageSchema<TInner>;\n readonly [$validUniformSchema]: IsValidUniformSchema<TInner>;\n readonly [$validVertexSchema]: IsValidVertexSchema<TInner>;\n readonly [$invalidSchemaReason]: ExtractInvalidSchemaError<TInner>;\n // ---\n}\n\nexport const wgslTypeLiterals = [\n 'bool',\n 'f32',\n 'f16',\n 'i32',\n 'u32',\n 'u16',\n 'vec2f',\n 'vec2h',\n 'vec2i',\n 'vec2u',\n 'vec2<bool>',\n 'vec3f',\n 'vec3h',\n 'vec3i',\n 'vec3u',\n 'vec3<bool>',\n 'vec4f',\n 'vec4h',\n 'vec4i',\n 'vec4u',\n 'vec4<bool>',\n 'mat2x2f',\n 'mat3x3f',\n 'mat4x4f',\n 'struct',\n 'array',\n 'ptr',\n 'atomic',\n 'decorated',\n 'abstractInt',\n 'abstractFloat',\n 'void',\n 'texture_1d',\n 'texture_storage_1d',\n 'texture_2d',\n 'texture_storage_2d',\n 'texture_multisampled_2d',\n 'texture_depth_2d',\n 'texture_depth_multisampled_2d',\n 'texture_2d_array',\n 'texture_storage_2d_array',\n 'texture_depth_2d_array',\n 'texture_cube',\n 'texture_depth_cube',\n 'texture_cube_array',\n 'texture_depth_cube_array',\n 'texture_3d',\n 'texture_storage_3d',\n 'texture_external',\n 'sampler',\n 'sampler_comparison',\n] as const;\n\nexport type WgslTypeLiteral = (typeof wgslTypeLiterals)[number];\nexport type IsWgslData<T> = T extends { readonly type: WgslTypeLiteral } ? true\n : false;\n\nexport type PerspectiveOrLinearInterpolatableBaseType =\n | F32\n | F16\n | Vec2f\n | Vec2h\n | Vec3f\n | Vec3h\n | Vec4f\n | Vec4h;\n\nexport type PerspectiveOrLinearInterpolatableData =\n | PerspectiveOrLinearInterpolatableBaseType\n | Decorated<PerspectiveOrLinearInterpolatableBaseType>;\n\nexport type FlatInterpolatableAdditionalBaseType =\n | I32\n | U32\n | Vec2i\n | Vec2u\n | Vec3i\n | Vec3u\n | Vec4i\n | Vec4u;\n\nexport type FlatInterpolatableData =\n | PerspectiveOrLinearInterpolatableData\n | FlatInterpolatableAdditionalBaseType\n | Decorated<FlatInterpolatableAdditionalBaseType>;\n\nexport type TextureSampleTypes =\n | F32\n | I32\n | U32;\n\nexport type ScalarData =\n | Bool\n | F32\n | F16\n | I32\n | U32\n | AbstractInt\n | AbstractFloat;\n\nexport type VecData =\n | Vec2f\n | Vec2h\n | Vec2i\n | Vec2u\n | Vec2b\n | Vec3f\n | Vec3h\n | Vec3i\n | Vec3u\n | Vec3b\n | Vec4f\n | Vec4h\n | Vec4i\n | Vec4u\n | Vec4b;\n\nexport type MatData =\n | Mat2x2f\n | Mat3x3f\n | Mat4x4f;\n\nexport type StorableData =\n | ScalarData\n | VecData\n | MatData\n | Atomic<I32>\n | Atomic<U32>\n | WgslArray\n | WgslStruct;\n\nexport type AnyFloat32VecData = Vec2f | Vec3f | Vec4f;\n\nexport type AnyFloat16VecData = Vec2h | Vec3h | Vec4h;\n\nexport type AnyWgslData =\n | Bool\n | F32\n | F16\n | I32\n | U32\n | U16\n | Vec2f\n | Vec2h\n | Vec2i\n | Vec2u\n | Vec2b\n | Vec3f\n | Vec3h\n | Vec3i\n | Vec3u\n | Vec3b\n | Vec4f\n | Vec4h\n | Vec4i\n | Vec4u\n | Vec4b\n | Mat2x2f\n | Mat3x3f\n | Mat4x4f\n | WgslStruct\n | WgslArray\n | Ptr\n | Atomic<U32>\n | Atomic<I32>\n | Decorated\n | AbstractInt\n | AbstractFloat\n | Void\n | WgslTexture\n | WgslStorageTexture\n | WgslExternalTexture\n | WgslSampler\n | WgslComparisonSampler;\n\n// #endregion\n\nexport function isVecInstance(value: unknown): value is AnyVecInstance {\n const v = value as AnyVecInstance | undefined;\n return isMarkedInternal(v) &&\n typeof v.kind === 'string' &&\n v.kind.startsWith('vec');\n}\n\nexport function isVec2(value: unknown): value is Vec2f | Vec2h | Vec2i | Vec2u {\n const v = value as AnyWgslData | undefined;\n return isMarkedInternal(v) &&\n typeof v.type === 'string' &&\n v.type.startsWith('vec2');\n}\n\nexport function isVec3(value: unknown): value is Vec3f | Vec3h | Vec3i | Vec3u {\n const v = value as AnyWgslData | undefined;\n return isMarkedInternal(v) &&\n typeof v.type === 'string' &&\n v.type.startsWith('vec3');\n}\n\nexport function isVec4(value: unknown): value is Vec4f | Vec4h | Vec4i | Vec4u {\n const v = value as AnyWgslData | undefined;\n return isMarkedInternal(v) &&\n typeof v.type === 'string' &&\n v.type.startsWith('vec4');\n}\n\nexport function isVec(\n value: unknown,\n): value is\n | Vec2f\n | Vec2h\n | Vec2i\n | Vec2u\n | Vec2b\n | Vec3f\n | Vec3h\n | Vec3i\n | Vec3u\n | Vec3b\n | Vec4f\n | Vec4h\n | Vec4i\n | Vec4u\n | Vec4b {\n return isVec2(value) || isVec3(value) || isVec4(value);\n}\n\nexport function isVecBool(\n value: unknown,\n): value is\n | Vec2b\n | Vec3b\n | Vec4b {\n return isVec(value) && value.type.includes('b');\n}\n\nexport function isMatInstance(value: unknown): value is AnyMatInstance {\n const v = value as AnyMatInstance | undefined;\n return isMarkedInternal(v) &&\n typeof v.kind?.startsWith === 'function' &&\n v.kind.startsWith('mat');\n}\n\nexport function isMat2x2f(value: unknown): value is Mat2x2f {\n return (\n isMarkedInternal(value) &&\n (value as AnyWgslData)?.type === 'mat2x2f'\n );\n}\n\nexport function isMat3x3f(value: unknown): value is Mat3x3f {\n return (\n isMarkedInternal(value) &&\n (value as AnyWgslData)?.type === 'mat3x3f'\n );\n}\n\nexport function isMat4x4f(value: unknown): value is Mat4x4f {\n return (\n isMarkedInternal(value) &&\n (value as AnyWgslData)?.type === 'mat4x4f'\n );\n}\n\nexport function isMat(value: unknown): value is Mat2x2f | Mat3x3f | Mat4x4f {\n return isMat2x2f(value) || isMat3x3f(value) || isMat4x4f(value);\n}\n\nexport function isFloat32VecInstance(\n element: number | AnyVecInstance | AnyMatInstance,\n): element is AnyFloat32VecInstance {\n return isVecInstance(element) &&\n ['vec2f', 'vec3f', 'vec4f'].includes(element.kind);\n}\n\nexport function isWgslData(value: unknown): value is AnyWgslData {\n return (\n isMarkedInternal(value) &&\n wgslTypeLiterals.includes((value as AnyWgslData)?.type)\n );\n}\n\n/**\n * Checks whether passed in value is an array schema,\n * as opposed to, e.g., a disarray schema.\n *\n * Array schemas can be used to describe uniform and storage buffers,\n * whereas disarray schemas cannot.\n *\n * @example\n * isWgslArray(d.arrayOf(d.u32, 4)) // true\n * isWgslArray(d.disarray(d.u32, 4)) // false\n * isWgslArray(d.vec3f) // false\n */\nexport function isWgslArray(schema: unknown): schema is WgslArray {\n return isMarkedInternal(schema) && (schema as WgslArray)?.type === 'array';\n}\n\n/**\n * Checks whether passed in value is a struct schema,\n * as opposed to, e.g., an unstruct schema.\n *\n * Struct schemas can be used to describe uniform and storage buffers,\n * whereas unstruct schemas cannot.\n *\n * @example\n * isWgslStruct(d.struct({ a: d.u32 })) // true\n * isWgslStruct(d.unstruct({ a: d.u32 })) // false\n * isWgslStruct(d.vec3f) // false\n */\nexport function isWgslStruct(\n schema: unknown,\n): schema is WgslStruct {\n return isMarkedInternal(schema) && (schema as WgslStruct)?.type === 'struct';\n}\n\n/**\n * Checks whether passed in value is a pointer schema.\n *\n * @example\n * isPtr(d.ptrFn(d.f32)) // true\n * isPtr(d.ptrPrivate(d.f32)) // true\n * isPtr(d.f32) // false\n */\nexport function isPtr(schema: unknown): schema is Ptr {\n return isMarkedInternal(schema) && (schema as Ptr)?.type === 'ptr';\n}\n\n/**\n * Checks whether the passed in value is an atomic schema.\n *\n * @example\n * isAtomic(d.atomic(d.u32)) // true\n * isAtomic(d.u32) // false\n */\nexport function isAtomic(schema: unknown): schema is Atomic {\n return isMarkedInternal(schema) && (schema as Atomic)?.type === 'atomic';\n}\n\nexport function isAlignAttrib<T extends number>(\n value: unknown,\n): value is Align<T> {\n return isMarkedInternal(value) && (value as Align<T>)?.type === '@align';\n}\n\nexport function isSizeAttrib<T extends number>(\n value: unknown,\n): value is Size<T> {\n return isMarkedInternal(value) && (value as Size<T>)?.type === '@size';\n}\n\nexport function isLocationAttrib<T extends number>(\n value: unknown,\n): value is Location<T> {\n return isMarkedInternal(value) &&\n (value as Location<T>)?.type === '@location';\n}\n\nexport function isInterpolateAttrib<T extends InterpolationType>(\n value: unknown,\n): value is Interpolate<T> {\n return isMarkedInternal(value) &&\n (value as Interpolate<T>)?.type === '@interpolate';\n}\nexport function isBuiltinAttrib(\n value: unknown,\n): value is Builtin<string> {\n return isMarkedInternal(value) &&\n (value as Builtin<string>)?.type === '@builtin';\n}\n\nexport function isInvariantAttrib(\n value: unknown,\n): value is Invariant {\n return isMarkedInternal(value) &&\n (value as Invariant)?.type === '@invariant';\n}\n\nexport function isDecorated(\n value: unknown,\n): value is Decorated {\n return isMarkedInternal(value) && (value as Decorated)?.type === 'decorated';\n}\n\nexport function isAbstractFloat(value: unknown): value is AbstractFloat {\n return (\n isMarkedInternal(value) &&\n (value as AbstractFloat).type === 'abstractFloat'\n );\n}\n\nexport function isAbstractInt(value: unknown): value is AbstractInt {\n return (\n isMarkedInternal(value) &&\n (value as AbstractInt).type === 'abstractInt'\n );\n}\n\nexport function isAbstract(\n value: unknown,\n): value is AbstractFloat | AbstractInt {\n return isAbstractFloat(value) || isAbstractInt(value);\n}\n\nexport function isConcrete(value: unknown): boolean {\n return !isAbstract(value);\n}\n\nexport function isVoid(value: unknown): value is Void {\n return isMarkedInternal(value) && (value as Void).type === 'void';\n}\n\nexport function isNumericSchema(\n schema: unknown,\n): schema is AbstractInt | AbstractFloat | F32 | F16 | I32 | U32 {\n const type = (schema as BaseData)?.type;\n\n return (\n isMarkedInternal(schema) &&\n (type === 'abstractInt' ||\n type === 'abstractFloat' ||\n type === 'f32' ||\n type === 'f16' ||\n type === 'i32' ||\n type === 'u32')\n );\n}\n\nexport function isHalfPrecisionSchema(\n schema: unknown,\n): schema is F16 | Vec2h | Vec3h | Vec4h {\n const type = (schema as BaseData)?.type;\n\n return (\n isMarkedInternal(schema) &&\n (type === 'f16' ||\n type === 'vec2h' ||\n type === 'vec3h' ||\n type === 'vec4h')\n );\n}\n\nconst ephemeralTypes = [\n 'abstractInt',\n 'abstractFloat',\n 'f32',\n 'f16',\n 'i32',\n 'u32',\n 'bool',\n];\n\n/**\n * Returns true for schemas that are not naturally referential in JS (primitives).\n * @param schema\n * @returns\n */\nexport function isNaturallyEphemeral(schema: unknown): boolean {\n return (\n !isMarkedInternal(schema) ||\n ephemeralTypes.includes((schema as BaseData)?.type)\n );\n}\n\nexport function WORKAROUND_getSchema<T extends AnyVecInstance | AnyMatInstance>(\n vec: T,\n): VecData | MatData {\n // TODO: Remove workaround\n // it's a workaround for circular dependencies caused by us using schemas in the shader generator\n // these schema properties are assigned on the prototype of vector and matrix instances\n // oxlint-disable-next-line typescript/no-explicit-any explained above\n return (vec as any).schema;\n}\n","import { setName, type TgpuNamable } from '../shared/meta.ts';\nimport { isMarkedInternal } from '../shared/symbols.ts';\nimport type {\n Infer,\n InferGPURecord,\n InferPartial,\n InferPartialRecord,\n InferRecord,\n IsValidVertexSchema,\n MemIdentityRecord,\n} from '../shared/repr.ts';\nimport type {\n $gpuRepr,\n $invalidSchemaReason,\n $memIdent,\n $repr,\n $reprPartial,\n $validVertexSchema,\n} from '../shared/symbols.ts';\nimport { $internal } from '../shared/symbols.ts';\nimport type { Prettify } from '../shared/utilityTypes.ts';\nimport { vertexFormats } from '../shared/vertexFormat.ts';\nimport type {\n WgslExternalTexture,\n WgslStorageTexture,\n WgslTexture,\n} from './texture.ts';\nimport type { Snippet } from './snippet.ts';\nimport type { PackedData } from './vertexFormatData.ts';\nimport * as wgsl from './wgslTypes.ts';\nimport type { WgslComparisonSampler, WgslSampler } from './sampler.ts';\nimport type { ResolutionCtx } from '../types.ts';\nimport type { BaseData } from './wgslTypes.ts';\n\n/**\n * Array schema constructed via `d.disarrayOf` function.\n *\n * Useful for defining vertex buffers.\n * Elements in the schema are not aligned in respect to their `byteAlignment`,\n * unless they are explicitly decorated with the custom align attribute\n * via `d.align` function.\n */\nexport interface Disarray<out TElement extends wgsl.BaseData = wgsl.BaseData>\n extends wgsl.BaseData {\n <T extends TElement>(elements: Infer<T>[]): Infer<T>[];\n (): Infer<TElement>[];\n readonly type: 'disarray';\n readonly elementCount: number;\n readonly elementType: TElement;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: Infer<TElement>[];\n readonly [$reprPartial]:\n | { idx: number; value: InferPartial<TElement> }[]\n | undefined;\n readonly [$validVertexSchema]: IsValidVertexSchema<TElement>;\n readonly [$invalidSchemaReason]:\n 'Disarrays are not host-shareable, use arrays instead';\n // ---\n}\n\n/**\n * Struct schema constructed via `d.unstruct` function.\n *\n * Useful for defining vertex buffers, as the standard layout restrictions do not apply.\n * Members are not aligned in respect to their `byteAlignment`,\n * unless they are explicitly decorated with the custom align attribute\n * via `d.align` function.\n */\nexport interface Unstruct<\n // @ts-expect-error: Override variance, as we want unstructs to behave like objects\n out TProps extends Record<string, wgsl.BaseData> = Record<\n string,\n wgsl.BaseData\n >,\n> extends wgsl.BaseData, TgpuNamable {\n (props: Prettify<InferRecord<TProps>>): Prettify<InferRecord<TProps>>;\n (): Prettify<InferRecord<TProps>>;\n readonly type: 'unstruct';\n readonly propTypes: TProps;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: Prettify<InferRecord<TProps>>;\n readonly [$gpuRepr]: Prettify<InferGPURecord<TProps>>;\n readonly [$memIdent]: Unstruct<Prettify<MemIdentityRecord<TProps>>>;\n readonly [$reprPartial]:\n | Prettify<Partial<InferPartialRecord<TProps>>>\n | undefined;\n readonly [$validVertexSchema]: {\n [K in keyof TProps]: IsValidVertexSchema<TProps[K]>;\n }[keyof TProps] extends true ? true : false;\n readonly [$invalidSchemaReason]:\n 'Unstructs are not host-shareable, use structs instead';\n // ---\n}\n\n/** @deprecated Just use `Unstruct` without any type parameters */\nexport type AnyUnstruct = Unstruct;\n\nexport interface LooseDecorated<\n out TInner extends wgsl.BaseData = wgsl.BaseData,\n out TAttribs extends unknown[] = unknown[],\n> extends wgsl.BaseData {\n readonly type: 'loose-decorated';\n readonly inner: TInner;\n readonly attribs: TAttribs;\n\n // Type-tokens, not available at runtime\n readonly [$repr]: Infer<TInner>;\n readonly [$invalidSchemaReason]:\n 'Loosely decorated schemas are not host-shareable';\n readonly [$validVertexSchema]: IsValidVertexSchema<TInner>;\n // ---\n}\n\n/**\n * Type utility to extract the inner type from decorated types.\n */\nexport type Undecorate<T> = T extends {\n readonly type: 'decorated' | 'loose-decorated';\n readonly inner: infer TInner;\n} ? TInner\n : T;\n\n/**\n * Type utility to undecorate all values in a record.\n */\nexport type UndecorateRecord<T extends Record<string, unknown>> = {\n [Key in keyof T]: Undecorate<T[Key]>;\n};\n\n/**\n * Runtime function to extract the inner data type from decorated types.\n * If the data is not decorated, returns the data as-is.\n */\nexport function undecorate(data: BaseData): BaseData {\n if (wgsl.isDecorated(data) || isLooseDecorated(data)) {\n return data.inner;\n }\n return data;\n}\n\nexport function unptr(data: BaseData | UnknownData): BaseData | UnknownData {\n if (wgsl.isPtr(data)) {\n return data.inner;\n }\n return data;\n}\n\nconst looseTypeLiterals = [\n 'unstruct',\n 'disarray',\n 'loose-decorated',\n ...vertexFormats,\n] as const;\n\nexport type LooseTypeLiteral = (typeof looseTypeLiterals)[number];\nexport type IsLooseData<T> = T extends { readonly type: LooseTypeLiteral }\n ? true\n : false;\n\nexport type AnyLooseData = Disarray | Unstruct | LooseDecorated | PackedData;\n\nexport function isLooseData(data: unknown): data is AnyLooseData {\n return (\n isMarkedInternal(data) &&\n looseTypeLiterals.includes((data as AnyLooseData)?.type)\n );\n}\n\n/**\n * Checks whether the passed in value is a disarray schema,\n * as opposed to, e.g., a regular array schema.\n *\n * Array schemas can be used to describe uniform and storage buffers,\n * whereas disarray schemas cannot. Disarrays are useful for\n * defining vertex buffers instead.\n *\n * @example\n * isDisarray(d.arrayOf(d.u32, 4)) // false\n * isDisarray(d.disarrayOf(d.u32, 4)) // true\n * isDisarray(d.vec3f) // false\n */\nexport function isDisarray(schema: unknown): schema is Disarray {\n return isMarkedInternal(schema) && (schema as Disarray)?.type === 'disarray';\n}\n\n/**\n * Checks whether passed in value is a unstruct schema,\n * as opposed to, e.g., a struct schema.\n *\n * Struct schemas can be used to describe uniform and storage buffers,\n * whereas unstruct schemas cannot. Unstructs are useful for\n * defining vertex buffers instead.\n *\n * @example\n * isUnstruct(d.struct({ a: d.u32 })) // false\n * isUnstruct(d.unstruct({ a: d.u32 })) // true\n * isUnstruct(d.vec3f) // false\n */\nexport function isUnstruct(schema: unknown): schema is Unstruct {\n return isMarkedInternal(schema) && (schema as Unstruct)?.type === 'unstruct';\n}\n\nexport function isLooseDecorated(\n value: unknown,\n): value is LooseDecorated {\n return isMarkedInternal(value) &&\n (value as LooseDecorated)?.type === 'loose-decorated';\n}\n\nexport function getCustomAlignment(data: wgsl.BaseData): number | undefined {\n return (data as unknown as wgsl.Decorated | LooseDecorated).attribs?.find(\n wgsl.isAlignAttrib,\n )?.params[0];\n}\n\nexport function getCustomSize(data: wgsl.BaseData): number | undefined {\n return (data as unknown as wgsl.Decorated | LooseDecorated).attribs?.find(\n wgsl.isSizeAttrib,\n )?.params[0];\n}\n\nexport function getCustomLocation(data: wgsl.BaseData): number | undefined {\n return (data as unknown as wgsl.Decorated | LooseDecorated).attribs?.find(\n wgsl.isLocationAttrib,\n )?.params[0];\n}\n\nexport function isData(value: unknown): value is AnyData {\n return wgsl.isWgslData(value) || isLooseData(value);\n}\n\nexport type AnyData = wgsl.AnyWgslData | AnyLooseData;\nexport type AnyConcreteData = Exclude<\n AnyData,\n | wgsl.AbstractInt\n | wgsl.AbstractFloat\n | wgsl.Void\n | WgslTexture\n | WgslStorageTexture\n | WgslExternalTexture\n | WgslSampler\n | WgslComparisonSampler\n>;\n\nexport const UnknownData = Symbol('UNKNOWN');\nexport type UnknownData = typeof UnknownData;\n\nexport class InfixDispatch {\n constructor(\n readonly name: string,\n readonly lhs: Snippet,\n readonly operator: (\n ctx: ResolutionCtx,\n args: [lhs: Snippet, rhs: Snippet],\n ) => Snippet,\n ) {}\n}\n\nexport class MatrixColumnsAccess {\n constructor(\n readonly matrix: Snippet,\n ) {}\n}\n\nexport class ConsoleLog {\n [$internal] = true;\n constructor(readonly op: string) {\n setName(this, 'consoleLog');\n }\n}\n","import { undecorate } from './dataTypes.ts';\nimport type { UnknownData } from './dataTypes.ts';\nimport { DEV } from '../shared/env.ts';\nimport { type BaseData, isNumericSchema } from './wgslTypes.ts';\n\nexport type Origin =\n | 'uniform'\n | 'readonly' // equivalent to ptr<storage, ..., read>\n | 'mutable' // equivalent to ptr<storage, ..., read-write>\n | 'workgroup'\n | 'private'\n | 'function'\n | 'this-function'\n | 'handle'\n // is an argument (or part of an argument) given to the\n // function we're resolving. This includes primitives, to\n // catch cases where we update an argument's primitive member\n // prop, e.g.: `vec.x += 1;`\n | 'argument'\n // not a ref to anything, known at runtime\n | 'runtime'\n // not a ref to anything, known at pipeline creation time\n // (not to be confused with 'comptime')\n // note that this doesn't automatically mean the value can be stored in a `const`\n // variable, more so that it's valid to do so in WGSL (but not necessarily safe to do in JS shaders)\n | 'constant'\n // don't even get me started on these. They're references to non-primitive values that originate\n // from a tgpu.const(...).$ call.\n | 'constant-tgpu-const-ref' /* turns into a `const` when assigned to a variable */\n | 'runtime-tgpu-const-ref' /* turns into a `let` when assigned to a variable */;\n\nexport function isEphemeralOrigin(space: Origin) {\n return space === 'runtime' || space === 'constant' || space === 'argument';\n}\n\nexport function isEphemeralSnippet(snippet: Snippet) {\n return isEphemeralOrigin(snippet.origin);\n}\n\nexport const originToPtrParams = {\n uniform: { space: 'uniform', access: 'read' },\n readonly: { space: 'storage', access: 'read' },\n mutable: { space: 'storage', access: 'read-write' },\n workgroup: { space: 'workgroup', access: 'read-write' },\n private: { space: 'private', access: 'read-write' },\n function: { space: 'function', access: 'read-write' },\n 'this-function': { space: 'function', access: 'read-write' },\n} as const;\nexport type OriginToPtrParams = typeof originToPtrParams;\n\nexport interface Snippet {\n readonly value: unknown;\n /**\n * The type that `value` is assignable to (not necessary exactly inferred as).\n * E.g. `1.1` is assignable to `f32`, but `1.1` itself is an abstract float\n */\n readonly dataType: BaseData | UnknownData;\n readonly origin: Origin;\n}\n\nexport interface ResolvedSnippet {\n readonly value: string;\n /**\n * The type that `value` is assignable to (not necessary exactly inferred as).\n * E.g. `1.1` is assignable to `f32`, but `1.1` itself is an abstract float\n */\n readonly dataType: BaseData;\n readonly origin: Origin;\n}\n\nexport type MapValueToSnippet<T> = { [K in keyof T]: Snippet };\n\nclass SnippetImpl implements Snippet {\n constructor(\n readonly value: unknown,\n readonly dataType: BaseData | UnknownData,\n readonly origin: Origin,\n ) {}\n}\n\nexport function isSnippet(value: unknown): value is Snippet {\n return value instanceof SnippetImpl;\n}\n\nexport function isSnippetNumeric(snippet: Snippet) {\n return isNumericSchema(snippet.dataType);\n}\n\nexport function snip(\n value: string,\n dataType: BaseData,\n origin: Origin,\n): ResolvedSnippet;\nexport function snip(\n value: unknown,\n dataType: BaseData | UnknownData,\n origin: Origin,\n): Snippet;\nexport function snip(\n value: unknown,\n dataType: BaseData | UnknownData,\n origin: Origin,\n): Snippet | ResolvedSnippet {\n if (DEV && isSnippet(value)) {\n // An early error, but not worth checking every time in production\n throw new Error('Cannot nest snippets');\n }\n\n return new SnippetImpl(\n value,\n // We don't care about attributes in snippet land, so we discard that information.\n undecorate(dataType as BaseData),\n origin,\n );\n}\n","import type { TgpuBuffer } from './core/buffer/buffer.ts';\nimport type { TgpuSlot } from './core/slot/slotTypes.ts';\nimport type { TgpuVertexLayout } from './core/vertexLayout/vertexLayout.ts';\nimport type { BaseData } from './data/wgslTypes.ts';\nimport { getName, hasTinyestMetadata } from './shared/meta.ts';\nimport { DEV, TEST } from './shared/env.ts';\nimport type { TgpuBindGroupLayout } from './tgpuBindGroupLayout.ts';\n\nconst prefix = 'Invariant failed';\n\n/**\n * Inspired by: https://github.com/alexreardon/tiny-invariant/blob/master/src/tiny-invariant.ts\n */\nexport function invariant(\n condition: unknown,\n message?: string | (() => string),\n): asserts condition {\n if (condition) {\n // Condition passed\n return;\n }\n\n // In production we strip the message but still throw\n if (!DEV && !TEST) {\n throw new Error(prefix);\n }\n\n // When not in production we allow the message to pass through\n // *This block will be removed in production builds*\n\n const provided = typeof message === 'function' ? message() : message;\n\n // Options:\n // 1. message provided: `${prefix}: ${provided}`\n // 2. message not provided: prefix\n const value = provided ? `${prefix}: ${provided}` : prefix;\n throw new Error(value);\n}\n\n/**\n * An error that happens during resolution of WGSL code.\n * Contains a trace of all ancestor resolvables in\n * which this error originated.\n *\n * @category Errors\n */\nexport class ResolutionError extends Error {\n constructor(\n public readonly cause: unknown,\n public readonly trace: unknown[],\n ) {\n let entries = trace.map((ancestor) =>\n `- ${\n hasTinyestMetadata(ancestor) ? `fn*:${getName(ancestor)}` : ancestor\n }`\n );\n\n // Showing only the root and leaf nodes.\n if (entries.length > 20) {\n entries = [...entries.slice(0, 11), '...', ...entries.slice(-10)];\n }\n\n super(\n `Resolution of the following tree failed:\\n${entries.join('\\n')}: ${\n cause && typeof cause === 'object' && 'message' in cause\n ? cause.message\n : cause\n }`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, ResolutionError.prototype);\n }\n\n appendToTrace(ancestor: unknown): ResolutionError {\n const newTrace = [ancestor, ...this.trace];\n\n return new ResolutionError(this.cause, newTrace);\n }\n}\n\n/**\n * An error that happens during execution of TypeGPU functions.\n * Contains a trace of all TypeGPU functions called along the way.\n *\n * @category Errors\n */\nexport class ExecutionError extends Error {\n constructor(\n public readonly cause: unknown,\n public readonly trace: unknown[],\n ) {\n let entries = trace.map((ancestor) => `- ${ancestor}`);\n\n // Showing only the root and leaf nodes.\n if (entries.length > 20) {\n entries = [...entries.slice(0, 11), '...', ...entries.slice(-10)];\n }\n\n super(\n `Execution of the following tree failed:\\n${entries.join('\\n')}: ${\n cause && typeof cause === 'object' && 'message' in cause\n ? cause.message\n : cause\n }`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, ExecutionError.prototype);\n }\n\n appendToTrace(ancestor: unknown): ExecutionError {\n const newTrace = [ancestor, ...this.trace];\n\n return new ExecutionError(this.cause, newTrace);\n }\n}\n\n/**\n * @category Errors\n */\nexport class MissingSlotValueError extends Error {\n constructor(public readonly slot: TgpuSlot<unknown>) {\n super(`Missing value for '${slot}'`);\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingSlotValueError.prototype);\n }\n}\n\n/**\n * @category Errors\n */\nexport class NotUniformError extends Error {\n constructor(value: TgpuBuffer<BaseData>) {\n super(\n `Buffer '${\n getName(value) ?? '<unnamed>'\n }' is not bindable as a uniform. Use .$usage('uniform') to allow it.`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, NotUniformError.prototype);\n }\n}\n\nexport class MissingLinksError extends Error {\n constructor(fnLabel: string | undefined, externalNames: string[]) {\n super(\n `The function '${\n fnLabel ?? '<unnamed>'\n }' is missing links to the following external values: ${externalNames}.`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingLinksError.prototype);\n }\n}\n\nexport class MissingBindGroupsError extends Error {\n constructor(layouts: Iterable<TgpuBindGroupLayout>) {\n super(\n `Missing bind groups for layouts: '${\n [...layouts].map((layout) => getName(layout) ?? '<unnamed>').join(', ')\n }'. Please provide it using pipeline.with(bindGroup).(...)`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingBindGroupsError.prototype);\n }\n}\n\nexport class MissingVertexBuffersError extends Error {\n constructor(layouts: Iterable<TgpuVertexLayout>) {\n super(\n `Missing vertex buffers for layouts: '${\n [...layouts].map((layout) => getName(layout) ?? '<unnamed>').join(', ')\n }'. Please provide it using pipeline.with(layout, buffer).(...)`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, MissingVertexBuffersError.prototype);\n }\n}\n\nexport class IllegalVarAccessError extends Error {\n constructor(msg: string) {\n super(msg);\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, IllegalVarAccessError.prototype);\n }\n}\n\nexport class IllegalBufferAccessError extends Error {\n constructor(msg: string) {\n super(msg);\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, IllegalBufferAccessError.prototype);\n }\n}\n\nexport class WgslTypeError extends Error {\n constructor(msg: string) {\n super(msg);\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, WgslTypeError.prototype);\n }\n}\n\nexport class SignatureNotSupportedError extends Error {\n constructor(actual: BaseData[], candidates: BaseData[]) {\n super(\n `Unsupported data types: ${\n actual.map((a) => a.type).join(', ')\n }. Supported types are: ${\n candidates\n .map((r) => r.type)\n .join(', ')\n }.`,\n );\n\n // Set the prototype explicitly.\n Object.setPrototypeOf(this, SignatureNotSupportedError.prototype);\n }\n}\n","import type { WgslStorageTexture, WgslTexture } from '../../data/texture.ts';\nimport type { BaseData } from '../../data/wgslTypes.ts';\nimport type { TgpuNamable } from '../../shared/meta.ts';\nimport type { GPUValueOf, Infer, InferGPU } from '../../shared/repr.ts';\nimport { $gpuValueOf, $internal, $providing } from '../../shared/symbols.ts';\nimport type { UnwrapRuntimeConstructor } from '../../tgpuBindGroupLayout.ts';\nimport type { TgpuBufferShorthand } from '../buffer/bufferShorthand.ts';\nimport type { TgpuBufferUsage } from './../buffer/bufferUsage.ts';\nimport type { TgpuConst } from '../constant/tgpuConstant.ts';\nimport type { Withable } from '../root/rootTypes.ts';\nimport type { TgpuTextureView } from '../texture/texture.ts';\nimport type { TgpuVar, VariableScope } from '../variable/tgpuVariable.ts';\n\nexport interface TgpuSlot<T> extends TgpuNamable {\n readonly [$internal]: true;\n readonly resourceType: 'slot';\n\n readonly defaultValue: T | undefined;\n\n /**\n * Used to determine if code generated using either value `a` or `b` in place\n * of the slot will be equivalent. Defaults to `Object.is`.\n */\n areEqual(a: T, b: T): boolean;\n\n readonly [$gpuValueOf]: GPUValueOf<T>;\n /**\n * @deprecated Use `.$` instead, works the same way.\n */\n readonly value: GPUValueOf<T>;\n readonly $: GPUValueOf<T>;\n toString(): string;\n}\n\nexport interface TgpuLazy<out T> extends Withable<TgpuLazy<T>> {\n readonly [$internal]: {\n compute(): T;\n };\n readonly resourceType: 'lazy';\n\n readonly [$gpuValueOf]: GPUValueOf<T>;\n /**\n * @deprecated Use `.$` instead, works the same way.\n */\n readonly value: GPUValueOf<T>;\n readonly $: GPUValueOf<T>;\n\n // Type-tokens, not available at runtime\n readonly [$providing]?: Providing | undefined;\n // ---\n}\n\nexport interface TgpuAccessor<T extends BaseData = BaseData>\n extends TgpuNamable {\n readonly [$internal]: true;\n readonly resourceType: 'accessor';\n\n readonly schema: T;\n readonly defaultValue: TgpuAccessor.In<T> | undefined;\n readonly slot: TgpuSlot<TgpuAccessor.In<T>>;\n\n readonly [$gpuValueOf]: InferGPU<T>;\n /**\n * @deprecated Use `.$` instead, works the same way.\n */\n readonly value: InferGPU<T>;\n readonly $: InferGPU<T>;\n}\n\ntype DataAccessorIn<T extends BaseData> =\n | (() => DataAccessorIn<T>)\n | TgpuBufferUsage<T>\n | TgpuBufferShorthand<T>\n | TgpuVar<VariableScope, T>\n | TgpuConst<T>\n | Infer<T>;\n\ntype TextureAccessorIn<T extends WgslTexture | WgslStorageTexture> =\n | (() => TextureAccessorIn<T>)\n | Infer<T>\n | TgpuTextureView<T>;\n\nexport declare namespace TgpuAccessor {\n type In<T extends BaseData | ((count: number) => BaseData)> =\n UnwrapRuntimeConstructor<T> extends WgslTexture | WgslStorageTexture\n ? TextureAccessorIn<UnwrapRuntimeConstructor<T>>\n : DataAccessorIn<UnwrapRuntimeConstructor<T>>;\n}\n\nexport interface TgpuMutableAccessor<T extends BaseData = BaseData>\n extends TgpuNamable {\n readonly [$internal]: true;\n readonly resourceType: 'mutable-accessor';\n\n readonly schema: T;\n readonly defaultValue: TgpuMutableAccessor.In<T> | undefined;\n readonly slot: TgpuSlot<TgpuMutableAccessor.In<T>>;\n\n readonly [$gpuValueOf]: InferGPU<T>;\n value: InferGPU<T>;\n $: InferGPU<T>;\n}\n\ntype MutableDataAccessorIn<T extends BaseData> =\n | (() => Infer<T> | MutableDataAccessorIn<T>)\n | TgpuBufferUsage<T>\n | TgpuBufferShorthand<T>\n | TgpuVar<VariableScope, T>;\n\ntype MutableTextureAccessorIn<T extends WgslTexture | WgslStorageTexture> =\n | (() => Infer<T> | TgpuTextureView<T> | MutableTextureAccessorIn<T>)\n | TgpuTextureView<T>;\n\nexport declare namespace TgpuMutableAccessor {\n type In<T extends BaseData | ((count: number) => BaseData)> =\n UnwrapRuntimeConstructor<T> extends WgslTexture | WgslStorageTexture\n ? MutableTextureAccessorIn<UnwrapRuntimeConstructor<T>>\n : MutableDataAccessorIn<UnwrapRuntimeConstructor<T>>;\n}\n\n/**\n * Represents a value that is available at resolution time.\n */\nexport type Eventual<T> = T | TgpuSlot<T> | TgpuLazy<T>;\n\nexport type SlotValuePair<T = unknown> = [TgpuSlot<T>, T];\n\nexport type Providing = {\n inner: object;\n pairs: SlotValuePair[];\n};\n\nexport function isSlot<T>(value: unknown): value is TgpuSlot<T> {\n return (value as TgpuSlot<T>)?.resourceType === 'slot';\n}\n\nexport function isLazy<T>(value: unknown): value is TgpuLazy<T> {\n return (value as TgpuLazy<T>)?.resourceType === 'lazy';\n}\n\nexport function isProviding(\n value: unknown,\n): value is { [$providing]: Providing } {\n return (value as { [$providing]: Providing })?.[$providing] !== undefined;\n}\n\nexport function isAccessor<T extends BaseData>(\n value: unknown,\n): value is TgpuAccessor<T> {\n return (value as TgpuAccessor<T>)?.resourceType === 'accessor';\n}\n\nexport function isMutableAccessor<T extends BaseData>(\n value: unknown,\n): value is TgpuMutableAccessor<T> {\n return (value as TgpuMutableAccessor<T>)?.resourceType === 'mutable-accessor';\n}\n","import type { Block, FuncParameter } from 'tinyest';\nimport type { TgpuBuffer } from './core/buffer/buffer.ts';\nimport type {\n TgpuBufferMutable,\n TgpuBufferReadonly,\n TgpuBufferUniform,\n TgpuBufferUsage,\n} from './core/buffer/bufferUsage.ts';\nimport type { TgpuConst } from './core/constant/tgpuConstant.ts';\nimport type { TgpuDeclare } from './core/declare/tgpuDeclare.ts';\nimport type { TgpuComputeFn } from './core/function/tgpuComputeFn.ts';\nimport type { TgpuFn } from './core/function/tgpuFn.ts';\nimport type { TgpuFragmentFn } from './core/function/tgpuFragmentFn.ts';\nimport type { TgpuVertexFn } from './core/function/tgpuVertexFn.ts';\nimport type { TgpuComputePipeline } from './core/pipeline/computePipeline.ts';\nimport type { TgpuRenderPipeline } from './core/pipeline/renderPipeline.ts';\nimport type { TgpuSampler } from './core/sampler/sampler.ts';\nimport {\n type Eventual,\n isLazy,\n isProviding,\n isSlot,\n type SlotValuePair,\n type TgpuAccessor,\n type TgpuSlot,\n} from './core/slot/slotTypes.ts';\nimport type { TgpuExternalTexture } from './core/texture/externalTexture.ts';\nimport type { TgpuTexture, TgpuTextureView } from './core/texture/texture.ts';\nimport type { TgpuVar } from './core/variable/tgpuVariable.ts';\nimport { type AnyData, UnknownData } from './data/dataTypes.ts';\nimport type {\n MapValueToSnippet,\n ResolvedSnippet,\n Snippet,\n} from './data/snippet.ts';\nimport {\n type AnyMatInstance,\n type AnyVecInstance,\n type BaseData,\n isWgslData,\n} from './data/wgslTypes.ts';\nimport {\n $cast,\n $gpuCallable,\n $gpuValueOf,\n $internal,\n $ownSnippet,\n $resolve,\n} from './shared/symbols.ts';\nimport type {\n TgpuBindGroupLayout,\n TgpuLayoutEntry,\n} from './tgpuBindGroupLayout.ts';\nimport type { WgslExtension } from './wgslExtensions.ts';\nimport type { Infer } from './shared/repr.ts';\n\nexport type ResolvableObject =\n | SelfResolvable\n | TgpuBufferUsage\n | TgpuConst\n | TgpuDeclare\n | TgpuBindGroupLayout\n | TgpuFn\n | TgpuComputeFn\n | TgpuFragmentFn\n | TgpuComputePipeline\n | TgpuRenderPipeline\n | TgpuVertexFn\n | TgpuSampler\n | TgpuAccessor\n | TgpuExternalTexture\n | TgpuTexture\n | TgpuTextureView\n | TgpuVar\n | AnyVecInstance\n | AnyMatInstance\n | AnyData\n | ((...args: never[]) => unknown);\n\nexport type Wgsl = Eventual<string | number | boolean | ResolvableObject>;\n\nexport type TgpuShaderStage = 'compute' | 'vertex' | 'fragment';\n\nexport interface FnToWgslOptions {\n functionType: 'normal' | TgpuShaderStage;\n argTypes: BaseData[];\n /**\n * The return type of the function. If undefined, the type should be inferred\n * from the implementation (relevant for shellless functions).\n */\n returnType: BaseData | undefined;\n body: Block;\n params: FuncParameter[];\n externalMap: Record<string, unknown>;\n}\n\nexport type ItemLayer = {\n type: 'item';\n usedSlots: Set<TgpuSlot<unknown>>;\n};\n\nexport type FunctionScopeLayer = {\n type: 'functionScope';\n functionType: 'normal' | 'compute' | 'vertex' | 'fragment';\n args: Snippet[];\n argAliases: Record<string, Snippet>;\n externalMap: Record<string, unknown>;\n /**\n * The return type of the function. If undefined, the type should be inferred\n * from the implementation (relevant for shellless functions).\n */\n returnType: BaseData | undefined;\n /**\n * All types used in `return` statements.\n */\n reportedReturnTypes: Set<BaseData>;\n};\n\nexport type SlotBindingLayer = {\n type: 'slotBinding';\n bindingMap: WeakMap<TgpuSlot<unknown>, unknown>;\n};\n\nexport type BlockScopeLayer = {\n type: 'blockScope';\n declarations: Map<string, Snippet>;\n externals: Map<string, Snippet>;\n};\n\nexport type StackLayer =\n | ItemLayer\n | SlotBindingLayer\n | FunctionScopeLayer\n | BlockScopeLayer;\n\nexport interface ItemStateStack {\n readonly itemDepth: number;\n readonly topItem: ItemLayer;\n readonly topFunctionScope: FunctionScopeLayer | undefined;\n\n pushItem(): void;\n pushSlotBindings(pairs: SlotValuePair[]): void;\n pushFunctionScope(\n functionType: 'normal' | TgpuShaderStage,\n args: Snippet[],\n argAliases: Record<string, Snippet>,\n /**\n * The return type of the function. If undefined, the type should be inferred\n * from the implementation (relevant for shellless functions).\n */\n returnType: BaseData | undefined,\n externalMap: Record<string, unknown>,\n ): FunctionScopeLayer;\n pushBlockScope(): void;\n setBlockExternals(externals: Record<string, Snippet>): void;\n clearBlockExternals(): void;\n\n pop<T extends StackLayer['type']>(type: T): Extract<StackLayer, { type: T }>;\n pop(): StackLayer | undefined;\n\n readSlot<T>(slot: TgpuSlot<T>): T | undefined;\n getSnippetById(id: string): Snippet | undefined;\n defineBlockVariable(id: string, snippet: Snippet): void;\n}\n\n/**\n * # What are execution modes/states? 🤷\n * They're used to control how each TypeGPU resource reacts\n * to actions upon them.\n *\n * ## Normal mode\n * This is the default mode, where resources are acted upon\n * by code either:\n * - Not wrapped inside any of our execution-altering APIs\n * like tgpu.resolve or tgpu.simulate.\n * - Inside tgpu.lazy definitions, where we're taking a break\n * from codegen/simulation to create resources on-demand.\n *\n * ```ts\n * const count = tgpu.privateVar(d.f32);\n * count.$ += 1; // Illegal in top-level\n *\n * const root = await tgpu.init();\n * const countMutable = root.createMutable(d.f32);\n * countMutable.$ = [1, 2, 3]; // Illegal in top-level\n * countMutable.write([1, 2, 3]); // OK!\n * ```\n *\n * ## Codegen mode\n * Brought upon by `tgpu.resolve()` (or higher-level APIs using it like our pipelines).\n * Resources are expected to generate WGSL code that represents them, instead of\n * fulfilling their task in JS.\n *\n * ```ts\n * const foo = tgpu.fn([], d.f32)(() => 123);\n * // The following is running in `codegen` mode\n * console.log(foo()); // Prints `foo_0()`\n * ```\n *\n * ## Simulate mode\n * Callbacks passed to `tgpu.simulate()` are executed in this mode. Each 'simulation'\n * is isolated, and does not share state with other simulations (even nested ones).\n * Variables and buffers can be accessed and mutated directly, and their state\n * is returned at the end of the simulation.\n *\n * ```ts\n * const var = tgpu.privateVar(d.f32, 0);\n *\n * const result = tgpu.simulate(() => {\n * // This is running in `simulate` mode\n * var.$ += 1; // Direct access is legal\n * return var.$; // Returns 1\n * });\n *\n * console.log(result.value); // Prints 1\n * ```\n */\nexport type ExecMode = 'normal' | 'codegen' | 'simulate';\n\nexport class NormalState {\n readonly type = 'normal' as const;\n}\n\nexport class CodegenState {\n readonly type = 'codegen' as const;\n}\n\nexport class SimulationState {\n readonly type = 'simulate' as const;\n\n constructor(\n readonly buffers: Map<TgpuBuffer<BaseData>, unknown>,\n readonly vars: {\n private: Map<TgpuVar, unknown>;\n workgroup: Map<TgpuVar, unknown>;\n },\n ) {}\n}\n\nexport type ExecState =\n | NormalState\n | CodegenState\n | SimulationState;\n\nexport type ShaderStage =\n | 'vertex'\n | 'fragment'\n | 'compute'\n | undefined;\n\n/**\n * Passed into each resolvable item. All items in a tree share a resolution ctx,\n * but there can be layers added and removed from the item stack when going down\n * and up the tree.\n */\nexport interface ResolutionCtx {\n [$internal]: {\n itemStateStack: ItemStateStack;\n };\n\n readonly mode: ExecState;\n readonly enableExtensions: WgslExtension[] | undefined;\n\n addDeclaration(declaration: string): void;\n withResetIndentLevel<T>(callback: () => T): T;\n\n /**\n * Reserves a bind group number, and returns a placeholder that will be replaced\n * with a concrete number at the end of the resolution process.\n */\n allocateLayoutEntry(layout: TgpuBindGroupLayout): string;\n\n /**\n * Reserves a spot in the catch-all bind group, without the indirection of a bind-group.\n * This means the resource is 'fixed', and cannot be swapped between code execution.\n */\n allocateFixedEntry(\n layoutEntry: TgpuLayoutEntry,\n resource: object,\n ): {\n group: string;\n binding: number;\n };\n\n withSlots<T>(pairs: SlotValuePair[], callback: () => T): T;\n\n pushMode(state: ExecState): void;\n popMode(expected?: ExecMode): void;\n\n /**\n * Unwraps all layers of slot/lazy indirection and returns the concrete value if available.\n * @throws {MissingSlotValueError}\n */\n unwrap<T>(eventual: Eventual<T>): T;\n\n /**\n * Returns the snippet representing `item`.\n *\n * @param item The value to resolve\n * @param schema Additional information about the item's data type\n * @param exact Should the inferred value of the resulting code be typed exactly as `schema` (true),\n * or is being assignable to `schema` enough (false). Default is false.\n */\n resolve(\n item: unknown,\n schema?: BaseData | UnknownData,\n exact?: boolean,\n ): ResolvedSnippet;\n\n fnToWgsl(options: FnToWgslOptions): {\n head: Wgsl;\n body: Wgsl;\n returnType: BaseData;\n };\n\n withVaryingLocations<T>(\n locations: Record<string, number>,\n callback: () => T,\n ): T;\n\n get varyingLocations(): Record<string, number> | undefined;\n\n /**\n * Temporarily renames the item.\n * Useful for resolutions with slots,\n * since functions with different slots should have different names,\n * and all hold the same inner function that is being resolved multiple times.\n * @param item the item to rename\n * @param name the temporary name to assign to the item (if missing, just returns `callback()`)\n */\n withRenamed<T>(item: object, name: string | undefined, callback: () => T): T;\n\n getUniqueName(resource: object): string;\n makeNameValid(name: string): string;\n}\n\n/**\n * Houses a method on the symbol '$resolve` that returns a\n * code string representing it, as opposed to offloading the\n * resolution to another mechanism.\n */\nexport interface SelfResolvable {\n [$internal]: unknown;\n [$resolve](ctx: ResolutionCtx): ResolvedSnippet;\n toString(): string;\n}\n\nexport function isSelfResolvable(value: unknown): value is SelfResolvable {\n return !!(value as SelfResolvable)?.[$resolve];\n}\n\nexport interface WithGPUValue<T> {\n readonly [$gpuValueOf]: T;\n}\n\nexport interface WithOwnSnippet {\n readonly [$ownSnippet]: Snippet;\n}\n\nexport function getOwnSnippet(value: unknown): Snippet | undefined {\n return (value as WithOwnSnippet)?.[$ownSnippet];\n}\n\nexport interface GPUCallable<TArgs extends unknown[] = unknown[]> {\n [$gpuCallable]: {\n strictSignature?:\n | { argTypes: (BaseData | BaseData[])[]; returnType: BaseData }\n | undefined;\n call(ctx: ResolutionCtx, args: MapValueToSnippet<TArgs>): Snippet;\n };\n}\n\nexport function isGPUCallable(value: unknown): value is GPUCallable {\n return !!(value as GPUCallable)?.[$gpuCallable];\n}\n\nexport type WithCast<T = BaseData> = GPUCallable<[v?: Infer<T>]> & {\n readonly [$cast]: (v?: Infer<T>) => Infer<T>;\n};\n\nexport function hasCast(value: unknown): value is WithCast {\n return !!(value as WithCast)?.[$cast];\n}\n\ntype AnyFn = (...args: never[]) => unknown;\nexport type DualFn<T extends AnyFn> = T & GPUCallable<Parameters<T>>;\n\nexport function isKnownAtComptime(snippet: Snippet): boolean {\n return (typeof snippet.value !== 'string' ||\n snippet.dataType === UnknownData) &&\n getOwnSnippet(snippet.value) === undefined;\n}\n\nexport function isWgsl(value: unknown): value is Wgsl {\n return (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'string' ||\n isSelfResolvable(value) ||\n isWgslData(value) ||\n isSlot(value) ||\n isLazy(value) ||\n isProviding(value)\n );\n}\n\nexport type BindableBufferUsage = 'uniform' | 'readonly' | 'mutable';\nexport type BufferUsage = 'uniform' | 'readonly' | 'mutable' | 'vertex';\n\nexport function isGPUBuffer(value: unknown): value is GPUBuffer {\n return (\n !!value &&\n typeof value === 'object' &&\n 'getMappedRange' in value &&\n 'mapAsync' in value\n );\n}\n\nexport function isBufferUsage(value: unknown): value is\n | TgpuBufferUniform<BaseData>\n | TgpuBufferReadonly<BaseData>\n | TgpuBufferMutable<BaseData> {\n return (value as\n | TgpuBufferUniform<BaseData>\n | TgpuBufferReadonly<BaseData>\n | TgpuBufferMutable<BaseData>)?.resourceType === 'buffer-usage';\n}\n","import { invariant } from './errors.ts';\nimport { type ExecState, NormalState, type ResolutionCtx } from './types.ts';\n\n/**\n * Used to track if the code we're currently\n * executing is inside an executing TypeGPU function.\n *\n * Helpful for providing better error messages.\n */\nlet insideTgpuFn = false;\n\nexport function provideInsideTgpuFn<T>(callback: () => T): T {\n if (insideTgpuFn) {\n return callback();\n }\n try {\n insideTgpuFn = true;\n return callback();\n } finally {\n insideTgpuFn = false;\n }\n}\n\nexport function isInsideTgpuFn(): boolean {\n return insideTgpuFn;\n}\n\nlet resolutionCtx: ResolutionCtx | undefined;\n\n/**\n * Used to mock the context before all tests. For normal use-cases, use `provideCtx`\n */\nexport function INTERNAL_setCtx(ctx: ResolutionCtx | undefined) {\n resolutionCtx = ctx;\n}\n\nexport function provideCtx<T>(ctx: ResolutionCtx, callback: () => T): T {\n invariant(\n resolutionCtx === undefined || resolutionCtx === ctx,\n 'Cannot nest context providers',\n );\n\n if (resolutionCtx === ctx) {\n return callback();\n }\n\n resolutionCtx = ctx;\n try {\n return callback();\n } finally {\n resolutionCtx = undefined;\n }\n}\n\nexport function getResolutionCtx(): ResolutionCtx | undefined {\n return resolutionCtx;\n}\n\n/**\n * Applicable when code is being executed outside of any\n * execution-altering APIs.\n */\nexport const topLevelState = new NormalState();\n\nexport function getExecMode(): ExecState {\n return resolutionCtx?.mode ?? topLevelState;\n}\n\nexport function inCodegenMode() {\n return resolutionCtx?.mode.type === 'codegen';\n}\n\n// You can add getters for more modes if necessary...\n","import { isSnippet, type Snippet } from '../../data/snippet.ts';\nimport { getResolutionCtx } from '../../execMode.ts';\nimport type { ResolutionCtx } from '../../types.ts';\n\ntype ValueOrArray<T> = T | T[];\n\n/**\n * \"The reverse of snipping\"\n * Injects resolved snippets into a template string.\n */\nexport function stitch(\n strings: TemplateStringsArray,\n ...snippets: ValueOrArray<Snippet | string | number | undefined>[]\n) {\n const ctx = getResolutionCtx() as ResolutionCtx;\n\n function resolveSnippet(maybeSnippet: Snippet | string | number) {\n return isSnippet(maybeSnippet)\n ? ctx.resolve(maybeSnippet.value, maybeSnippet.dataType).value\n : maybeSnippet;\n }\n\n let result = '';\n for (let i = 0; i < strings.length; ++i) {\n result += strings[i];\n const snippet = snippets[i];\n if (Array.isArray(snippet)) {\n result += snippet\n .filter((s) => s !== undefined)\n .map(resolveSnippet)\n .join(', ');\n } else if (snippet) {\n result += resolveSnippet(snippet);\n }\n }\n return result;\n}\n","import { $internal } from '../shared/symbols.ts';\nimport {\n type Origin,\n type OriginToPtrParams,\n originToPtrParams,\n} from './snippet.ts';\nimport type {\n Access,\n AddressSpace,\n BaseData,\n Ptr,\n StorableData,\n} from './wgslTypes.ts';\n\nexport function ptrFn<T extends StorableData>(\n inner: T,\n): Ptr<'function', T, 'read-write'> {\n return INTERNAL_createPtr('function', inner, 'read-write');\n}\n\nexport function ptrPrivate<T extends StorableData>(\n inner: T,\n): Ptr<'private', T, 'read-write'> {\n return INTERNAL_createPtr('private', inner, 'read-write');\n}\n\nexport function ptrWorkgroup<T extends StorableData>(\n inner: T,\n): Ptr<'workgroup', T, 'read-write'> {\n return INTERNAL_createPtr('workgroup', inner, 'read-write');\n}\n\nexport function ptrStorage<\n T extends StorableData,\n TAccess extends 'read' | 'read-write' = 'read',\n>(inner: T, access: TAccess = 'read' as TAccess): Ptr<'storage', T, TAccess> {\n return INTERNAL_createPtr('storage', inner, access);\n}\n\nexport function ptrUniform<T extends StorableData>(\n inner: T,\n): Ptr<'uniform', T, 'read'> {\n return INTERNAL_createPtr('uniform', inner, 'read');\n}\n\nexport function ptrHandle<T extends StorableData>(\n inner: T,\n): Ptr<'handle', T, 'read'> {\n return INTERNAL_createPtr('handle', inner, 'read');\n}\n\nexport function INTERNAL_createPtr<\n TAddressSpace extends AddressSpace,\n TInner extends BaseData,\n TAccess extends Access,\n>(\n addressSpace: TAddressSpace,\n inner: TInner,\n access: TAccess,\n implicit: boolean = false,\n): Ptr<TAddressSpace, TInner, TAccess> {\n return {\n [$internal]: {},\n type: 'ptr',\n addressSpace,\n inner,\n access,\n implicit,\n toString: () => `ptr<${addressSpace}, ${inner}, ${access}>`,\n } as Ptr<TAddressSpace, TInner, TAccess>;\n}\n\nexport function createPtrFromOrigin(\n origin: Origin,\n innerDataType: StorableData,\n): Ptr | undefined {\n const ptrParams = originToPtrParams[origin as keyof OriginToPtrParams];\n\n if (ptrParams) {\n return INTERNAL_createPtr(\n ptrParams.space,\n innerDataType,\n ptrParams.access,\n );\n }\n\n return undefined;\n}\n\nexport function implicitFrom(ptr: Ptr): Ptr {\n return INTERNAL_createPtr(\n ptr.addressSpace,\n ptr.inner,\n ptr.access,\n /* implicit */ true,\n );\n}\n\nexport function explicitFrom(ptr: Ptr): Ptr {\n return INTERNAL_createPtr(\n ptr.addressSpace,\n ptr.inner,\n ptr.access,\n /* implicit */ false,\n );\n}\n","import { stitch } from '../core/resolve/stitch.ts';\nimport { WgslTypeError } from '../errors.ts';\nimport { setName } from '../shared/meta.ts';\nimport {\n $gpuCallable,\n $internal,\n $ownSnippet,\n $resolve,\n} from '../shared/symbols.ts';\nimport type { DualFn, SelfResolvable } from '../types.ts';\nimport { UnknownData } from './dataTypes.ts';\nimport { createPtrFromOrigin, explicitFrom } from './ptr.ts';\nimport { type ResolvedSnippet, snip, type Snippet } from './snippet.ts';\nimport {\n isNaturallyEphemeral,\n isPtr,\n type Ptr,\n type StorableData,\n} from './wgslTypes.ts';\n\n// ----------\n// Public API\n// ----------\n\ninterface ref<T> {\n readonly [$internal]: { type: 'ref' };\n\n /**\n * Derefences the reference, and gives access to the underlying value.\n *\n * @example ```ts\n * const boid = Boid({ pos: d.vec3f(3, 2, 1) });\n * const posRef = d.ref(boid.pos);\n *\n * // Actually updates `boid.pos`\n * posRef.$ = d.vec3f(1, 2, 3);\n * console.log(boid.pos); // Output: vec3f(1, 2, 3)\n * ```\n */\n $: T;\n}\n\n/**\n * A reference to a value `T`. Can be passed to other functions to give them\n * mutable access to the underlying value.\n *\n * Conceptually, it represents a WGSL pointer.\n */\nexport type _ref<T> = T extends object ? T & ref<T> : ref<T>;\n\ntype RefFn = DualFn<(<T>(value: T) => _ref<T>)> & { [$internal]: true };\n\nexport const _ref = (() => {\n const impl = (<T>(value: T) => INTERNAL_createRef(value)) as unknown as RefFn;\n\n setName(impl, 'ref');\n impl.toString = () => 'ref';\n impl[$internal] = true;\n impl[$gpuCallable] = {\n call(_ctx, [value]) {\n if (value.origin === 'argument') {\n throw new WgslTypeError(\n stitch`d.ref(${value}) is illegal, cannot take a reference of an argument. Copy the value locally first, and take a reference of the copy.`,\n );\n }\n\n if (isPtr(value.dataType)) {\n // This can happen if we take a reference of an *implicit* pointer, one\n // made by assigning a reference to a `const`.\n return snip(value.value, explicitFrom(value.dataType), value.origin);\n }\n\n /**\n * Pointer type only exists if the ref was created from a reference (buttery-butter).\n *\n * @example\n * ```ts\n * const life = ref(42); // created from a value\n * const boid = ref(layout.$.boids[0]); // created from a reference\n * ```\n */\n const ptrType = createPtrFromOrigin(\n value.origin,\n value.dataType as StorableData,\n );\n return snip(\n new RefOperator(value, ptrType),\n ptrType ?? UnknownData,\n /* origin */ 'runtime',\n );\n },\n };\n\n return impl;\n})();\n\nexport function isRef<T>(value: unknown): value is ref<T> {\n return (value as ref<T>)?.[$internal]?.type === 'ref';\n}\n\n// --------------\n// Implementation\n// --------------\n\nexport function INTERNAL_createRef<T>(value: T): ref<T> {\n const target = {\n [$internal]: { type: 'ref' },\n\n get $(): T {\n return value;\n },\n\n set $(newValue: T) {\n if (newValue && typeof newValue === 'object') {\n // Setting an object means updating the properties of the original object.\n // e.g.: foo.$ = Boid();\n for (const key of Object.keys(newValue) as (keyof T)[]) {\n value[key] = newValue[key];\n }\n } else {\n value = newValue;\n }\n },\n };\n\n if (value === undefined || value === null) {\n throw new Error('Cannot create a ref from undefined or null');\n }\n\n if (typeof value === 'object') {\n return new Proxy(target, {\n get(target, prop) {\n if (prop in target) {\n return target[prop as keyof typeof target];\n }\n return value[prop as keyof T];\n },\n set(_target, prop, propValue) {\n if (prop === $internal) {\n return false;\n }\n if (prop === '$') {\n console.log('Setting ref value:', propValue);\n return Reflect.set(target, prop, propValue);\n }\n return Reflect.set(value as object, prop, propValue);\n },\n }) as ref<T>;\n }\n\n return target as ref<T>;\n}\n\n/**\n * The result of calling `d.ref(...)`. The code responsible for\n * generating shader code can check if the value of a snippet is\n * an instance of `RefOperator`, and act accordingly.\n */\nexport class RefOperator implements SelfResolvable {\n readonly [$internal]: true;\n readonly snippet: Snippet;\n\n readonly #ptrType: Ptr | undefined;\n\n constructor(snippet: Snippet, ptrType: Ptr | undefined) {\n this[$internal] = true;\n this.snippet = snippet;\n this.#ptrType = ptrType;\n }\n\n get [$ownSnippet](): Snippet {\n if (!this.#ptrType) {\n throw new Error(stitch`Cannot take a reference of ${this.snippet}`);\n }\n return snip(this, this.#ptrType, this.snippet.origin);\n }\n\n [$resolve](): ResolvedSnippet {\n if (!this.#ptrType) {\n throw new Error(stitch`Cannot take a reference of ${this.snippet}`);\n }\n return snip(stitch`(&${this.snippet})`, this.#ptrType, this.snippet.origin);\n }\n}\n\nexport function derefSnippet(snippet: Snippet): Snippet {\n if (!isPtr(snippet.dataType)) {\n return snippet;\n }\n\n const innerType = snippet.dataType.inner;\n const origin = isNaturallyEphemeral(innerType) ? 'runtime' : snippet.origin;\n\n if (snippet.value instanceof RefOperator) {\n return snip(stitch`${snippet.value.snippet}`, innerType, origin);\n }\n\n return snip(stitch`(*${snippet})`, innerType, origin);\n}\n","import { $cast, $gpuCallable } from '../shared/symbols.ts';\nimport {\n type GPUCallable,\n hasCast,\n isGPUCallable,\n type ResolutionCtx,\n} from '../types.ts';\nimport type { Snippet } from './snippet.ts';\nimport type { BaseData } from './wgslTypes.ts';\n\n/**\n * A wrapper for `schema(item)` or `schema()` call on JS side.\n * If the schema is a pointer, returns the value pointed to without copying.\n * If the schema is a TgpuVertexFormatData, calls the corresponding constructible schema instead.\n * If the schema is not callable, throws an error.\n * Otherwise, returns `schema(item)` or `schema()`.\n */\nexport function schemaCallWrapper<T>(schema: BaseData, item?: T): T {\n const callSchema = schema as unknown as ((item?: T) => T);\n\n if (hasCast(callSchema)) {\n return callSchema[$cast](item) as T;\n }\n\n if (typeof callSchema !== 'function') {\n // Not callable\n return item as T;\n }\n\n return item === undefined ? callSchema() : callSchema(item);\n}\n\n/**\n * A wrapper for `schema(item)` or `schema()` call on the GPU side.\n * If the schema is a pointer, returns the value pointed to without copying.\n * If the schema is a TgpuVertexFormatData, calls the corresponding constructible schema instead.\n * If the schema is not callable, throws an error.\n * Otherwise, returns `schema(item)` or `schema()`.\n */\nexport function schemaCallWrapperGPU(\n ctx: ResolutionCtx,\n schema: BaseData,\n item?: Snippet,\n): Snippet {\n if (!isGPUCallable(schema)) {\n // Not callable\n return item as Snippet;\n }\n\n const callSchema = schema as GPUCallable<[unknown?]>;\n return item === undefined || item.value === undefined\n ? callSchema[$gpuCallable].call(ctx, [])\n : callSchema[$gpuCallable].call(ctx, [item]);\n}\n","import { isMatInstance, isVecInstance } from '../data/wgslTypes.ts';\n\nexport function safeStringify(item: unknown): string {\n const asString = String(item);\n if (asString !== '[object Object]') {\n return asString;\n }\n\n try {\n return JSON.stringify(item);\n } catch (error) {\n console.error('Error parsing JSON:', error);\n return '<invalid json>';\n }\n}\n\nexport function niceStringify(item: unknown): string {\n if (isVecInstance(item) || isMatInstance(item)) {\n // oxlint-disable-next-line typescript/no-base-to-string it's fine\n return item.toString();\n }\n\n if (Array.isArray(item)) {\n return `[${item.map(niceStringify).join(', ')}]`;\n }\n\n if (item && typeof item === 'object') {\n return `{ ${\n Object.entries(item).map(([key, value]) =>\n `${key}: ${niceStringify(value)}`\n ).join(', ')\n } }`;\n }\n\n return String(item);\n}\n","export type Default<T, TDefault> = unknown extends T ? TDefault\n : T extends undefined ? TDefault\n : T;\n\nexport type SwapNever<T, Replacement> = [T] extends [never] ? Replacement : T;\n\nexport type UnionToIntersection<U> =\n // oxlint-disable-next-line typescript/no-explicit-any <had to be done>\n (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I\n : never;\n\nexport type Prettify<T> =\n & {\n [K in keyof T]: T[K];\n }\n & {};\n\n/**\n * Utility type that merges a partial type with defaults, where defaults are used\n * for properties not present in the partial type.\n */\nexport type WithDefaults<TPartial, TDefaults> =\n & Omit<TDefaults, keyof TPartial>\n & TPartial;\n\n/**\n * Removes properties from record type that extend `Prop`\n */\nexport type OmitProps<T extends Record<string, unknown>, Prop> = Pick<\n T,\n {\n [Key in keyof T]: T[Key] extends Prop ? never : Key;\n }[keyof T]\n>;\n\n/**\n * Removes properties from record type that equal `Prop`\n */\nexport type OmitPropsExact<T extends Record<string, unknown>, Prop> = Pick<\n T,\n {\n [Key in keyof T]: [T[Key], Prop] extends [Prop, T[Key]] ? never : Key;\n }[keyof T]\n>;\n\nexport type NullableToOptional<T> =\n & {\n // Props where the value extends `null` -> make them optional and remove null from the type\n [K in keyof T as T[K] extends null ? K : never]?: T[K];\n }\n & {\n // All other props remain unchanged\n [K in keyof T as T[K] extends null ? never : K]: T[K];\n };\n\n/**\n * The opposite of Readonly<T>\n */\nexport type Mutable<T> = {\n -readonly [P in keyof T]: T[P];\n};\n\n/**\n * Source: https://code.lol/post/programming/higher-kinded-types/\n */\nexport type Assume<T, U> = T extends U ? T : U;\n\n/**\n * Any typed array\n */\nexport type TypedArray =\n | Uint8Array\n | Uint16Array\n | Uint32Array\n | Int32Array\n | Float32Array\n | Float64Array;\n\nexport function assertExhaustive(x: never, location: string): never {\n throw new Error(`Failed to handle ${x} at ${location}`);\n}\n","import { stitch } from '../core/resolve/stitch.ts';\nimport { UnknownData } from '../data/dataTypes.ts';\nimport { undecorate } from '../data/dataTypes.ts';\nimport { derefSnippet, RefOperator } from '../data/ref.ts';\nimport { schemaCallWrapperGPU } from '../data/schemaCallWrapper.ts';\nimport { snip, type Snippet } from '../data/snippet.ts';\nimport {\n type AnyWgslData,\n type BaseData,\n type F16,\n type F32,\n type I32,\n isMat,\n isPtr,\n isVec,\n type Ptr,\n type U32,\n type WgslStruct,\n} from '../data/wgslTypes.ts';\nimport { invariant, WgslTypeError } from '../errors.ts';\nimport { DEV, TEST } from '../shared/env.ts';\nimport { safeStringify } from '../shared/stringify.ts';\nimport { assertExhaustive } from '../shared/utilityTypes.ts';\nimport type { ResolutionCtx } from '../types.ts';\n\ntype ConversionAction = 'ref' | 'deref' | 'cast' | 'none';\n\ntype ConversionRankInfo =\n | { rank: number; action: 'cast'; targetType: BaseData }\n | { rank: number; action: Exclude<ConversionAction, 'cast'> };\n\nconst INFINITE_RANK: ConversionRankInfo = {\n rank: Number.POSITIVE_INFINITY,\n action: 'none',\n};\n\nfunction getAutoConversionRank(\n src: BaseData,\n dest: BaseData,\n): ConversionRankInfo {\n const trueSrc = undecorate(src);\n const trueDst = undecorate(dest);\n\n if (trueSrc.type === trueDst.type) {\n return { rank: 0, action: 'none' };\n }\n\n if (trueSrc.type === 'abstractFloat') {\n if (trueDst.type === 'f32') return { rank: 1, action: 'none' };\n if (trueDst.type === 'f16') return { rank: 2, action: 'none' };\n }\n\n if (trueSrc.type === 'abstractInt') {\n if (trueDst.type === 'i32') return { rank: 3, action: 'none' };\n if (trueDst.type === 'u32') return { rank: 4, action: 'none' };\n if (trueDst.type === 'abstractFloat') return { rank: 5, action: 'none' };\n if (trueDst.type === 'f32') return { rank: 6, action: 'none' };\n if (trueDst.type === 'f16') return { rank: 7, action: 'none' };\n }\n\n if (\n isVec(trueSrc) && isVec(trueDst) &&\n // Same length vectors\n trueSrc.type[3] === trueDst.type[3]\n ) {\n return getAutoConversionRank(trueSrc.primitive, trueDst.primitive);\n }\n\n if (\n isMat(trueSrc) && isMat(trueDst) &&\n // Same dimensions\n trueSrc.type[3] === trueDst.type[3]\n ) {\n // Matrix conversion rank depends only on component type (always f32 for now)\n return { rank: 0, action: 'none' };\n }\n\n return INFINITE_RANK;\n}\n\nfunction getImplicitConversionRank(\n src: BaseData,\n dest: BaseData,\n): ConversionRankInfo {\n const trueSrc = undecorate(src);\n const trueDst = undecorate(dest);\n\n if (\n isPtr(trueSrc) &&\n // Only dereferencing implicit pointers, otherwise we'd have a types mismatch between TS and WGSL\n trueSrc.implicit &&\n getAutoConversionRank(trueSrc.inner, trueDst).rank <\n Number.POSITIVE_INFINITY\n ) {\n return { rank: 0, action: 'deref' };\n }\n\n if (\n isPtr(trueDst) &&\n getAutoConversionRank(trueSrc, trueDst.inner).rank <\n Number.POSITIVE_INFINITY\n ) {\n return { rank: 1, action: 'ref' };\n }\n\n const primitivePreference = {\n f32: 0,\n f16: 1,\n i32: 2,\n u32: 3,\n bool: 4,\n } as const;\n type PrimitiveType = keyof typeof primitivePreference;\n\n if (\n trueSrc.type in primitivePreference &&\n trueDst.type in primitivePreference\n ) {\n const srcType = trueSrc.type as PrimitiveType;\n const destType = trueDst.type as PrimitiveType;\n\n if (srcType !== destType) {\n const srcPref = primitivePreference[srcType];\n const destPref = primitivePreference[destType];\n\n const rank = destPref < srcPref ? 10 : 20;\n\n return { rank: rank, action: 'cast', targetType: trueDst };\n }\n }\n\n if (trueSrc.type === 'abstractFloat') {\n if (trueDst.type === 'u32') {\n return { rank: 2, action: 'cast', targetType: trueDst };\n }\n if (trueDst.type === 'i32') {\n return { rank: 1, action: 'cast', targetType: trueDst };\n }\n }\n\n return INFINITE_RANK;\n}\n\nfunction getConversionRank(\n src: BaseData,\n dest: BaseData,\n allowImplicit: boolean,\n): ConversionRankInfo {\n const autoRank = getAutoConversionRank(src, dest);\n if (autoRank.rank < Number.POSITIVE_INFINITY) {\n return autoRank;\n }\n if (allowImplicit) {\n return getImplicitConversionRank(src, dest);\n }\n return INFINITE_RANK;\n}\n\nexport type ConversionResultAction = {\n sourceIndex: number;\n action: ConversionAction;\n targetType?: U32 | F32 | I32 | F16;\n};\n\nexport type ConversionResult = {\n targetType: BaseData;\n actions: ConversionResultAction[];\n hasImplicitConversions?: boolean;\n};\n\nfunction findBestType(\n types: BaseData[],\n uniqueTypes: BaseData[],\n allowImplicit: boolean,\n): ConversionResult | undefined {\n let bestResult:\n | { type: BaseData; details: ConversionRankInfo[]; sum: number }\n | undefined;\n\n for (const targetType of uniqueTypes) {\n const details: ConversionRankInfo[] = [];\n let sum = 0;\n for (const sourceType of types) {\n const conversion = getConversionRank(\n sourceType,\n targetType,\n allowImplicit,\n );\n sum += conversion.rank;\n if (conversion.rank === Number.POSITIVE_INFINITY) {\n break;\n }\n details.push(conversion);\n }\n if (sum < (bestResult?.sum ?? Number.POSITIVE_INFINITY)) {\n bestResult = { type: targetType, details, sum };\n }\n }\n if (!bestResult) {\n return undefined;\n }\n const actions: ConversionResultAction[] = bestResult.details.map(\n (detail, index) => ({\n sourceIndex: index,\n action: detail.action,\n ...(detail.action === 'cast' && {\n targetType: detail.targetType as U32 | F32 | I32 | F16,\n }),\n }),\n );\n\n return {\n targetType: bestResult.type,\n actions,\n hasImplicitConversions: actions.some((action) => action.action === 'cast'),\n };\n}\n\nexport function getBestConversion(\n types: BaseData[],\n targetTypes?: BaseData[],\n): ConversionResult | undefined {\n if (types.length === 0) return undefined;\n\n const uniqueTargetTypes = [\n ...new Set((targetTypes || types).map(undecorate)),\n ];\n\n const explicitResult = findBestType(types, uniqueTargetTypes, false);\n if (explicitResult) {\n return explicitResult;\n }\n\n const implicitResult = findBestType(types, uniqueTargetTypes, true);\n if (implicitResult) {\n return implicitResult;\n }\n\n return undefined;\n}\n\nfunction applyActionToSnippet(\n ctx: ResolutionCtx,\n snippet: Snippet,\n action: ConversionResultAction,\n targetType: BaseData,\n): Snippet {\n if (action.action === 'none') {\n return snip(\n snippet.value,\n targetType,\n // if it was a ref, then it's still a ref\n /* origin */ snippet.origin,\n );\n }\n\n switch (action.action) {\n case 'ref':\n return snip(\n new RefOperator(snippet, targetType as Ptr),\n targetType,\n snippet.origin,\n );\n case 'deref':\n return derefSnippet(snippet);\n case 'cast': {\n // Casting means calling the schema with the snippet as an argument.\n return schemaCallWrapperGPU(ctx, targetType, snippet);\n }\n default: {\n assertExhaustive(action.action, 'applyActionToSnippet');\n }\n }\n}\n\nexport function unify<T extends (BaseData | UnknownData)[] | []>(\n inTypes: T,\n restrictTo?: BaseData[],\n): { [K in keyof T]: BaseData } | undefined {\n if (inTypes.some((type) => type === UnknownData)) {\n return undefined;\n }\n\n const conversion = getBestConversion(inTypes as BaseData[], restrictTo);\n if (!conversion) {\n return undefined;\n }\n\n return inTypes.map((type) =>\n isVec(type) || isMat(type) ? type : conversion.targetType\n ) as { [K in keyof T]: BaseData };\n}\n\nexport function convertToCommonType<T extends Snippet[]>(\n ctx: ResolutionCtx,\n values: T,\n restrictTo?: BaseData[],\n verbose = true,\n): T | undefined {\n const types = values.map((value) => value.dataType);\n\n if (types.some((type) => type === UnknownData)) {\n return undefined;\n }\n\n if (DEV && Array.isArray(restrictTo) && restrictTo.length === 0) {\n console.warn(\n 'convertToCommonType was called with an empty restrictTo array, which prevents any conversions from being made. If you intend to allow all conversions, pass undefined instead. If this was intended call the function conditionally since the result will always be undefined.',\n );\n }\n\n const conversion = getBestConversion(types as BaseData[], restrictTo);\n if (!conversion) {\n return undefined;\n }\n\n if ((TEST || DEV) && verbose && conversion.hasImplicitConversions) {\n console.warn(\n `Implicit conversions from [\\n${\n values\n .map((v) => ` ${v.value}: ${safeStringify(v.dataType)}`)\n .join(\n ',\\n',\n )\n }\\n] to ${conversion.targetType.type} are supported, but not recommended.\nConsider using explicit conversions instead.`,\n );\n }\n\n return values.map((value, index) => {\n const action = conversion.actions[index];\n invariant(action, 'Action should not be undefined');\n return applyActionToSnippet(ctx, value, action, conversion.targetType);\n }) as T;\n}\n\nexport function tryConvertSnippet(\n ctx: ResolutionCtx,\n snippet: Snippet,\n targetDataTypes: BaseData | BaseData[],\n verbose = true,\n): Snippet {\n const targets = Array.isArray(targetDataTypes)\n ? targetDataTypes\n : [targetDataTypes];\n\n const { value, dataType, origin } = snippet;\n\n if (targets.length === 1) {\n const target = targets[0] as AnyWgslData;\n\n if (target === dataType) {\n return snip(value, target, origin);\n }\n\n if (dataType === UnknownData) {\n // Commit unknown to the expected type.\n return snip(stitch`${snip(value, target, origin)}`, target, origin);\n }\n }\n\n const converted = convertToCommonType(ctx, [snippet], targets, verbose);\n if (converted) {\n return converted[0] as Snippet;\n }\n\n throw new WgslTypeError(\n `Cannot convert value of type '${\n String(\n dataType,\n )\n }' to any of the target types: [${targets.map((t) => t.type).join(', ')}]`,\n );\n}\n\nexport function convertStructValues(\n ctx: ResolutionCtx,\n structType: WgslStruct,\n values: Record<string, Snippet>,\n): Snippet[] {\n return Object.entries(structType.propTypes).map(([key, targetType]) => {\n const val = values[key];\n if (!val) {\n throw new Error(`Missing property ${key}`);\n }\n\n const converted = convertToCommonType(ctx, [val], [targetType]);\n return converted?.[0] ?? val;\n });\n}\n","import { type MapValueToSnippet, snip } from '../../data/snippet.ts';\nimport { type BaseData, isPtr } from '../../data/wgslTypes.ts';\nimport { setName } from '../../shared/meta.ts';\nimport { $gpuCallable } from '../../shared/symbols.ts';\nimport { tryConvertSnippet } from '../../tgsl/conversion.ts';\nimport {\n type DualFn,\n isKnownAtComptime,\n NormalState,\n type ResolutionCtx,\n} from '../../types.ts';\nimport type { AnyFn } from './fnTypes.ts';\n\ntype MapValueToDataType<T> = { [K in keyof T]: BaseData };\n\ninterface CallableSchemaOptions<T extends AnyFn> {\n readonly name: string;\n readonly normalImpl: T;\n readonly codegenImpl: (\n ctx: ResolutionCtx,\n args: MapValueToSnippet<Parameters<T>>,\n ) => string;\n readonly signature: (\n ...inArgTypes: MapValueToDataType<Parameters<T>>\n ) => { argTypes: (BaseData | BaseData[])[]; returnType: BaseData };\n}\n\nexport function callableSchema<T extends AnyFn>(\n options: CallableSchemaOptions<T>,\n): DualFn<T> {\n const impl = ((...args: Parameters<T>) => {\n return options.normalImpl(...args);\n }) as DualFn<T>;\n\n setName(impl, options.name);\n impl.toString = () => options.name;\n impl[$gpuCallable] = {\n get strictSignature() {\n return undefined;\n },\n call(ctx, args) {\n const { argTypes, returnType } = options.signature(\n ...args.map((s) => {\n // Dereference implicit pointers\n if (isPtr(s.dataType) && s.dataType.implicit) {\n return s.dataType.inner;\n }\n return s.dataType;\n }) as MapValueToDataType<Parameters<T>>,\n );\n\n const converted = args.map((s, idx) => {\n const argType = argTypes[idx];\n if (!argType) {\n throw new Error('Function called with invalid arguments');\n }\n return tryConvertSnippet(\n ctx,\n s,\n argType,\n false,\n );\n }) as MapValueToSnippet<Parameters<T>>;\n\n if (converted.every((s) => isKnownAtComptime(s))) {\n ctx.pushMode(new NormalState());\n try {\n return snip(\n options.normalImpl(...converted.map((s) => s.value) as never[]),\n returnType,\n // Functions give up ownership of their return value\n /* origin */ 'constant',\n );\n } finally {\n ctx.popMode('normal');\n }\n }\n\n return snip(\n options.codegenImpl(ctx, converted),\n returnType,\n // Functions give up ownership of their return value\n /* origin */ 'runtime',\n );\n },\n };\n\n return impl;\n}\n","import { stitch } from '../core/resolve/stitch.ts';\nimport { $internal } from '../shared/symbols.ts';\nimport type {\n AbstractFloat,\n AbstractInt,\n Bool,\n F16,\n F32,\n I32,\n U16,\n U32,\n} from './wgslTypes.ts';\nimport { callableSchema } from '../core/function/createCallableSchema.ts';\n\nexport const abstractInt = {\n [$internal]: {},\n type: 'abstractInt',\n toString() {\n return 'abstractInt';\n },\n} as AbstractInt;\n\nexport const abstractFloat = {\n [$internal]: {},\n type: 'abstractFloat',\n toString() {\n return 'abstractFloat';\n },\n} as AbstractFloat;\n\nconst boolCast = callableSchema({\n name: 'bool',\n signature: (arg) => ({ argTypes: arg ? [arg] : [], returnType: bool }),\n normalImpl(v?: number | boolean) {\n if (v === undefined) {\n return false;\n }\n if (typeof v === 'boolean') {\n return v;\n }\n return !!v;\n },\n codegenImpl: (_ctx, [arg]) =>\n arg?.dataType === bool\n // Already of type bool\n ? stitch`${arg}`\n : stitch`bool(${arg})`,\n});\n\n/**\n * A schema that represents a boolean value. (equivalent to `bool` in WGSL)\n *\n * Can also be called to cast a value to a bool in accordance with WGSL casting rules.\n *\n * @example\n * const value = bool(); // false\n * @example\n * const value = bool(0); // false\n * @example\n * const value = bool(-0); // false\n * @example\n * const value = bool(21.37); // true\n */\nexport const bool: Bool = Object.assign(boolCast, {\n [$internal]: {},\n type: 'bool',\n}) as unknown as Bool;\n\nconst u32Cast = callableSchema({\n name: 'u32',\n signature: (arg) => ({ argTypes: arg ? [arg] : [], returnType: u32 }),\n normalImpl(v?: number | boolean) {\n if (v === undefined) {\n return 0;\n }\n if (typeof v === 'boolean') {\n return v ? 1 : 0;\n }\n if (!Number.isInteger(v)) {\n const truncated = Math.trunc(v);\n if (truncated < 0) {\n return 0;\n }\n if (truncated > 0xffffffff) {\n return 0xffffffff;\n }\n return truncated;\n }\n // Integer input: treat as bit reinterpretation (i32 -> u32)\n return (v & 0xffffffff) >>> 0;\n },\n codegenImpl: (_ctx, [arg]) =>\n arg?.dataType === u32\n // Already of type u32\n ? stitch`${arg}`\n : stitch`u32(${arg})`,\n});\n\n/**\n * A schema that represents an unsigned 32-bit integer value. (equivalent to `u32` in WGSL)\n *\n * Can also be called to cast a value to an u32 in accordance with WGSL casting rules.\n *\n * @example\n * const value = u32(); // 0\n * @example\n * const value = u32(7); // 7\n * @example\n * const value = u32(3.14); // 3\n * @example\n * const value = u32(-1); // 4294967295\n * @example\n * const value = u32(-3.1); // 0\n */\nexport const u32: U32 = Object.assign(u32Cast, {\n [$internal]: {},\n type: 'u32',\n}) as unknown as U32;\n\nconst i32Cast = callableSchema({\n name: 'i32',\n signature: (arg) => ({ argTypes: arg ? [arg] : [], returnType: i32 }),\n normalImpl(v?: number | boolean) {\n if (v === undefined) {\n return 0;\n }\n if (typeof v === 'boolean') {\n return v ? 1 : 0;\n }\n return v | 0;\n },\n codegenImpl: (_ctx, [arg]) =>\n arg?.dataType === i32\n // Already of type i32\n ? stitch`${arg}`\n : stitch`i32(${arg})`,\n});\n\nexport const u16: U16 = {\n [$internal]: {},\n type: 'u16',\n} as U16;\n\n/**\n * A schema that represents a signed 32-bit integer value. (equivalent to `i32` in WGSL)\n *\n * Can also be called to cast a value to an i32 in accordance with WGSL casting rules.\n *\n * @example\n * const value = i32(); // 0\n * @example\n * const value = i32(3.14); // 3\n * @example\n * const value = i32(-3.9); // -3\n * @example\n * const value = i32(10000000000) // 1410065408\n */\nexport const i32: I32 = Object.assign(i32Cast, {\n [$internal]: {},\n type: 'i32',\n}) as unknown as I32;\n\nconst f32Cast = callableSchema({\n name: 'f32',\n signature: (arg) => ({ argTypes: arg ? [arg] : [], returnType: f32 }),\n normalImpl(v?: number | boolean) {\n if (v === undefined) {\n return 0;\n }\n if (typeof v === 'boolean') {\n return v ? 1 : 0;\n }\n return Math.fround(v);\n },\n codegenImpl: (_ctx, [arg]) =>\n arg?.dataType === f32\n // Already of type f32\n ? stitch`${arg}`\n : stitch`f32(${arg})`,\n});\n\n/**\n * A schema that represents a 32-bit float value. (equivalent to `f32` in WGSL)\n *\n * Can also be called to cast a value to an f32.\n *\n * @example\n * const value = f32(); // 0\n * @example\n * const value = f32(1.23); // 1.23\n * @example\n * const value = f32(true); // 1\n */\nexport const f32: F32 = Object.assign(f32Cast, {\n [$internal]: {},\n type: 'f32',\n}) as unknown as F32;\n\n// helpers for floating point conversion\nconst buf32 = new ArrayBuffer(4);\nconst f32arr = new Float32Array(buf32);\nconst u32arr = new Uint32Array(buf32);\n\n/**\n * Convert a JavaScript number (treated as float32) to **binary16** bit pattern.\n * @param x 32-bit floating-point value\n * @returns 16-bit half-precision encoding (stored in a JS number)\n */\nexport function toHalfBits(x: number): number {\n f32arr[0] = x; // Write value; shared buffer now contains raw bits.\n const bits = u32arr[0] as number; // Read those bits as unsigned int.\n\n // 1. Extract sign, exponent, and mantissa from the 32‑bit layout.\n const sign = (bits >>> 31) & 0x1; // Bit 31 is the sign.\n let exp = (bits >>> 23) & 0xff; // Bits 30‑23 form the biased exponent.\n let mant = bits & 0x7fffff; // Bits 22‑0 are the significand.\n\n // 2. Handle special values (NaN, ±∞) before re‑biasing.\n if (exp === 0xff) {\n // Preserve the quiet‑NaN bit if mant≠0; otherwise this is ±∞.\n return (sign << 15) | 0x7c00 | (mant ? 0x0200 : 0);\n }\n\n // 3. Re‑bias the exponent from 127 → 15 (binary32 → binary16).\n exp = exp - 127 + 15;\n\n // 4. Underflow: exponent ≤ 0 yields sub‑normals or signed zero.\n if (exp <= 0) {\n // If we need to shift more than 10 places, the value rounds to ±0.\n if (exp < -10) {\n return sign << 15;\n }\n\n // Produce a sub‑normal: prepend the hidden 1, right‑shift, then round.\n mant = (mant | 0x800000) >> (1 - exp);\n mant = (mant + 0x1000) >> 13; // Round‑to‑nearest‑even at bit 10.\n return (sign << 15) | mant;\n }\n\n // 5. Overflow: if the biased exponent is 31 (0x1f) or higher, the number\n // cannot be represented in half precision, so we return ±∞.\n if (exp >= 0x1f) {\n return (sign << 15) | 0x7c00; // ±∞\n }\n\n // 6. Normalised number: round mantissa and pack sign|exp|mant.\n mant = mant + 0x1000; // Add rounding bias at bit 12.\n if (mant & 0x800000) { // The carry propagated out of the top bit; mantissa overflowed.\n mant = 0; // Rounded up to 1.0 × 2^(exp+1).\n ++exp; // Increment exponent (may overflow to ±∞).\n if (exp >= 0x1f) {\n return (sign << 15) | 0x7c00;\n }\n }\n\n return (sign << 15) | (exp << 10) | (mant >> 13);\n}\n\n/**\n * Convert a **binary16** encoded bit pattern back to JavaScript number.\n * @param h 16-bit half-precision bits\n * @returns JavaScript number (64-bit float) with same numerical value\n */\nexport function fromHalfBits(h: number): number {\n const sign = (h & 0x8000) ? -1 : 1; // Sign multiplier (preserves −0).\n const exp = (h >> 10) & 0x1f; // 5‑bit exponent.\n const mant = h & 0x03ff; // 10‑bit significand.\n\n // 1. Zero and sub‑normals.\n if (exp === 0) {\n // oxlint-disable-next-line oxc/erasing-op negative zero exists\n return mant ? sign * mant * 2 ** -24 : sign * 0;\n }\n\n // 2. Special cases (exp == 31).\n if (exp === 0x1f) {\n return mant\n ? Number.NaN\n : (sign === 1 ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY);\n }\n\n // 3. Normalised numbers.\n return sign * (1 + mant / 1024) * 2 ** (exp - 15);\n}\n\nfunction roundToF16(x: number): number {\n return fromHalfBits(toHalfBits(x));\n}\n\nconst f16Cast = callableSchema({\n name: 'f16',\n signature: (arg) => ({ argTypes: arg ? [arg] : [], returnType: f16 }),\n normalImpl(v?: number | boolean) {\n if (v === undefined) {\n return 0;\n }\n if (typeof v === 'boolean') {\n return v ? 1 : 0;\n }\n return roundToF16(v);\n },\n // TODO: make usage of f16() in GPU mode check for feature availability and throw if not available\n codegenImpl: (_ctx, [arg]) =>\n arg?.dataType === f16\n // Already of type f16\n ? stitch`${arg}`\n : stitch`f16(${arg})`,\n});\n\n/**\n * A schema that represents a 16-bit float value. (equivalent to `f16` in WGSL)\n *\n * Can also be called to cast a value to an f16.\n *\n * @example\n * const value = f16(); // 0\n * @example\n * const value = f32(1.23); // 1.23\n * @example\n * const value = f16(true); // 1\n * @example\n * const value = f16(21877.5); // 21872\n */\nexport const f16: F16 = Object.assign(f16Cast, {\n [$internal]: {},\n type: 'f16',\n}) as unknown as F16;\n","import { $internal, $resolve } from '../shared/symbols.ts';\nimport type { SelfResolvable } from '../types.ts';\nimport { bool, f16, f32, i32, u32 } from './numeric.ts';\nimport { type ResolvedSnippet, snip } from './snippet.ts';\nimport type { BaseData, VecKind } from './wgslTypes.ts';\n\ntype VecSchema<S> = BaseData & ((v?: S) => S);\n\nconst XYZW = ['x', 'y', 'z', 'w'];\nconst RGBA = ['r', 'g', 'b', 'a'];\n\n// deno-fmt-ignore\nexport abstract class VecBase<S> extends Array implements SelfResolvable {\n abstract readonly [$internal]: {\n elementSchema: VecSchema<S>;\n };\n abstract get kind(): VecKind;\n\n abstract get _Vec2(): new (\n x: S,\n y: S,\n ) => Vec2<S>;\n abstract get _Vec3(): new (\n x: S,\n y: S,\n z: S,\n ) => Vec3<S>;\n abstract get _Vec4(): new (\n x: S,\n y: S,\n z: S,\n w: S,\n ) => Vec4<S>;\n\n static {\n // Defining 4-length swizzles\n for (let e0 = 0; e0 < 4; e0++) {\n for (let e1 = 0; e1 < 4; e1++) {\n for (let e2 = 0; e2 < 4; e2++) {\n for (let e3 = 0; e3 < 4; e3++) {\n const xyzwProp = `${XYZW[e0]}${XYZW[e1]}${XYZW[e2]}${XYZW[e3]}`;\n const rgbaProp = `${RGBA[e0]}${RGBA[e1]}${RGBA[e2]}${RGBA[e3]}`;\n Object.defineProperty(VecBase.prototype, xyzwProp, {\n get(this: VecBase<unknown>) {\n return new this._Vec4(this[e0], this[e1], this[e2], this[e3]);\n },\n });\n Object.defineProperty(VecBase.prototype, rgbaProp, {\n get(this: VecBase<unknown>) {\n return new this._Vec4(this[e0], this[e1], this[e2], this[e3]);\n },\n });\n }\n }\n }\n }\n\n // Defining 3-length swizzles\n for (let e0 = 0; e0 < 4; e0++) {\n for (let e1 = 0; e1 < 4; e1++) {\n for (let e2 = 0; e2 < 4; e2++) {\n const xyzwProp = `${XYZW[e0]}${XYZW[e1]}${XYZW[e2]}`;\n const rgbaProp = `${RGBA[e0]}${RGBA[e1]}${RGBA[e2]}`;\n Object.defineProperty(VecBase.prototype, xyzwProp, {\n get(this: VecBase<unknown>) {\n return new this._Vec3(this[e0], this[e1], this[e2]);\n },\n });\n Object.defineProperty(VecBase.prototype, rgbaProp, {\n get(this: VecBase<unknown>) {\n return new this._Vec3(this[e0], this[e1], this[e2]);\n },\n });\n }\n }\n }\n\n // Defining 2-length swizzles\n for (let e0 = 0; e0 < 4; e0++) {\n for (let e1 = 0; e1 < 4; e1++) {\n const xyzwProp = `${XYZW[e0]}${XYZW[e1]}`;\n const rgbaProp = `${RGBA[e0]}${RGBA[e1]}`;\n Object.defineProperty(VecBase.prototype, xyzwProp, {\n get(this: VecBase<unknown>) {\n return new this._Vec2(this[e0], this[e1]);\n },\n });\n Object.defineProperty(VecBase.prototype, rgbaProp, {\n get(this: VecBase<unknown>) {\n return new this._Vec2(this[e0], this[e1]);\n },\n });\n }\n }\n }\n\n castElement(): (v?: S) => S {\n return this[$internal].elementSchema;\n }\n\n [$resolve](): ResolvedSnippet {\n const schema = this[$internal].elementSchema;\n if (this.every((e) => !e)) {\n return snip(`${this.kind}()`, schema, /* origin */ 'constant');\n }\n if (this.every((e) => this[0] === e)) {\n return snip(`${this.kind}(${this[0]})`, schema, /* origin */ 'runtime');\n }\n return snip(`${this.kind}(${this.join(', ')})`, schema, /* origin */ 'runtime');\n }\n\n toString() {\n return this[$resolve]().value;\n }\n}\n\ntype Tuple2<S> = [S, S];\ntype Tuple3<S> = [S, S, S];\ntype Tuple4<S> = [S, S, S, S];\n\nabstract class Vec2<S> extends VecBase<S> implements Tuple2<S> {\n declare readonly length: 2;\n\n e0: S;\n e1: S;\n\n constructor(x?: S, y?: S) {\n super(2);\n this.e0 = this.castElement()(x);\n this.e1 = this.castElement()(y ?? x);\n }\n\n get 0() {\n return this.e0;\n }\n\n get 1() {\n return this.e1;\n }\n\n set 0(value: S) {\n this.e0 = this.castElement()(value);\n }\n\n set 1(value: S) {\n this.e1 = this.castElement()(value);\n }\n\n get x() {\n return this[0];\n }\n\n get y() {\n return this[1];\n }\n\n set x(value: S) {\n this[0] = this.castElement()(value);\n }\n\n set y(value: S) {\n this[1] = this.castElement()(value);\n }\n\n get r() {\n return this[0];\n }\n\n get g() {\n return this[1];\n }\n\n set r(value: S) {\n this[0] = this.castElement()(value);\n }\n\n set g(value: S) {\n this[1] = this.castElement()(value);\n }\n}\n\nabstract class Vec3<S> extends VecBase<S> implements Tuple3<S> {\n declare readonly length: 3;\n\n e0: S;\n e1: S;\n e2: S;\n\n constructor(x?: S, y?: S, z?: S) {\n super(3);\n this.e0 = this.castElement()(x);\n this.e1 = this.castElement()(y ?? x);\n this.e2 = this.castElement()(z ?? x);\n }\n\n get 0() {\n return this.e0;\n }\n\n get 1() {\n return this.e1;\n }\n\n get 2() {\n return this.e2;\n }\n\n set 0(value: S) {\n this.e0 = this.castElement()(value);\n }\n\n set 1(value: S) {\n this.e1 = this.castElement()(value);\n }\n\n set 2(value: S) {\n this.e2 = this.castElement()(value);\n }\n\n get x() {\n return this[0];\n }\n\n get y() {\n return this[1];\n }\n\n get z() {\n return this[2];\n }\n\n set x(value: S) {\n this[0] = this.castElement()(value);\n }\n\n set y(value: S) {\n this[1] = this.castElement()(value);\n }\n\n set z(value: S) {\n this[2] = this.castElement()(value);\n }\n\n get r() {\n return this[0];\n }\n\n get g() {\n return this[1];\n }\n\n get b() {\n return this[2];\n }\n\n set r(value: S) {\n this[0] = this.castElement()(value);\n }\n\n set g(value: S) {\n this[1] = this.castElement()(value);\n }\n\n set b(value: S) {\n this[2] = this.castElement()(value);\n }\n}\n\nabstract class Vec4<S> extends VecBase<S> implements Tuple4<S> {\n declare readonly length: 4;\n\n e0: S;\n e1: S;\n e2: S;\n e3: S;\n\n constructor(x?: S, y?: S, z?: S, w?: S) {\n super(4);\n this.e0 = this.castElement()(x);\n this.e1 = this.castElement()(y ?? x);\n this.e2 = this.castElement()(z ?? x);\n this.e3 = this.castElement()(w ?? x);\n }\n\n get 0() {\n return this.e0;\n }\n\n get 1() {\n return this.e1;\n }\n\n get 2() {\n return this.e2;\n }\n\n get 3() {\n return this.e3;\n }\n\n set 0(value: S) {\n this.e0 = this.castElement()(value);\n }\n\n set 1(value: S) {\n this.e1 = this.castElement()(value);\n }\n\n set 2(value: S) {\n this.e2 = this.castElement()(value);\n }\n\n set 3(value: S) {\n this.e3 = this.castElement()(value);\n }\n\n get x() {\n return this[0];\n }\n\n get y() {\n return this[1];\n }\n\n get r() {\n return this[0];\n }\n\n get g() {\n return this[1];\n }\n\n get b() {\n return this[2];\n }\n\n get a() {\n return this[3];\n }\n\n set r(value: S) {\n this[0] = value;\n }\n\n set g(value: S) {\n this[1] = value;\n }\n\n set b(value: S) {\n this[2] = value;\n }\n\n set a(value: S) {\n this[3] = value;\n }\n\n get z() {\n return this[2];\n }\n\n get w() {\n return this[3];\n }\n\n set x(value: S) {\n this[0] = value;\n }\n\n set y(value: S) {\n this[1] = value;\n }\n\n set z(value: S) {\n this[2] = value;\n }\n\n set w(value: S) {\n this[3] = value;\n }\n}\n\nexport class Vec2fImpl extends Vec2<number> {\n get [$internal]() {\n return {\n elementSchema: f32,\n };\n }\n\n get kind() {\n return 'vec2f' as const;\n }\n\n get _Vec2() {\n return Vec2fImpl;\n }\n get _Vec3() {\n return Vec3fImpl;\n }\n get _Vec4() {\n return Vec4fImpl;\n }\n}\n\nexport class Vec2hImpl extends Vec2<number> {\n get [$internal]() {\n return {\n elementSchema: f16,\n };\n }\n\n get kind() {\n return 'vec2h' as const;\n }\n\n get _Vec2() {\n return Vec2hImpl;\n }\n get _Vec3() {\n return Vec3hImpl;\n }\n get _Vec4() {\n return Vec4hImpl;\n }\n}\n\nexport class Vec2iImpl extends Vec2<number> {\n get [$internal]() {\n return {\n elementSchema: i32,\n };\n }\n\n get kind() {\n return 'vec2i' as const;\n }\n\n get _Vec2() {\n return Vec2iImpl;\n }\n get _Vec3() {\n return Vec3iImpl;\n }\n get _Vec4() {\n return Vec4iImpl;\n }\n}\n\nexport class Vec2uImpl extends Vec2<number> {\n get [$internal]() {\n return {\n elementSchema: u32,\n };\n }\n\n get kind() {\n return 'vec2u' as const;\n }\n\n get _Vec2() {\n return Vec2uImpl;\n }\n get _Vec3() {\n return Vec3uImpl;\n }\n get _Vec4() {\n return Vec4uImpl;\n }\n}\n\nexport class Vec2bImpl extends Vec2<boolean> {\n get [$internal]() {\n return {\n elementSchema: bool,\n };\n }\n\n get kind() {\n return 'vec2<bool>' as const;\n }\n\n get _Vec2() {\n return Vec2bImpl;\n }\n get _Vec3() {\n return Vec3bImpl;\n }\n get _Vec4() {\n return Vec4bImpl;\n }\n}\n\nexport class Vec3fImpl extends Vec3<number> {\n get [$internal]() {\n return {\n elementSchema: f32,\n };\n }\n\n get kind() {\n return 'vec3f' as const;\n }\n\n get _Vec2() {\n return Vec2fImpl;\n }\n get _Vec3() {\n return Vec3fImpl;\n }\n get _Vec4() {\n return Vec4fImpl;\n }\n}\n\nexport class Vec3hImpl extends Vec3<number> {\n get [$internal]() {\n return {\n elementSchema: f16,\n };\n }\n\n get kind() {\n return 'vec3h' as const;\n }\n\n get _Vec2() {\n return Vec2hImpl;\n }\n get _Vec3() {\n return Vec3hImpl;\n }\n get _Vec4() {\n return Vec4hImpl;\n }\n}\n\nexport class Vec3iImpl extends Vec3<number> {\n get [$internal]() {\n return {\n elementSchema: i32,\n };\n }\n\n get kind() {\n return 'vec3i' as const;\n }\n\n get _Vec2() {\n return Vec2iImpl;\n }\n get _Vec3() {\n return Vec3iImpl;\n }\n get _Vec4() {\n return Vec4iImpl;\n }\n}\n\nexport class Vec3uImpl extends Vec3<number> {\n get [$internal]() {\n return {\n elementSchema: u32,\n };\n }\n\n get kind() {\n return 'vec3u' as const;\n }\n\n get _Vec2() {\n return Vec2uImpl;\n }\n get _Vec3() {\n return Vec3uImpl;\n }\n get _Vec4() {\n return Vec4uImpl;\n }\n}\n\nexport class Vec3bImpl extends Vec3<boolean> {\n get [$internal]() {\n return {\n elementSchema: bool,\n };\n }\n\n get kind() {\n return 'vec3<bool>' as const;\n }\n\n get _Vec2() {\n return Vec2bImpl;\n }\n get _Vec3() {\n return Vec3bImpl;\n }\n get _Vec4() {\n return Vec4bImpl;\n }\n}\n\nexport class Vec4fImpl extends Vec4<number> {\n get [$internal]() {\n return {\n elementSchema: f32,\n };\n }\n\n get kind() {\n return 'vec4f' as const;\n }\n\n get _Vec2() {\n return Vec2fImpl;\n }\n get _Vec3() {\n return Vec3fImpl;\n }\n get _Vec4() {\n return Vec4fImpl;\n }\n}\n\nexport class Vec4hImpl extends Vec4<number> {\n get [$internal]() {\n return {\n elementSchema: f16,\n };\n }\n\n get kind() {\n return 'vec4h' as const;\n }\n\n get _Vec2() {\n return Vec2hImpl;\n }\n get _Vec3() {\n return Vec3hImpl;\n }\n get _Vec4() {\n return Vec4hImpl;\n }\n}\n\nexport class Vec4iImpl extends Vec4<number> {\n get [$internal]() {\n return {\n elementSchema: i32,\n };\n }\n\n get kind() {\n return 'vec4i' as const;\n }\n\n get _Vec2() {\n return Vec2iImpl;\n }\n get _Vec3() {\n return Vec3iImpl;\n }\n get _Vec4() {\n return Vec4iImpl;\n }\n}\n\nexport class Vec4uImpl extends Vec4<number> {\n get [$internal]() {\n return {\n elementSchema: u32,\n };\n }\n\n get kind() {\n return 'vec4u' as const;\n }\n\n get _Vec2() {\n return Vec2uImpl;\n }\n get _Vec3() {\n return Vec3uImpl;\n }\n get _Vec4() {\n return Vec4uImpl;\n }\n}\n\nexport class Vec4bImpl extends Vec4<boolean> {\n get [$internal]() {\n return {\n elementSchema: bool,\n };\n }\n\n get kind() {\n return 'vec4<bool>' as const;\n }\n\n get _Vec2() {\n return Vec2bImpl;\n }\n get _Vec3() {\n return Vec3bImpl;\n }\n get _Vec4() {\n return Vec4bImpl;\n }\n}\n","import { callableSchema } from '../core/function/createCallableSchema.ts';\nimport { stitch } from '../core/resolve/stitch.ts';\nimport { $internal, $repr } from '../shared/symbols.ts';\nimport { bool, f16, f32, i32, u32 } from './numeric.ts';\nimport {\n Vec2bImpl,\n Vec2fImpl,\n Vec2hImpl,\n Vec2iImpl,\n Vec2uImpl,\n Vec3bImpl,\n Vec3fImpl,\n Vec3hImpl,\n Vec3iImpl,\n Vec3uImpl,\n Vec4bImpl,\n Vec4fImpl,\n Vec4hImpl,\n Vec4iImpl,\n Vec4uImpl,\n type VecBase,\n} from './vectorImpl.ts';\nimport type {\n AnyVecInstance,\n BaseData,\n Bool,\n F16,\n F32,\n I32,\n U32,\n Vec2b,\n Vec2f,\n Vec2h,\n Vec2i,\n Vec2u,\n Vec3b,\n Vec3f,\n Vec3h,\n Vec3i,\n Vec3u,\n Vec4b,\n Vec4f,\n Vec4h,\n Vec4i,\n Vec4u,\n} from './wgslTypes.ts';\nimport { isVec } from './wgslTypes.ts';\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Schema representing vec2f - a vector with 2 elements of type f32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec2f(); // (0.0, 0.0)\n * const vector = d.vec2f(1); // (1.0, 1.0)\n * const vector = d.vec2f(0.5, 0.1); // (0.5, 0.1)\n *\n * @example\n * const buffer = root.createBuffer(d.vec2f, d.vec2f(0, 1)); // buffer holding a d.vec2f value, with an initial value of vec2f(0, 1);\n */\nexport const vec2f = makeVecSchema(Vec2fImpl, f32) as Vec2f;\n\n/**\n * Schema representing vec2h - a vector with 2 elements of type f16.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec2h(); // (0.0, 0.0)\n * const vector = d.vec2h(1); // (1.0, 1.0)\n * const vector = d.vec2h(0.5, 0.1); // (0.5, 0.1)\n *\n * @example\n * const buffer = root.createBuffer(d.vec2h, d.vec2h(0, 1)); // buffer holding a d.vec2h value, with an initial value of vec2h(0, 1);\n */\nexport const vec2h = makeVecSchema(Vec2hImpl, f16) as Vec2h;\n\n/**\n * Schema representing vec2i - a vector with 2 elements of type i32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec2i(); // (0, 0)\n * const vector = d.vec2i(1); // (1, 1)\n * const vector = d.vec2i(-1, 1); // (-1, 1)\n *\n * @example\n * const buffer = root.createBuffer(d.vec2i, d.vec2i(0, 1)); // buffer holding a d.vec2i value, with an initial value of vec2i(0, 1);\n */\nexport const vec2i = makeVecSchema(Vec2iImpl, i32) as Vec2i;\n\n/**\n * Schema representing vec2u - a vector with 2 elements of type u32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec2u(); // (0, 0)\n * const vector = d.vec2u(1); // (1, 1)\n * const vector = d.vec2u(1, 2); // (1, 2)\n *\n * @example\n * const buffer = root.createBuffer(d.vec2u, d.vec2u(0, 1)); // buffer holding a d.vec2u value, with an initial value of vec2u(0, 1);\n */\nexport const vec2u = makeVecSchema(Vec2uImpl, u32) as Vec2u;\n\n/**\n * Schema representing `vec2<bool>` - a vector with 2 elements of type `bool`.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec2b(); // (false, false)\n * const vector = d.vec2b(true); // (true, true)\n * const vector = d.vec2b(false, true); // (false, true)\n */\nexport const vec2b = makeVecSchema(Vec2bImpl, bool) as Vec2b;\n\n/**\n * Schema representing vec3f - a vector with 3 elements of type f32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec3f(); // (0.0, 0.0, 0.0)\n * const vector = d.vec3f(1); // (1.0, 1.0, 1.0)\n * const vector = d.vec3f(1, 2, 3.5); // (1.0, 2.0, 3.5)\n *\n * @example\n * const buffer = root.createBuffer(d.vec3f, d.vec3f(0, 1, 2)); // buffer holding a d.vec3f value, with an initial value of vec3f(0, 1, 2);\n */\nexport const vec3f = makeVecSchema(Vec3fImpl, f32) as Vec3f;\n\n/**\n * Schema representing vec3h - a vector with 3 elements of type f16.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec3h(); // (0.0, 0.0, 0.0)\n * const vector = d.vec3h(1); // (1.0, 1.0, 1.0)\n * const vector = d.vec3h(1, 2, 3.5); // (1.0, 2.0, 3.5)\n *\n * @example\n * const buffer = root.createBuffer(d.vec3h, d.vec3h(0, 1, 2)); // buffer holding a d.vec3h value, with an initial value of vec3h(0, 1, 2);\n */\nexport const vec3h = makeVecSchema(Vec3hImpl, f16) as Vec3h;\n\n/**\n * Schema representing vec3i - a vector with 3 elements of type i32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec3i(); // (0, 0, 0)\n * const vector = d.vec3i(1); // (1, 1, 1)\n * const vector = d.vec3i(1, 2, -3); // (1, 2, -3)\n *\n * @example\n * const buffer = root.createBuffer(d.vec3i, d.vec3i(0, 1, 2)); // buffer holding a d.vec3i value, with an initial value of vec3i(0, 1, 2);\n */\nexport const vec3i = makeVecSchema(Vec3iImpl, i32) as Vec3i;\n\n/**\n * Schema representing vec3u - a vector with 3 elements of type u32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec3u(); // (0, 0, 0)\n * const vector = d.vec3u(1); // (1, 1, 1)\n * const vector = d.vec3u(1, 2, 3); // (1, 2, 3)\n *\n * @example\n * const buffer = root.createBuffer(d.vec3u, d.vec3u(0, 1, 2)); // buffer holding a d.vec3u value, with an initial value of vec3u(0, 1, 2);\n */\nexport const vec3u = makeVecSchema(Vec3uImpl, u32) as Vec3u;\n\n/**\n * Schema representing `vec3<bool>` - a vector with 3 elements of type `bool`.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec3b(); // (false, false, false)\n * const vector = d.vec3b(true); // (true, true, true)\n * const vector = d.vec3b(false, true, false); // (false, true, false)\n */\nexport const vec3b = makeVecSchema(Vec3bImpl, bool) as Vec3b;\n\n/**\n * Schema representing vec4f - a vector with 4 elements of type f32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec4f(); // (0.0, 0.0, 0.0, 0.0)\n * const vector = d.vec4f(1); // (1.0, 1.0, 1.0, 1.0)\n * const vector = d.vec4f(1, 2, 3, 4.5); // (1.0, 2.0, 3.0, 4.5)\n *\n * @example\n * const buffer = root.createBuffer(d.vec4f, d.vec4f(0, 1, 2, 3)); // buffer holding a d.vec4f value, with an initial value of vec4f(0, 1, 2, 3);\n */\nexport const vec4f = makeVecSchema(Vec4fImpl, f32) as Vec4f;\n\n/**\n * Schema representing vec4h - a vector with 4 elements of type f16.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec4h(); // (0.0, 0.0, 0.0, 0.0)\n * const vector = d.vec4h(1); // (1.0, 1.0, 1.0, 1.0)\n * const vector = d.vec4h(1, 2, 3, 4.5); // (1.0, 2.0, 3.0, 4.5)\n *\n * @example\n * const buffer = root.createBuffer(d.vec4h, d.vec4h(0, 1, 2, 3)); // buffer holding a d.vec4h value, with an initial value of vec4h(0, 1, 2, 3);\n */\nexport const vec4h = makeVecSchema(Vec4hImpl, f16) as Vec4h;\n\n/**\n * Schema representing vec4i - a vector with 4 elements of type i32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec4i(); // (0, 0, 0, 0)\n * const vector = d.vec4i(1); // (1, 1, 1, 1)\n * const vector = d.vec4i(1, 2, 3, -4); // (1, 2, 3, -4)\n *\n * @example\n * const buffer = root.createBuffer(d.vec4i, d.vec4i(0, 1, 2, 3)); // buffer holding a d.vec4i value, with an initial value of vec4i(0, 1, 2, 3);\n */\nexport const vec4i = makeVecSchema(Vec4iImpl, i32) as Vec4i;\n\n/**\n * Schema representing vec4u - a vector with 4 elements of type u32.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec4u(); // (0, 0, 0, 0)\n * const vector = d.vec4u(1); // (1, 1, 1, 1)\n * const vector = d.vec4u(1, 2, 3, 4); // (1, 2, 3, 4)\n *\n * @example\n * const buffer = root.createBuffer(d.vec4u, d.vec4u(0, 1, 2, 3)); // buffer holding a d.vec4u value, with an initial value of vec4u(0, 1, 2, 3);\n */\nexport const vec4u = makeVecSchema(Vec4uImpl, u32) as Vec4u;\n\n/**\n * Schema representing `vec4<bool>` - a vector with 4 elements of type `bool`.\n * Also a constructor function for this vector value.\n *\n * @example\n * const vector = d.vec4b(); // (false, false, false, false)\n * const vector = d.vec4b(true); // (true, true, true, true)\n * const vector = d.vec4b(false, true, false, true); // (false, true, false, true)\n */\nexport const vec4b = makeVecSchema(Vec4bImpl, bool) as Vec4b;\n\n// --------------\n// Implementation\n// --------------\n\nexport const vecTypeToConstructor = {\n vec2f,\n vec2h,\n vec2i,\n vec2u,\n 'vec2<bool>': vec2b,\n vec3f,\n vec3h,\n vec3i,\n vec3u,\n 'vec3<bool>': vec3b,\n vec4f,\n vec4h,\n vec4i,\n vec4u,\n 'vec4<bool>': vec4b,\n} as const;\n\ntype VecSchemaBase<TValue> = {\n readonly type: string;\n readonly componentCount: 2 | 3 | 4;\n readonly [$repr]: TValue;\n};\n\nfunction makeVecSchema<TValue, S extends number | boolean>(\n VecImpl: new (...args: S[]) => VecBase<S>,\n primitive: F32 | F16 | I32 | U32 | Bool,\n): VecSchemaBase<TValue> & ((...args: (S | AnyVecInstance)[]) => TValue) {\n const { kind: type, length } = new VecImpl();\n const componentCount = length as 2 | 3 | 4;\n\n const cpuConstruct = (...args: (S | AnyVecInstance)[]): TValue => {\n const values: S[] = Array.from({ length: args.length });\n\n let j = 0;\n for (const arg of args) {\n if (typeof arg === 'number' || typeof arg === 'boolean') {\n values[j++] = arg;\n } else {\n for (let c = 0; c < arg.length; ++c) {\n values[j++] = arg[c] as S;\n }\n }\n }\n\n if (values.length <= 1 || values.length === componentCount) {\n return new VecImpl(...values) as TValue;\n }\n\n throw new Error(\n `'${type}' constructor called with invalid number of arguments.`,\n );\n };\n\n const construct = callableSchema({\n name: type,\n signature: (...args) => ({\n argTypes: args.map((arg) => isVec(arg) ? arg : primitive),\n returnType: schema as unknown as BaseData,\n }),\n normalImpl: cpuConstruct,\n codegenImpl: (_ctx, args) => {\n if (\n args.length === 1 && args[0]?.dataType === schema as unknown as BaseData\n ) {\n // Already typed as the schema\n return stitch`${args[0]}`;\n }\n return stitch`${type}(${args})`;\n },\n });\n\n const schema:\n & VecSchemaBase<TValue>\n & ((...args: (S | AnyVecInstance)[]) => TValue) = Object.assign(construct, {\n [$internal]: {},\n type,\n primitive,\n componentCount,\n [$repr]: undefined as TValue,\n });\n\n // TODO: Remove workaround\n // it's a workaround for circular dependencies caused by us using schemas in the shader generator\n VecImpl.prototype.schema = schema;\n\n return schema;\n}\n","import { invariant } from './errors.ts';\n\nconst bannedTokens = new Set([\n // keywords\n 'alias',\n 'break',\n 'case',\n 'const',\n 'const_assert',\n 'continue',\n 'continuing',\n 'default',\n 'diagnostic',\n 'discard',\n 'else',\n 'enable',\n 'false',\n 'fn',\n 'for',\n 'if',\n 'let',\n 'loop',\n 'override',\n 'requires',\n 'return',\n 'struct',\n 'switch',\n 'true',\n 'var',\n 'while',\n // reserved words\n 'NULL',\n 'Self',\n 'abstract',\n 'active',\n 'alignas',\n 'alignof',\n 'as',\n 'asm',\n 'asm_fragment',\n 'async',\n 'attribute',\n 'auto',\n 'await',\n 'become',\n 'cast',\n 'catch',\n 'class',\n 'co_await',\n 'co_return',\n 'co_yield',\n 'coherent',\n 'column_major',\n 'common',\n 'compile',\n 'compile_fragment',\n 'concept',\n 'const_cast',\n 'consteval',\n 'constexpr',\n 'constinit',\n 'crate',\n 'debugger',\n 'decltype',\n 'delete',\n 'demote',\n 'demote_to_helper',\n 'do',\n 'dynamic_cast',\n 'enum',\n 'explicit',\n 'export',\n 'extends',\n 'extern',\n 'external',\n 'fallthrough',\n 'filter',\n 'final',\n 'finally',\n 'friend',\n 'from',\n 'fxgroup',\n 'get',\n 'goto',\n 'groupshared',\n 'highp',\n 'impl',\n 'implements',\n 'import',\n 'inline',\n 'instanceof',\n 'interface',\n 'layout',\n 'lowp',\n 'macro',\n 'macro_rules',\n 'match',\n 'mediump',\n 'meta',\n 'mod',\n 'module',\n 'move',\n 'mut',\n 'mutable',\n 'namespace',\n 'new',\n 'nil',\n 'noexcept',\n 'noinline',\n 'nointerpolation',\n 'non_coherent',\n 'noncoherent',\n 'noperspective',\n 'null',\n 'nullptr',\n 'of',\n 'operator',\n 'package',\n 'packoffset',\n 'partition',\n 'pass',\n 'patch',\n 'pixelfragment',\n 'precise',\n 'precision',\n 'premerge',\n 'priv',\n 'protected',\n 'pub',\n 'public',\n 'readonly',\n 'ref',\n 'regardless',\n 'register',\n 'reinterpret_cast',\n 'require',\n 'resource',\n 'restrict',\n 'self',\n 'set',\n 'shared',\n 'sizeof',\n 'smooth',\n 'snorm',\n 'static',\n 'static_assert',\n 'static_cast',\n 'std',\n 'subroutine',\n 'super',\n 'target',\n 'template',\n 'this',\n 'thread_local',\n 'throw',\n 'trait',\n 'try',\n 'type',\n 'typedef',\n 'typeid',\n 'typename',\n 'typeof',\n 'union',\n 'unless',\n 'unorm',\n 'unsafe',\n 'unsized',\n 'use',\n 'using',\n 'varying',\n 'virtual',\n 'volatile',\n 'wgsl',\n 'where',\n 'with',\n 'writeonly',\n 'yield',\n // Keywords that should be reserved\n 'sampler',\n 'uniform',\n 'storage',\n]);\n\nconst builtins = new Set([\n // constructors\n 'array',\n 'bool',\n 'f16',\n 'f32',\n 'i32',\n 'u32',\n 'mat2x2',\n 'mat2x3',\n 'mat2x4',\n 'mat3x2',\n 'mat3x3',\n 'mat3x4',\n 'mat4x2',\n 'mat4x3',\n 'mat4x4',\n 'vec2',\n 'vec3',\n 'vec4',\n // bitcast\n 'bitcast',\n // logical\n 'all',\n 'any',\n 'select',\n // array\n 'arrayLength',\n // numeric\n 'abs',\n 'acos',\n 'acosh',\n 'asin',\n 'asinh',\n 'atan',\n 'atanh',\n 'atan2',\n 'ceil',\n 'clamp',\n 'cos',\n 'cosh',\n 'countLeadingZeros',\n 'countOneBits',\n 'countTrailingZeros',\n 'cross',\n 'degrees',\n 'determinant',\n 'distance',\n 'dot',\n 'dot4U8Packed',\n 'dot4I8Packed',\n 'exp',\n 'exp2',\n 'extractBits',\n 'faceForward',\n 'firstLeadingBit',\n 'firstTrailingBit',\n 'floor',\n 'fma',\n 'fract',\n 'frexp',\n 'insertBits',\n 'inverseSqrt',\n 'ldexp',\n 'length',\n 'log',\n 'log2',\n 'max',\n 'min',\n 'mix',\n 'modf',\n 'normalize',\n 'pow',\n 'quantizeToF16',\n 'radians',\n 'reflect',\n 'refract',\n 'reverseBits',\n 'round',\n 'saturate',\n 'sign',\n 'sin',\n 'sinh',\n 'smoothstep',\n 'sqrt',\n 'step',\n 'tan',\n 'tanh',\n 'transpose',\n 'trunc',\n // derivative\n 'dpdx',\n 'dpdxCoarse',\n 'dpdxFine',\n 'dpdy',\n 'dpdyCoarse',\n 'dpdyFine',\n 'fwidth',\n 'fwidthCoarse',\n 'fwidthFine',\n // texture\n 'textureDimensions',\n 'textureGather',\n 'textureGatherCompare',\n 'textureLoad',\n 'textureNumLayers',\n 'textureNumLevels',\n 'textureNumSamples',\n 'textureSample',\n 'textureSampleBias',\n 'textureSampleCompare',\n 'textureSampleCompareLevel',\n 'textureSampleGrad',\n 'textureSampleLevel',\n 'textureSampleBaseClampToEdge',\n 'textureStore',\n // atomic\n 'atomicLoad',\n 'atomicStore',\n 'atomicAdd',\n 'atomicSub',\n 'atomicMax',\n 'atomicMin',\n 'atomicAnd',\n 'atomicOr',\n 'atomicXor',\n 'atomicExchange',\n 'atomicCompareExchangeWeak',\n // data packing\n 'pack4x8snorm',\n 'pack4x8unorm',\n 'pack4xI8',\n 'pack4xU8',\n 'pack4xI8Clamp',\n 'pack4xU8Clamp',\n 'pack2x16snorm',\n 'pack2x16unorm',\n 'pack2x16float',\n // data unpacking\n 'unpack4x8snorm',\n 'unpack4x8unorm',\n 'unpack4xI8',\n 'unpack4xU8',\n 'unpack2x16snorm',\n 'unpack2x16unorm',\n 'unpack2x16float',\n // synchronization\n 'storageBarrier',\n 'textureBarrier',\n 'workgroupBarrier',\n 'workgroupUniformLoad',\n // subgroup\n 'subgroupAdd',\n 'subgroupExclusiveAdd',\n 'subgroupInclusiveAdd',\n 'subgroupAll',\n 'subgroupAnd',\n 'subgroupAny',\n 'subgroupBallot',\n 'subgroupBroadcast',\n 'subgroupBroadcastFirst',\n 'subgroupElect',\n 'subgroupMax',\n 'subgroupMin',\n 'subgroupMul',\n 'subgroupExclusiveMul',\n 'subgroupInclusiveMul',\n 'subgroupOr',\n 'subgroupShuffle',\n 'subgroupShuffleDown',\n 'subgroupShuffleUp',\n 'subgroupShuffleXor',\n 'subgroupXor',\n // quad operations\n 'quadBroadcast',\n 'quadSwapDiagonal',\n 'quadSwapX',\n 'quadSwapY',\n]);\n\nexport interface NameRegistry {\n /**\n * Creates a valid WGSL identifier, each guaranteed to be unique\n * in the lifetime of a single resolution process\n * (excluding non-global identifiers from popped scopes).\n * Should append \"_\" to primer, followed by some id.\n * @param primer Used in the generation process, makes the identifier more recognizable.\n * @param global Whether the name should be registered in the global scope (true), or in the current function scope (false)\n */\n makeUnique(primer: string | undefined, global: boolean): string;\n\n /**\n * Creates a valid WGSL identifier.\n * Renames identifiers that are WGSL reserved words.\n * @param primer Used in the generation process.\n *\n * @example\n * makeValid(\"notAKeyword\"); // \"notAKeyword\"\n * makeValid(\"struct\"); // makeUnique(\"struct\")\n * makeValid(\"struct_1\"); // makeUnique(\"struct_1\") (to avoid potential name collisions)\n * makeValid(\"_\"); // ERROR (too difficult to make valid to care)\n */\n makeValid(primer: string): string;\n\n pushFunctionScope(): void;\n popFunctionScope(): void;\n pushBlockScope(): void;\n popBlockScope(): void;\n}\n\nfunction sanitizePrimer(primer: string | undefined) {\n if (primer) {\n // sanitizing\n return primer\n .replaceAll(/\\s/g, '_') // whitespaces\n .replaceAll(/[^\\w\\d]/g, ''); // removing illegal characters\n }\n return 'item';\n}\n\n/**\n * A function for checking whether an identifier needs renaming.\n * Throws if provided with an invalid identifier that cannot be easily renamed.\n * @example\n * isValidIdentifier(\"ident\"); // true\n * isValidIdentifier(\"struct\"); // false\n * isValidIdentifier(\"struct_1\"); // false\n * isValidIdentifier(\"_\"); // ERROR\n * isValidIdentifier(\"my variable\"); // ERROR\n */\nfunction isValidIdentifier(ident: string): boolean {\n if (ident === '_' || ident.startsWith('__') || /\\s/.test(ident)) {\n throw new Error(\n `Invalid identifier '${ident}'. Choose an identifier without whitespaces or leading underscores.`,\n );\n }\n const prefix = ident.split('_')[0] as string;\n return !bannedTokens.has(prefix) && !builtins.has(prefix);\n}\n\n/**\n * Same as `isValidIdentifier`, except does not check for builtin clashes.\n */\nexport function isValidProp(ident: string): boolean {\n if (ident === '_' || ident.startsWith('__') || /\\s/.test(ident)) {\n throw new Error(\n `Invalid identifier '${ident}'. Choose an identifier without whitespaces or leading underscores.`,\n );\n }\n const prefix = ident.split('_')[0] as string;\n return !bannedTokens.has(prefix);\n}\ntype FunctionScopeLayer = {\n type: 'functionScope';\n};\n\ntype BlockScopeLayer = {\n type: 'blockScope';\n usedBlockScopeNames: Set<string>;\n};\n\ntype ScopeLayer = FunctionScopeLayer | BlockScopeLayer;\n\nabstract class NameRegistryImpl implements NameRegistry {\n abstract getUniqueVariant(base: string): string;\n\n readonly #usedNames: Set<string>;\n readonly #scopeStack: ScopeLayer[];\n\n constructor() {\n this.#usedNames = new Set<string>([\n ...bannedTokens,\n ...builtins,\n ]);\n this.#scopeStack = [];\n }\n\n get #usedBlockScopeNames(): Set<string> | undefined {\n return (this.#scopeStack[this.#scopeStack.length - 1] as\n | BlockScopeLayer\n | undefined)?.usedBlockScopeNames;\n }\n\n makeUnique(primer: string | undefined, global: boolean): string {\n const sanitizedPrimer = sanitizePrimer(primer);\n const name = this.getUniqueVariant(sanitizedPrimer);\n\n if (global) {\n this.#usedNames.add(name);\n } else {\n this.#usedBlockScopeNames?.add(name);\n }\n\n return name;\n }\n\n #isUsedInBlocksBefore(name: string): boolean {\n const functionScopeIndex = this.#scopeStack.findLastIndex((scope) =>\n scope.type === 'functionScope'\n );\n return this.#scopeStack.slice(functionScopeIndex + 1).some((scope) =>\n (scope as BlockScopeLayer).usedBlockScopeNames.has(name)\n );\n }\n\n makeValid(primer: string): string {\n if (\n isValidIdentifier(primer) && !this.#usedNames.has(primer) &&\n !this.#isUsedInBlocksBefore(primer)\n ) {\n this.#usedBlockScopeNames?.add(primer);\n return primer;\n }\n return this.makeUnique(primer, false);\n }\n\n isUsed(name: string): boolean {\n return this.#usedNames.has(name) || this.#isUsedInBlocksBefore(name);\n }\n\n pushFunctionScope(): void {\n this.#scopeStack.push({ type: 'functionScope' });\n this.#scopeStack.push({\n type: 'blockScope',\n usedBlockScopeNames: new Set(),\n });\n }\n\n popFunctionScope(): void {\n const functionScopeIndex = this.#scopeStack.findLastIndex((scope) =>\n scope.type === 'functionScope'\n );\n\n if (functionScopeIndex === -1) {\n throw new Error('Tried to pop function scope when no scope was present.');\n }\n\n this.#scopeStack.splice(functionScopeIndex);\n }\n\n pushBlockScope(): void {\n this.#scopeStack.push({\n type: 'blockScope',\n usedBlockScopeNames: new Set(),\n });\n }\n popBlockScope(): void {\n invariant(\n this.#scopeStack[this.#scopeStack.length - 1]?.type === 'blockScope',\n 'Tried to pop block scope, but it is not present',\n );\n this.#scopeStack.pop();\n }\n}\n\nexport class RandomNameRegistry extends NameRegistryImpl {\n #lastUniqueId = 0;\n\n getUniqueVariant(base: string): string {\n let name = `${base}_${this.#lastUniqueId++}`;\n while (this.isUsed(name)) {\n name = `${base}_${this.#lastUniqueId++}`;\n }\n return name;\n }\n}\n\nexport class StrictNameRegistry extends NameRegistryImpl {\n getUniqueVariant(base: string): string {\n let index = 0;\n let name = base;\n while (this.isUsed(name)) {\n index++;\n name = `${base}_${index}`;\n }\n return name;\n }\n}\n","import { isValidProp } from '../nameRegistry.ts';\nimport { getName, setName } from '../shared/meta.ts';\nimport { $internal } from '../shared/symbols.ts';\nimport { schemaCallWrapper } from './schemaCallWrapper.ts';\nimport type { AnyWgslData, BaseData, WgslStruct } from './wgslTypes.ts';\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Creates a struct schema that can be used to construct GPU buffers.\n * Ensures proper alignment and padding of properties (as opposed to a `d.unstruct` schema).\n * The order of members matches the passed in properties object.\n *\n * @example\n * const CircleStruct = d.struct({ radius: d.f32, pos: d.vec3f });\n *\n * @param props Record with `string` keys and `TgpuData` values,\n * each entry describing one struct member.\n */\nexport function struct<TProps extends Record<string, AnyWgslData>>(\n props: TProps,\n): WgslStruct<TProps> {\n return INTERNAL_createStruct(props, false);\n}\n\nexport function abstruct<TProps extends Record<string, AnyWgslData>>(\n props: TProps,\n): WgslStruct<TProps> {\n return INTERNAL_createStruct(props, true);\n}\n\n// --------------\n// Implementation\n// --------------\n\nexport function INTERNAL_createStruct<TProps extends Record<string, BaseData>>(\n props: TProps,\n isAbstruct: boolean,\n): WgslStruct<TProps> {\n Object.keys(props).forEach((key) => {\n if (!isValidProp(key)) {\n throw new Error(\n `Property key '${key}' is a reserved WGSL word. Choose a different name.`,\n );\n }\n });\n\n // In the schema call, create and return a deep copy\n // by wrapping all the values in corresponding schema calls.\n const structSchema = (instanceProps?: TProps) =>\n Object.fromEntries(\n Object.entries(props).map(([key, schema]) => [\n key,\n schemaCallWrapper(schema, instanceProps?.[key]),\n ]),\n );\n\n Object.setPrototypeOf(structSchema, WgslStructImpl);\n structSchema.propTypes = props;\n Object.defineProperty(structSchema, $internal, {\n value: {\n isAbstruct,\n },\n });\n\n return structSchema as WgslStruct<TProps>;\n}\n\nconst WgslStructImpl = {\n type: 'struct',\n\n $name(label: string) {\n setName(this, label);\n return this;\n },\n\n toString(): string {\n return `struct:${getName(this) ?? '<unnamed>'}`;\n },\n};\n","import { UnknownData } from '../data/dataTypes.ts';\nimport { abstractFloat, abstractInt, bool, f32, i32 } from '../data/numeric.ts';\nimport { isRef } from '../data/ref.ts';\nimport {\n isEphemeralSnippet,\n isSnippet,\n type ResolvedSnippet,\n snip,\n type Snippet,\n} from '../data/snippet.ts';\nimport {\n type AnyWgslData,\n type BaseData,\n type F32,\n type I32,\n isMatInstance,\n isNaturallyEphemeral,\n isVecInstance,\n type WgslArray,\n WORKAROUND_getSchema,\n} from '../data/wgslTypes.ts';\nimport {\n type FunctionScopeLayer,\n getOwnSnippet,\n type ResolutionCtx,\n type SelfResolvable,\n} from '../types.ts';\nimport type { ShelllessRepository } from './shellless.ts';\nimport { stitch } from '../../src/core/resolve/stitch.ts';\nimport { WgslTypeError } from '../../src/errors.ts';\nimport { $internal, $resolve } from '../../src/shared/symbols.ts';\n\nexport function numericLiteralToSnippet(value: number): Snippet {\n if (value >= 2 ** 63 || value < -(2 ** 63)) {\n return snip(value, abstractFloat, /* origin */ 'constant');\n }\n // WGSL AbstractInt uses 64-bit precision, but JS numbers are only safe up to 2^53 - 1.\n // Warn when values exceed this range to prevent precision loss.\n if (Number.isInteger(value)) {\n if (!Number.isSafeInteger(value)) {\n console.warn(\n `The integer ${value} exceeds the safe integer range and may have lost precision.`,\n );\n }\n return snip(value, abstractInt, /* origin */ 'constant');\n }\n return snip(value, abstractFloat, /* origin */ 'constant');\n}\n\nexport function concretize<T extends BaseData>(type: T): T | F32 | I32 {\n if (type.type === 'abstractFloat') {\n return f32;\n }\n\n if (type.type === 'abstractInt') {\n return i32;\n }\n\n return type;\n}\n\nexport function concretizeSnippet(snippet: Snippet): Snippet {\n return snip(\n snippet.value,\n concretize(snippet.dataType as AnyWgslData),\n snippet.origin,\n );\n}\n\nexport function concretizeSnippets(args: Snippet[]): Snippet[] {\n return args.map(concretizeSnippet);\n}\n\nexport type GenerationCtx = ResolutionCtx & {\n readonly pre: string;\n /**\n * Used by `typedExpression` to signal downstream\n * expression resolution what type is expected of them.\n *\n * It is used exclusively for inferring the types of structs and arrays.\n * It is modified exclusively by `typedExpression` function.\n */\n expectedType: (BaseData | BaseData[]) | undefined;\n\n readonly topFunctionScope: FunctionScopeLayer | undefined;\n readonly topFunctionReturnType: BaseData | undefined;\n\n indent(): string;\n dedent(): string;\n pushBlockScope(): void;\n popBlockScope(): void;\n generateLog(op: string, args: Snippet[]): Snippet;\n getById(id: string): Snippet | null;\n defineVariable(id: string, snippet: Snippet): void;\n setBlockExternals(externals: Record<string, Snippet>): void;\n clearBlockExternals(): void;\n\n /**\n * Types that are used in `return` statements are\n * reported using this function, and used to infer\n * the return type of the owning function.\n */\n reportReturnType(dataType: BaseData): void;\n\n readonly shelllessRepo: ShelllessRepository;\n};\n\nexport function coerceToSnippet(value: unknown): Snippet {\n if (isSnippet(value)) {\n // Already a snippet\n return value;\n }\n\n if (isRef(value)) {\n throw new Error('Cannot use refs (d.ref(...)) from the outer scope.');\n }\n\n // Maybe the value can tell us what snippet it is\n const ownSnippet = getOwnSnippet(value);\n if (ownSnippet) {\n return ownSnippet;\n }\n\n if (isVecInstance(value) || isMatInstance(value)) {\n return snip(value, WORKAROUND_getSchema(value), /* origin */ 'constant');\n }\n\n if (\n typeof value === 'string' || typeof value === 'function' ||\n typeof value === 'object' || typeof value === 'symbol' ||\n typeof value === 'undefined' || value === null\n ) {\n // Nothing representable in WGSL as-is, so unknown\n return snip(value, UnknownData, /* origin */ 'constant');\n }\n\n if (typeof value === 'number') {\n return numericLiteralToSnippet(value);\n }\n\n if (typeof value === 'boolean') {\n return snip(value, bool, /* origin */ 'constant');\n }\n\n return snip(value, UnknownData, /* origin */ 'constant');\n}\n\n/**\n * Intermediate representation for WGSL array expressions.\n * Defers resolution. Stores array elements as snippets so the\n * generator can access them when needed.\n */\nexport class ArrayExpression implements SelfResolvable {\n readonly [$internal] = true;\n\n constructor(\n public readonly type: WgslArray<AnyWgslData>,\n public readonly elements: Snippet[],\n ) {\n }\n\n toString(): string {\n return 'ArrayExpression';\n }\n\n [$resolve](ctx: ResolutionCtx): ResolvedSnippet {\n for (const elem of this.elements) {\n // We check if there are no references among the elements\n if (\n (elem.origin === 'argument' &&\n !isNaturallyEphemeral(elem.dataType)) ||\n !isEphemeralSnippet(elem)\n ) {\n const snippetStr = ctx.resolve(elem.value, elem.dataType).value;\n const snippetType =\n ctx.resolve(concretize(elem.dataType as BaseData)).value;\n throw new WgslTypeError(\n `'${snippetStr}' reference cannot be used in an array constructor.\\n-----\\nTry '${snippetType}(${snippetStr})' or 'arrayOf(${snippetType}, count)([...])' to copy the value instead.\\n-----`,\n );\n }\n }\n\n const arrayType = `array<${\n ctx.resolve(this.type.elementType).value\n }, ${this.elements.length}>`;\n\n return snip(\n stitch`${arrayType}(${this.elements})`,\n this.type,\n /* origin */ 'runtime',\n );\n }\n}\n","import { type MapValueToSnippet, snip } from '../../data/snippet.ts';\nimport { setName } from '../../shared/meta.ts';\nimport { $gpuCallable } from '../../shared/symbols.ts';\nimport { tryConvertSnippet } from '../../tgsl/conversion.ts';\nimport { concretize } from '../../tgsl/generationHelpers.ts';\nimport {\n type DualFn,\n isKnownAtComptime,\n NormalState,\n type ResolutionCtx,\n} from '../../types.ts';\nimport { type BaseData, isPtr } from '../../data/wgslTypes.ts';\n\ntype MapValueToDataType<T> = { [K in keyof T]: BaseData };\ntype AnyFn = (...args: never[]) => unknown;\n\ninterface DualImplOptions<T extends AnyFn> {\n readonly name: string | undefined;\n readonly normalImpl: T | string;\n readonly codegenImpl: (\n ctx: ResolutionCtx,\n args: MapValueToSnippet<Parameters<T>>,\n ) => string;\n readonly signature:\n | {\n argTypes: (BaseData | BaseData[])[];\n returnType: BaseData;\n }\n | ((\n ...inArgTypes: MapValueToDataType<Parameters<T>>\n ) => { argTypes: (BaseData | BaseData[])[]; returnType: BaseData });\n /**\n * Whether the function should skip trying to execute the \"normal\" implementation if\n * all arguments are known at compile time.\n * @default false\n */\n readonly noComptime?: boolean | undefined;\n readonly ignoreImplicitCastWarning?: boolean | undefined;\n}\n\nexport class MissingCpuImplError extends Error {\n constructor(message: string | undefined) {\n super(message);\n this.name = this.constructor.name;\n }\n}\n\nexport function dualImpl<T extends AnyFn>(\n options: DualImplOptions<T>,\n): DualFn<T> {\n const impl = ((...args: Parameters<T>) => {\n if (typeof options.normalImpl === 'string') {\n throw new MissingCpuImplError(options.normalImpl);\n }\n return options.normalImpl(...args);\n }) as DualFn<T>;\n\n setName(impl, options.name);\n impl.toString = () => options.name ?? '<unknown>';\n impl[$gpuCallable] = {\n get strictSignature() {\n return typeof options.signature !== 'function'\n ? options.signature\n : undefined;\n },\n call(ctx, args) {\n const { argTypes, returnType } = typeof options.signature === 'function'\n ? options.signature(\n ...args.map((s) => {\n // Dereference implicit pointers\n if (isPtr(s.dataType) && s.dataType.implicit) {\n return s.dataType.inner;\n }\n return s.dataType;\n }) as MapValueToDataType<Parameters<T>>,\n )\n : options.signature;\n\n const converted = args.map((s, idx) => {\n const argType = argTypes[idx];\n if (!argType) {\n throw new Error('Function called with invalid arguments');\n }\n return tryConvertSnippet(\n ctx,\n s,\n argType,\n !options.ignoreImplicitCastWarning,\n );\n }) as MapValueToSnippet<Parameters<T>>;\n\n if (\n !options.noComptime &&\n converted.every((s) => isKnownAtComptime(s)) &&\n typeof options.normalImpl === 'function'\n ) {\n ctx.pushMode(new NormalState());\n try {\n return snip(\n options.normalImpl(...converted.map((s) => s.value) as never[]),\n returnType,\n // Functions give up ownership of their return value\n /* origin */ 'constant',\n );\n } catch (e) {\n // cpuImpl may in some cases be present but implemented only partially.\n // In that case, if the MissingCpuImplError is thrown, we fallback to codegenImpl.\n // If it is any other error, we just rethrow.\n if (!(e instanceof MissingCpuImplError)) {\n throw e;\n }\n } finally {\n ctx.popMode('normal');\n }\n }\n\n return snip(\n options.codegenImpl(ctx, converted),\n concretize(returnType),\n // Functions give up ownership of their return value\n /* origin */ 'runtime',\n );\n },\n };\n\n return impl;\n}\n","import { WgslTypeError } from '../../errors.ts';\nimport { setName, type TgpuNamable } from '../../shared/meta.ts';\nimport {\n $getNameForward,\n $gpuCallable,\n $internal,\n} from '../../shared/symbols.ts';\nimport { coerceToSnippet } from '../../tgsl/generationHelpers.ts';\nimport { type DualFn, isKnownAtComptime } from '../../types.ts';\n\ntype AnyFn = (...args: never[]) => unknown;\n\nexport type TgpuComptime<T extends AnyFn = AnyFn> =\n & DualFn<T>\n & TgpuNamable\n & {\n [$getNameForward]: unknown;\n [$internal]: { isComptime: true };\n };\n\nexport function isComptimeFn(value: unknown): value is TgpuComptime {\n return !!(value as TgpuComptime)?.[$internal]?.isComptime;\n}\n\n/**\n * Creates a version of `func` that can called safely in a TypeGPU function to\n * precompute and inject a value into the final shader code.\n *\n * Note how the function passed into `comptime` doesn't have to be marked with\n * 'use gpu'. That's because the function doesn't execute on the GPU, it gets\n * executed before the shader code gets sent to the GPU.\n *\n * @example\n * ```ts\n * const color = tgpu.comptime((int: number) => {\n * const r = (int >> 16) & 0xff;\n * const g = (int >> 8) & 0xff;\n * const b = int & 0xff;\n * return d.vec3f(r / 255, g / 255, b / 255);\n * });\n *\n * const material = (diffuse: d.v3f): d.v3f => {\n * 'use gpu';\n * const albedo = color(0xff00ff);\n * return albedo.mul(diffuse);\n * };\n * ```\n */\nexport function comptime<T extends (...args: never[]) => unknown>(\n func: T,\n): TgpuComptime<T> {\n const impl = ((...args: Parameters<T>) => {\n return func(...args);\n }) as TgpuComptime<T>;\n\n impl.toString = () => 'comptime';\n impl[$getNameForward] = func;\n impl[$gpuCallable] = {\n call(_ctx, args) {\n if (!args.every((s) => isKnownAtComptime(s))) {\n throw new WgslTypeError(\n `Called comptime function with runtime-known values: ${\n args.filter((s) => !isKnownAtComptime(s)).map((s) => `'${s.value}'`)\n .join(', ')\n }`,\n );\n }\n\n return coerceToSnippet(func(...args.map((s) => s.value) as never[]));\n },\n };\n impl.$name = (label: string) => {\n setName(func, label);\n return impl;\n };\n Object.defineProperty(impl, $internal, {\n value: { isComptime: true },\n });\n\n return impl;\n}\n","import { comptime } from '../core/function/comptime.ts';\nimport { callableSchema } from '../core/function/createCallableSchema.ts';\nimport { dualImpl } from '../core/function/dualImpl.ts';\nimport { stitch } from '../core/resolve/stitch.ts';\nimport { $repr } from '../shared/symbols.ts';\nimport { $internal, $resolve } from '../shared/symbols.ts';\nimport type { SelfResolvable } from '../types.ts';\nimport { f32 } from './numeric.ts';\nimport { type ResolvedSnippet, snip } from './snippet.ts';\nimport { vec2f, vec3f, vec4f } from './vector.ts';\nimport {\n type BaseData,\n isVec,\n type m2x2f,\n type m3x3f,\n type m4x4f,\n type mat2x2,\n type Mat2x2f,\n type mat3x3,\n type Mat3x3f,\n type mat4x4,\n type Mat4x4f,\n type NumberArrayView,\n type v2f,\n type v3f,\n type v4f,\n type VecKind,\n} from './wgslTypes.ts';\n\n// --------------\n// Implementation\n// --------------\n\ntype vBase = {\n kind: VecKind;\n length: number;\n [n: number]: number;\n};\n\nexport abstract class MatBase<TColumn> implements NumberArrayView {\n abstract readonly [$internal]: true;\n abstract readonly columns: readonly TColumn[];\n\n abstract readonly length: number;\n abstract [Symbol.iterator](): Iterator<number>;\n [n: number]: number;\n}\n\ninterface MatSchemaOptions<TType extends string, ColumnType> {\n type: TType;\n rows: 2 | 3 | 4;\n columns: 2 | 3 | 4;\n MatImpl: new (...args: number[]) => MatBase<ColumnType>;\n}\n\ntype MatConstructor<\n ValueType extends MatBase<ColumnType>,\n ColumnType extends vBase,\n> = (...args: (number | ColumnType)[]) => ValueType;\n\nfunction createMatSchema<\n TType extends string,\n ValueType extends MatBase<ColumnType>,\n ColumnType extends vBase,\n>(\n options: MatSchemaOptions<TType, ColumnType>,\n): { type: TType; [$repr]: ValueType } & MatConstructor<ValueType, ColumnType> {\n const construct = callableSchema({\n name: options.type,\n normalImpl: (...args: (number | ColumnType)[]): ValueType => {\n const elements: number[] = [];\n\n for (const arg of args) {\n if (typeof arg === 'number') {\n elements.push(arg);\n } else {\n for (let i = 0; i < arg.length; ++i) {\n elements.push(arg[i] as number);\n }\n }\n }\n\n if (\n elements.length !== 0 &&\n elements.length !== options.columns * options.rows\n ) {\n throw new Error(\n `'${options.type}' constructor called with invalid number of arguments.`,\n );\n }\n\n for (let i = elements.length; i < options.columns * options.rows; ++i) {\n elements.push(0);\n }\n\n return new options.MatImpl(...elements) as ValueType;\n },\n signature: (...args) => ({\n argTypes: args.map((arg) => (isVec(arg) ? arg : f32)),\n returnType: schema as unknown as BaseData,\n }),\n codegenImpl: (_ctx, args) => stitch`${options.type}(${args})`,\n });\n\n const schema = Object.assign(construct, {\n [$internal]: {},\n type: options.type,\n primitive: f32,\n identity: identityFunctions[options.columns],\n translation: options.columns === 4 ? translation4 : undefined,\n scaling: options.columns === 4 ? scaling4 : undefined,\n rotationX: options.columns === 4 ? rotationX4 : undefined,\n rotationY: options.columns === 4 ? rotationY4 : undefined,\n rotationZ: options.columns === 4 ? rotationZ4 : undefined,\n }) as unknown as {\n type: TType;\n [$repr]: ValueType;\n } & MatConstructor<ValueType, ColumnType>;\n\n // TODO: Remove workaround\n // it's a workaround for circular dependencies caused by us using schemas in the shader generator\n options.MatImpl.prototype.schema = schema;\n\n return schema;\n}\n\nabstract class mat2x2Impl<TColumn extends v2f> extends MatBase<TColumn>\n implements mat2x2<TColumn>, SelfResolvable {\n public readonly [$internal] = true;\n public readonly columns: readonly [TColumn, TColumn];\n public readonly length = 4;\n public abstract readonly kind: string;\n [n: number]: number;\n\n constructor(...elements: number[]) {\n super();\n this.columns = [\n this.makeColumn(elements[0] as number, elements[1] as number),\n this.makeColumn(elements[2] as number, elements[3] as number),\n ];\n }\n\n abstract makeColumn(e0: number, e1: number): TColumn;\n\n get 0() {\n return this.columns[0].x;\n }\n\n get 1() {\n return this.columns[0].y;\n }\n\n get 2() {\n return this.columns[1].x;\n }\n\n get 3() {\n return this.columns[1].y;\n }\n\n set 0(value: number) {\n this.columns[0].x = value;\n }\n\n set 1(value: number) {\n this.columns[0].y = value;\n }\n\n set 2(value: number) {\n this.columns[1].x = value;\n }\n\n set 3(value: number) {\n this.columns[1].y = value;\n }\n\n *[Symbol.iterator]() {\n yield this[0];\n yield this[1];\n yield this[2];\n yield this[3];\n }\n\n [$resolve](): ResolvedSnippet {\n return snip(\n `${this.kind}(${\n Array.from({ length: this.length })\n .map((_, i) => this[i])\n .join(', ')\n })`,\n mat2x2f,\n /* origin */ 'runtime',\n );\n }\n\n toString() {\n return this[$resolve]().value;\n }\n}\n\nclass mat2x2fImpl extends mat2x2Impl<v2f> {\n public readonly kind = 'mat2x2f';\n\n makeColumn(e0: number, e1: number): v2f {\n return vec2f(e0, e1);\n }\n}\n\nabstract class mat3x3Impl<TColumn extends v3f> extends MatBase<TColumn>\n implements mat3x3<TColumn>, SelfResolvable {\n public readonly [$internal] = true;\n public readonly columns: readonly [TColumn, TColumn, TColumn];\n public readonly length = 12;\n public abstract readonly kind: string;\n [n: number]: number;\n\n constructor(...elements: number[]) {\n super();\n this.columns = [\n this.makeColumn(\n elements[0] as number,\n elements[1] as number,\n elements[2] as number,\n ),\n this.makeColumn(\n elements[3] as number,\n elements[4] as number,\n elements[5] as number,\n ),\n this.makeColumn(\n elements[6] as number,\n elements[7] as number,\n elements[8] as number,\n ),\n ];\n }\n\n abstract makeColumn(x: number, y: number, z: number): TColumn;\n\n get 0() {\n return this.columns[0].x;\n }\n\n get 1() {\n return this.columns[0].y;\n }\n\n get 2() {\n return this.columns[0].z;\n }\n\n get 3() {\n return 0;\n }\n\n get 4() {\n return this.columns[1].x;\n }\n\n get 5() {\n return this.columns[1].y;\n }\n\n get 6() {\n return this.columns[1].z;\n }\n\n get 7() {\n return 0;\n }\n\n get 8() {\n return this.columns[2].x;\n }\n\n get 9() {\n return this.columns[2].y;\n }\n\n get 10() {\n return this.columns[2].z;\n }\n\n get 11() {\n return 0;\n }\n\n set 0(value: number) {\n this.columns[0].x = value;\n }\n\n set 1(value: number) {\n this.columns[0].y = value;\n }\n\n set 2(value: number) {\n this.columns[0].z = value;\n }\n\n set 3(_: number) {}\n\n set 4(value: number) {\n this.columns[1].x = value;\n }\n\n set 5(value: number) {\n this.columns[1].y = value;\n }\n\n set 6(value: number) {\n this.columns[1].z = value;\n }\n\n set 7(_: number) {}\n\n set 8(value: number) {\n this.columns[2].x = value;\n }\n\n set 9(value: number) {\n this.columns[2].y = value;\n }\n\n set 10(value: number) {\n this.columns[2].z = value;\n }\n\n set 11(_: number) {}\n\n *[Symbol.iterator]() {\n for (let i = 0; i < 12; i++) {\n yield this[i] as number;\n }\n }\n\n [$resolve](): ResolvedSnippet {\n return snip(\n `${this.kind}(${this[0]}, ${this[1]}, ${this[2]}, ${this[4]}, ${\n this[5]\n }, ${this[6]}, ${this[8]}, ${this[9]}, ${this[10]})`,\n mat3x3f,\n /* origin */ 'runtime',\n );\n }\n\n toString() {\n return this[$resolve]().value;\n }\n}\n\nclass mat3x3fImpl extends mat3x3Impl<v3f> {\n public readonly kind = 'mat3x3f';\n makeColumn(x: number, y: number, z: number): v3f {\n return vec3f(x, y, z);\n }\n}\n\nabstract class mat4x4Impl<TColumn extends v4f> extends MatBase<TColumn>\n implements mat4x4<TColumn>, SelfResolvable {\n public readonly [$internal] = true;\n public readonly columns: readonly [TColumn, TColumn, TColumn, TColumn];\n public abstract readonly kind: string;\n\n constructor(...elements: number[]) {\n super();\n this.columns = [\n this.makeColumn(\n elements[0] as number,\n elements[1] as number,\n elements[2] as number,\n elements[3] as number,\n ),\n this.makeColumn(\n elements[4] as number,\n elements[5] as number,\n elements[6] as number,\n elements[7] as number,\n ),\n this.makeColumn(\n elements[8] as number,\n elements[9] as number,\n elements[10] as number,\n elements[11] as number,\n ),\n this.makeColumn(\n elements[12] as number,\n elements[13] as number,\n elements[14] as number,\n elements[15] as number,\n ),\n ];\n }\n\n abstract makeColumn(x: number, y: number, z: number, w: number): TColumn;\n\n public readonly length = 16;\n [n: number]: number;\n\n get 0() {\n return this.columns[0].x;\n }\n\n get 1() {\n return this.columns[0].y;\n }\n\n get 2() {\n return this.columns[0].z;\n }\n\n get 3() {\n return this.columns[0].w;\n }\n\n get 4() {\n return this.columns[1].x;\n }\n\n get 5() {\n return this.columns[1].y;\n }\n\n get 6() {\n return this.columns[1].z;\n }\n\n get 7() {\n return this.columns[1].w;\n }\n\n get 8() {\n return this.columns[2].x;\n }\n\n get 9() {\n return this.columns[2].y;\n }\n\n get 10() {\n return this.columns[2].z;\n }\n\n get 11() {\n return this.columns[2].w;\n }\n\n get 12() {\n return this.columns[3].x;\n }\n\n get 13() {\n return this.columns[3].y;\n }\n\n get 14() {\n return this.columns[3].z;\n }\n\n get 15() {\n return this.columns[3].w;\n }\n\n set 0(value: number) {\n this.columns[0].x = value;\n }\n\n set 1(value: number) {\n this.columns[0].y = value;\n }\n\n set 2(value: number) {\n this.columns[0].z = value;\n }\n\n set 3(value: number) {\n this.columns[0].w = value;\n }\n\n set 4(value: number) {\n this.columns[1].x = value;\n }\n\n set 5(value: number) {\n this.columns[1].y = value;\n }\n\n set 6(value: number) {\n this.columns[1].z = value;\n }\n\n set 7(value: number) {\n this.columns[1].w = value;\n }\n\n set 8(value: number) {\n this.columns[2].x = value;\n }\n\n set 9(value: number) {\n this.columns[2].y = value;\n }\n\n set 10(value: number) {\n this.columns[2].z = value;\n }\n\n set 11(value: number) {\n this.columns[2].w = value;\n }\n\n set 12(value: number) {\n this.columns[3].x = value;\n }\n\n set 13(value: number) {\n this.columns[3].y = value;\n }\n\n set 14(value: number) {\n this.columns[3].z = value;\n }\n\n set 15(value: number) {\n this.columns[3].w = value;\n }\n\n *[Symbol.iterator]() {\n for (let i = 0; i < 16; i++) {\n yield this[i] as number;\n }\n }\n\n [$resolve](): ResolvedSnippet {\n return snip(\n `${this.kind}(${\n Array.from({ length: this.length })\n .map((_, i) => this[i])\n .join(', ')\n })`,\n mat4x4f,\n /* origin */ 'runtime',\n );\n }\n\n toString() {\n return this[$resolve]().value;\n }\n}\n\nclass mat4x4fImpl extends mat4x4Impl<v4f> {\n public readonly kind = 'mat4x4f';\n\n makeColumn(x: number, y: number, z: number, w: number): v4f {\n return vec4f(x, y, z, w);\n }\n}\n\n// ----------\n// Matrix ops\n// ----------\n\n/**\n * Returns a 2-by-2 identity matrix.\n * @returns {m2x2f} The result matrix.\n */\nexport const identity2 = comptime(() => mat2x2f(1, 0, 0, 1)).$name('identity2');\n\n/**\n * Returns a 3-by-3 identity matrix.\n * @returns {m3x3f} The result matrix.\n */\nexport const identity3 = comptime(\n () => mat3x3f(1, 0, 0, 0, 1, 0, 0, 0, 1),\n).$name('identity3');\n\n/**\n * Returns a 4-by-4 identity matrix.\n * @returns {m4x4f} The result matrix.\n */\nexport const identity4 = comptime(\n () => mat4x4f(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1),\n).$name('identity4');\n\nconst identityFunctions = {\n 2: identity2,\n 3: identity3,\n 4: identity4,\n};\n\n/**\n * Creates a 4-by-4 matrix which translates by the given vector v.\n * @param {v3f} vector - The vector by which to translate.\n * @returns {m4x4f} The translation matrix.\n */\nexport const translation4 = dualImpl({\n name: 'translation4',\n normalImpl: (vector: v3f) =>\n // deno-fmt-ignore\n mat4x4f(\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n vector.x, vector.y, vector.z, 1,\n ),\n get signature() {\n return { argTypes: [vec3f], returnType: mat4x4f };\n },\n codegenImpl: (_ctx, [v]) =>\n stitch`mat4x4f(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, ${v}.x, ${v}.y, ${v}.z, 1)`,\n});\n\n/**\n * Creates a 4-by-4 matrix which scales in each dimension by an amount given by the corresponding entry in the given vector.\n * @param {v3f} vector - A vector of three entries specifying the factor by which to scale in each dimension.\n * @returns {m4x4f} The scaling matrix.\n */\nexport const scaling4 = dualImpl({\n name: 'scaling4',\n normalImpl: (vector: v3f) =>\n // deno-fmt-ignore\n mat4x4f(\n vector.x, 0, 0, 0,\n 0, vector.y, 0, 0,\n 0, 0, vector.z, 0,\n 0, 0, 0, 1,\n ),\n get signature() {\n return { argTypes: [vec3f], returnType: mat4x4f };\n },\n codegenImpl: (_ctx, [v]) =>\n stitch`mat4x4f(${v}.x, 0, 0, 0, 0, ${v}.y, 0, 0, 0, 0, ${v}.z, 0, 0, 0, 0, 1)`,\n});\n\n/**\n * Creates a 4-by-4 matrix which rotates around the x-axis by the given angle.\n * @param {number} angle - The angle by which to rotate (in radians).\n * @returns {m4x4f} The rotation matrix.\n */\nexport const rotationX4 = dualImpl({\n name: 'rotationX4',\n normalImpl: (a: number) =>\n // deno-fmt-ignore\n mat4x4f(\n 1, 0, 0, 0,\n 0, Math.cos(a), Math.sin(a), 0,\n 0, -Math.sin(a), Math.cos(a), 0,\n 0, 0, 0, 1,\n ),\n get signature() {\n return { argTypes: [f32], returnType: mat4x4f };\n },\n codegenImpl: (_ctx, [a]) =>\n stitch`mat4x4f(1, 0, 0, 0, 0, cos(${a}), sin(${a}), 0, 0, -sin(${a}), cos(${a}), 0, 0, 0, 0, 1)`,\n});\n\n/**\n * Creates a 4-by-4 matrix which rotates around the y-axis by the given angle.\n * @param {number} angle - The angle by which to rotate (in radians).\n * @returns {m4x4f} The rotation matrix.\n */\nexport const rotationY4 = dualImpl({\n name: 'rotationY4',\n normalImpl: (a: number) =>\n // deno-fmt-ignore\n mat4x4f(\n Math.cos(a), 0, -Math.sin(a), 0,\n 0, 1, 0, 0,\n Math.sin(a), 0, Math.cos(a), 0,\n 0, 0, 0, 1,\n ),\n get signature() {\n return { argTypes: [f32], returnType: mat4x4f };\n },\n codegenImpl: (_ctx, [a]) =>\n stitch`mat4x4f(cos(${a}), 0, -sin(${a}), 0, 0, 1, 0, 0, sin(${a}), 0, cos(${a}), 0, 0, 0, 0, 1)`,\n});\n\n/**\n * Creates a 4-by-4 matrix which rotates around the z-axis by the given angle.\n * @param {number} angle - The angle by which to rotate (in radians).\n * @returns {m4x4f} The rotation matrix.\n */\nexport const rotationZ4 = dualImpl({\n name: 'rotationZ4',\n normalImpl: (a: number) =>\n // deno-fmt-ignore\n mat4x4f(\n Math.cos(a), Math.sin(a), 0, 0,\n -Math.sin(a), Math.cos(a), 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1,\n ),\n get signature() {\n return { argTypes: [f32], returnType: mat4x4f };\n },\n codegenImpl: (_ctx, [a]) =>\n stitch`mat4x4f(cos(${a}), sin(${a}), 0, 0, -sin(${a}), cos(${a}), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)`,\n});\n\n// ----------\n// Public API\n// ----------\n\n/**\n * Schema representing mat2x2f - a matrix with 2 rows and 2 columns, with elements of type f32.\n * Also a constructor function for this matrix type.\n *\n * @example\n * const zero2x2 = mat2x2f(); // filled with zeros\n *\n * @example\n * const mat = mat2x2f(0, 1, 2, 3);\n * mat.columns[0] // vec2f(0, 1)\n * mat.columns[1] // vec2f(2, 3)\n *\n * @example\n * const mat = mat2x2f(\n * vec2f(0, 1), // column 0\n * vec2f(1, 2), // column 1\n * );\n *\n * @example\n * const buffer = root.createBuffer(d.mat2x2f, d.mat2x2f(0, 1, 2, 3)); // buffer holding a d.mat2x2f value, with an initial value of ((0, 1), (2, 3))\n */\nexport const mat2x2f = createMatSchema<'mat2x2f', m2x2f, v2f>({\n type: 'mat2x2f',\n rows: 2,\n columns: 2,\n MatImpl: mat2x2fImpl,\n}) as Mat2x2f;\n\n/**\n * Schema representing mat3x3f - a matrix with 3 rows and 3 columns, with elements of type f32.\n * Also a constructor function for this matrix type.\n *\n * @example\n * const zero3x3 = mat3x3f(); // filled with zeros\n *\n * @example\n * const mat = mat3x3f(0, 1, 2, 3, 4, 5, 6, 7, 8);\n * mat.columns[0] // vec3f(0, 1, 2)\n * mat.columns[1] // vec3f(3, 4, 5)\n * mat.columns[2] // vec3f(6, 7, 8)\n *\n * @example\n * const mat = mat3x3f(\n * vec3f(0, 1, 2), // column 0\n * vec3f(2, 3, 4), // column 1\n * vec3f(5, 6, 7), // column 2\n * );\n *\n * @example\n * const buffer = root.createBuffer(d.mat3x3f, d.mat3x3f()); // buffer holding a d.mat3x3f value, with an initial value of mat3x3f filled with zeros\n */\nexport const mat3x3f = createMatSchema<'mat3x3f', m3x3f, v3f>({\n type: 'mat3x3f',\n rows: 3,\n columns: 3,\n MatImpl: mat3x3fImpl,\n}) as Mat3x3f;\n\n/**\n * Schema representing mat4x4f - a matrix with 4 rows and 4 columns, with elements of type f32.\n * Also a constructor function for this matrix type.\n *\n * @example\n * const zero4x4 = mat4x4f(); // filled with zeros\n *\n * @example\n * const mat = mat4x4f(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n * mat.columns[0] // vec4f(0, 1, 2, 3)\n * mat.columns[1] // vec4f(4, 5, 6, 7)\n * mat.columns[2] // vec4f(8, 9, 10, 11)\n * mat.columns[3] // vec4f(12, 13, 14, 15)\n *\n * @example\n * const mat = mat4x4f(\n * vec4f(0, 1, 2, 3), // column 0\n * vec4f(4, 5, 6, 7), // column 1\n * vec4f(8, 9, 10, 11), // column 2\n * vec4f(12, 13, 14, 15), // column 3\n * );\n *\n * @example\n * const buffer = root.createBuffer(d.mat4x4f, d.mat4x4f()); // buffer holding a d.mat4x4f value, with an initial value of mat4x4f filled with zeros\n */\nexport const mat4x4f = createMatSchema<'mat4x4f', m4x4f, v4f>({\n type: 'mat4x4f',\n rows: 4,\n columns: 4,\n MatImpl: mat4x4fImpl,\n}) as Mat4x4f;\n\nexport function matToArray(mat: m2x2f | m3x3f | m4x4f): number[] {\n if (mat.kind === 'mat3x3f') {\n return [\n mat[0],\n mat[1],\n mat[2],\n mat[4],\n mat[5],\n mat[6],\n mat[8],\n mat[9],\n mat[10],\n ] as number[];\n }\n\n return Array.from({ length: mat.length }).map((_, idx) => mat[idx] as number);\n}\n","export const smoothstepScalar = (\n edge0: number,\n edge1: number,\n x: number,\n): number => {\n if (edge0 === edge1) {\n return 0; // WGSL spec says this is an indeterminate value\n }\n const t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n return t * t * (3 - 2 * t);\n};\n\nexport const clamp = (value: number, low: number, high: number) =>\n Math.min(Math.max(low, value), high);\n\nexport const divInteger = (lhs: number, rhs: number) => {\n if (rhs === 0) {\n return lhs;\n }\n return Math.trunc(lhs / rhs);\n};\n\nexport function bitcastU32toF32Impl(n: number): number {\n const dataView = new DataView(new ArrayBuffer(4));\n dataView.setUint32(0, n, true);\n return dataView.getFloat32(0, true);\n}\n\nexport function bitcastU32toI32Impl(n: number): number {\n const dataView = new DataView(new ArrayBuffer(4));\n dataView.setUint32(0, n, true);\n return dataView.getInt32(0, true);\n}\n","import { mat2x2f, mat3x3f, mat4x4f } from './matrix.ts';\nimport {\n bitcastU32toF32Impl,\n bitcastU32toI32Impl,\n clamp,\n divInteger,\n smoothstepScalar,\n} from './numberOps.ts';\nimport * as vectorConstructors from './vector.ts';\nimport type * as wgsl from './wgslTypes.ts';\nimport type { VecKind } from './wgslTypes.ts';\n\ntype vBase = { kind: VecKind };\ntype mBase = { kind: MatKind };\ntype v2 = wgsl.v2f | wgsl.v2h | wgsl.v2i | wgsl.v2u;\ntype v3 = wgsl.v3f | wgsl.v3h | wgsl.v3i | wgsl.v3u;\ntype v4 = wgsl.v4f | wgsl.v4h | wgsl.v4i | wgsl.v4u;\n\ntype MatKind = 'mat2x2f' | 'mat3x3f' | 'mat4x4f';\n\nconst vec2b = vectorConstructors.vec2b;\nconst vec2f = vectorConstructors.vec2f;\nconst vec2h = vectorConstructors.vec2h;\nconst vec2i = vectorConstructors.vec2i;\nconst vec2u = vectorConstructors.vec2u;\nconst vec3b = vectorConstructors.vec3b;\nconst vec3f = vectorConstructors.vec3f;\nconst vec3h = vectorConstructors.vec3h;\nconst vec3i = vectorConstructors.vec3i;\nconst vec3u = vectorConstructors.vec3u;\nconst vec4b = vectorConstructors.vec4b;\nconst vec4f = vectorConstructors.vec4f;\nconst vec4h = vectorConstructors.vec4h;\nconst vec4i = vectorConstructors.vec4i;\nconst vec4u = vectorConstructors.vec4u;\n\nconst lengthVec2 = (v: v2) => Math.sqrt(v.x ** 2 + v.y ** 2);\nconst lengthVec3 = (v: v3) => Math.sqrt(v.x ** 2 + v.y ** 2 + v.z ** 2);\nconst lengthVec4 = (v: v4) =>\n Math.sqrt(v.x ** 2 + v.y ** 2 + v.z ** 2 + v.w ** 2);\n\nconst dotVec2 = (lhs: v2, rhs: v2) => lhs.x * rhs.x + lhs.y * rhs.y;\nconst dotVec3 = (lhs: v3, rhs: v3) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z;\nconst dotVec4 = (lhs: v4, rhs: v4) =>\n lhs.x * rhs.x + lhs.y * rhs.y + lhs.z * rhs.z + lhs.w * rhs.w;\n\ntype UnaryOp = (a: number) => number;\ntype BinaryOp = (a: number, b: number) => number;\n\nconst unary2f = (op: UnaryOp) => (a: wgsl.v2f) => vec2f(op(a.x), op(a.y));\nconst unary2h = (op: UnaryOp) => (a: wgsl.v2h) => vec2h(op(a.x), op(a.y));\nconst unary2i = (op: UnaryOp) => (a: wgsl.v2i) => vec2i(op(a.x), op(a.y));\nconst unary2u = (op: UnaryOp) => (a: wgsl.v2u) => vec2u(op(a.x), op(a.y));\n\nconst unary3f = (op: UnaryOp) => (a: wgsl.v3f) =>\n vec3f(op(a.x), op(a.y), op(a.z));\n\nconst unary3h = (op: UnaryOp) => (a: wgsl.v3h) =>\n vec3h(op(a.x), op(a.y), op(a.z));\n\nconst unary3i = (op: UnaryOp) => (a: wgsl.v3i) =>\n vec3i(op(a.x), op(a.y), op(a.z));\n\nconst unary3u = (op: UnaryOp) => (a: wgsl.v3u) =>\n vec3u(op(a.x), op(a.y), op(a.z));\n\nconst unary4f = (op: UnaryOp) => (a: wgsl.v4f) =>\n vec4f(op(a.x), op(a.y), op(a.z), op(a.w));\n\nconst unary4h = (op: UnaryOp) => (a: wgsl.v4h) =>\n vec4h(op(a.x), op(a.y), op(a.z), op(a.w));\n\nconst unary4i = (op: UnaryOp) => (a: wgsl.v4i) =>\n vec4i(op(a.x), op(a.y), op(a.z), op(a.w));\n\nconst unary4u = (op: UnaryOp) => (a: wgsl.v4u) =>\n vec4u(op(a.x), op(a.y), op(a.z), op(a.w));\n\nconst unary2x2f = (op: UnaryOp) => (a: wgsl.m2x2f) => {\n const a_ = a.columns as [wgsl.v2f, wgsl.v2f];\n return mat2x2f(unary2f(op)(a_[0]), unary2f(op)(a_[1]));\n};\n\nconst unary3x3f = (op: UnaryOp) => (a: wgsl.m3x3f) => {\n const a_ = a.columns as [wgsl.v3f, wgsl.v3f, wgsl.v3f];\n return mat3x3f(unary3f(op)(a_[0]), unary3f(op)(a_[1]), unary3f(op)(a_[2]));\n};\n\nconst unary4x4f = (op: UnaryOp) => (a: wgsl.m4x4f) => {\n const a_ = a.columns as [wgsl.v4f, wgsl.v4f, wgsl.v4f, wgsl.v4f];\n return mat4x4f(\n unary4f(op)(a_[0]),\n unary4f(op)(a_[1]),\n unary4f(op)(a_[2]),\n unary4f(op)(a_[3]),\n );\n};\n\nconst binaryComponentWise2f = (op: BinaryOp) => (a: wgsl.v2f, b: wgsl.v2f) =>\n vec2f(op(a.x, b.x), op(a.y, b.y));\n\nconst binaryComponentWise2h = (op: BinaryOp) => (a: wgsl.v2h, b: wgsl.v2h) =>\n vec2h(op(a.x, b.x), op(a.y, b.y));\n\nconst binaryComponentWise2i = (op: BinaryOp) => (a: wgsl.v2i, b: wgsl.v2i) =>\n vec2i(op(a.x, b.x), op(a.y, b.y));\n\nconst binaryComponentWise2u = (op: BinaryOp) => (a: wgsl.v2u, b: wgsl.v2u) =>\n vec2u(op(a.x, b.x), op(a.y, b.y));\n\nconst binaryComponentWise3f = (op: BinaryOp) => (a: wgsl.v3f, b: wgsl.v3f) =>\n vec3f(op(a.x, b.x), op(a.y, b.y), op(a.z, b.z));\n\nconst binaryComponentWise3h = (op: BinaryOp) => (a: wgsl.v3h, b: wgsl.v3h) =>\n vec3h(op(a.x, b.x), op(a.y, b.y), op(a.z, b.z));\n\nconst binaryComponentWise3i = (op: BinaryOp) => (a: wgsl.v3i, b: wgsl.v3i) =>\n vec3i(op(a.x, b.x), op(a.y, b.y), op(a.z, b.z));\n\nconst binaryComponentWise3u = (op: BinaryOp) => (a: wgsl.v3u, b: wgsl.v3u) =>\n vec3u(op(a.x, b.x), op(a.y, b.y), op(a.z, b.z));\n\nconst binaryComponentWise4f = (op: BinaryOp) => (a: wgsl.v4f, b: wgsl.v4f) =>\n vec4f(op(a.x, b.x), op(a.y, b.y), op(a.z, b.z), op(a.w, b.w));\n\nconst binaryComponentWise4h = (op: BinaryOp) => (a: wgsl.v4h, b: wgsl.v4h) =>\n vec4h(op(a.x, b.x), op(a.y, b.y), op(a.z, b.z), op(a.w, b.w));\n\nconst binaryComponentWise4i = (op: BinaryOp) => (a: wgsl.v4i, b: wgsl.v4i) =>\n vec4i(op(a.x, b.x), op(a.y, b.y), op(a.z, b.z), op(a.w, b.w));\n\nconst binaryComponentWise4u = (op: BinaryOp) => (a: wgsl.v4u, b: wgsl.v4u) =>\n vec4u(op(a.x, b.x), op(a.y, b.y), op(a.z, b.z), op(a.w, b.w));\n\nconst binaryComponentWise2x2f =\n (op: BinaryOp) => (a: wgsl.m2x2f, b: wgsl.m2x2f) => {\n const a_ = a.columns as [wgsl.v2f, wgsl.v2f];\n const b_ = b.columns as [wgsl.v2f, wgsl.v2f];\n return mat2x2f(\n binaryComponentWise2f(op)(a_[0], b_[0]),\n binaryComponentWise2f(op)(a_[1], b_[1]),\n );\n };\n\nconst binaryComponentWise3x3f =\n (op: BinaryOp) => (a: wgsl.m3x3f, b: wgsl.m3x3f) => {\n const a_ = a.columns as [wgsl.v3f, wgsl.v3f, wgsl.v3f];\n const b_ = b.columns as [wgsl.v3f, wgsl.v3f, wgsl.v3f];\n return mat3x3f(\n binaryComponentWise3f(op)(a_[0], b_[0]),\n binaryComponentWise3f(op)(a_[1], b_[1]),\n binaryComponentWise3f(op)(a_[2], b_[2]),\n );\n };\n\nconst binaryComponentWise4x4f =\n (op: BinaryOp) => (a: wgsl.m4x4f, b: wgsl.m4x4f) => {\n const a_ = a.columns as [wgsl.v4f, wgsl.v4f, wgsl.v4f, wgsl.v4f];\n const b_ = b.columns as [wgsl.v4f, wgsl.v4f, wgsl.v4f, wgsl.v4f];\n return mat4x4f(\n binaryComponentWise4f(op)(a_[0], b_[0]),\n binaryComponentWise4f(op)(a_[1], b_[1]),\n binaryComponentWise4f(op)(a_[2], b_[2]),\n binaryComponentWise4f(op)(a_[3], b_[3]),\n );\n };\n\ntype TernaryOp = (a: number, b: number, c: number) => number;\n\nconst ternaryComponentWise2f =\n (op: TernaryOp) => (a: wgsl.v2f, b: wgsl.v2f, c: wgsl.v2f) =>\n vec2f(op(a.x, b.x, c.x), op(a.y, b.y, c.y));\n\nconst ternaryComponentWise2h =\n (op: TernaryOp) => (a: wgsl.v2h, b: wgsl.v2h, c: wgsl.v2h) =>\n vec2h(op(a.x, b.x, c.x), op(a.y, b.y, c.y));\n\nconst ternaryComponentWise3f =\n (op: TernaryOp) => (a: wgsl.v3f, b: wgsl.v3f, c: wgsl.v3f) =>\n vec3f(op(a.x, b.x, c.x), op(a.y, b.y, c.y), op(a.z, b.z, c.z));\n\nconst ternaryComponentWise3h =\n (op: TernaryOp) => (a: wgsl.v3h, b: wgsl.v3h, c: wgsl.v3h) =>\n vec3h(op(a.x, b.x, c.x), op(a.y, b.y, c.y), op(a.z, b.z, c.z));\n\nconst ternaryComponentWise4f =\n (op: TernaryOp) => (a: wgsl.v4f, b: wgsl.v4f, c: wgsl.v4f) =>\n vec4f(\n op(a.x, b.x, c.x),\n op(a.y, b.y, c.y),\n op(a.z, b.z, c.z),\n op(a.w, b.w, c.w),\n );\n\nconst ternaryComponentWise4h =\n (op: TernaryOp) => (a: wgsl.v4h, b: wgsl.v4h, c: wgsl.v4h) =>\n vec4h(\n op(a.x, b.x, c.x),\n op(a.y, b.y, c.y),\n op(a.z, b.z, c.z),\n op(a.w, b.w, c.w),\n );\n\nexport const VectorOps = {\n eq: {\n vec2f: (e1: wgsl.v2f, e2: wgsl.v2f) => vec2b(e1.x === e2.x, e1.y === e2.y),\n vec2h: (e1: wgsl.v2h, e2: wgsl.v2h) => vec2b(e1.x === e2.x, e1.y === e2.y),\n vec2i: (e1: wgsl.v2i, e2: wgsl.v2i) => vec2b(e1.x === e2.x, e1.y === e2.y),\n vec2u: (e1: wgsl.v2u, e2: wgsl.v2u) => vec2b(e1.x === e2.x, e1.y === e2.y),\n 'vec2<bool>': (e1: wgsl.v2b, e2: wgsl.v2b) =>\n vec2b(e1.x === e2.x, e1.y === e2.y),\n\n vec3f: (e1: wgsl.v3f, e2: wgsl.v3f) =>\n vec3b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z),\n vec3h: (e1: wgsl.v3h, e2: wgsl.v3h) =>\n vec3b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z),\n vec3i: (e1: wgsl.v3i, e2: wgsl.v3i) =>\n vec3b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z),\n vec3u: (e1: wgsl.v3u, e2: wgsl.v3u) =>\n vec3b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z),\n 'vec3<bool>': (e1: wgsl.v3b, e2: wgsl.v3b) =>\n vec3b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z),\n\n vec4f: (e1: wgsl.v4f, e2: wgsl.v4f) =>\n vec4b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z, e1.w === e2.w),\n vec4h: (e1: wgsl.v4h, e2: wgsl.v4h) =>\n vec4b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z, e1.w === e2.w),\n vec4i: (e1: wgsl.v4i, e2: wgsl.v4i) =>\n vec4b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z, e1.w === e2.w),\n vec4u: (e1: wgsl.v4u, e2: wgsl.v4u) =>\n vec4b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z, e1.w === e2.w),\n 'vec4<bool>': (e1: wgsl.v4b, e2: wgsl.v4b) =>\n vec4b(e1.x === e2.x, e1.y === e2.y, e1.z === e2.z, e1.w === e2.w),\n } as Record<\n VecKind,\n <T extends wgsl.AnyVecInstance>(\n e1: T,\n e2: T,\n ) => T extends wgsl.AnyVec2Instance ? wgsl.v2b\n : T extends wgsl.AnyVec3Instance ? wgsl.v3b\n : wgsl.v4b\n >,\n\n lt: {\n vec2f: (e1: wgsl.v2f, e2: wgsl.v2f) => vec2b(e1.x < e2.x, e1.y < e2.y),\n vec2h: (e1: wgsl.v2h, e2: wgsl.v2h) => vec2b(e1.x < e2.x, e1.y < e2.y),\n vec2i: (e1: wgsl.v2i, e2: wgsl.v2i) => vec2b(e1.x < e2.x, e1.y < e2.y),\n vec2u: (e1: wgsl.v2u, e2: wgsl.v2u) => vec2b(e1.x < e2.x, e1.y < e2.y),\n\n vec3f: (e1: wgsl.v3f, e2: wgsl.v3f) =>\n vec3b(e1.x < e2.x, e1.y < e2.y, e1.z < e2.z),\n vec3h: (e1: wgsl.v3h, e2: wgsl.v3h) =>\n vec3b(e1.x < e2.x, e1.y < e2.y, e1.z < e2.z),\n vec3i: (e1: wgsl.v3i, e2: wgsl.v3i) =>\n vec3b(e1.x < e2.x, e1.y < e2.y, e1.z < e2.z),\n vec3u: (e1: wgsl.v3u, e2: wgsl.v3u) =>\n vec3b(e1.x < e2.x, e1.y < e2.y, e1.z < e2.z),\n\n vec4f: (e1: wgsl.v4f, e2: wgsl.v4f) =>\n vec4b(e1.x < e2.x, e1.y < e2.y, e1.z < e2.z, e1.w < e2.w),\n vec4h: (e1: wgsl.v4h, e2: wgsl.v4h) =>\n vec4b(e1.x < e2.x, e1.y < e2.y, e1.z < e2.z, e1.w < e2.w),\n vec4i: (e1: wgsl.v4i, e2: wgsl.v4i) =>\n vec4b(e1.x < e2.x, e1.y < e2.y, e1.z < e2.z, e1.w < e2.w),\n vec4u: (e1: wgsl.v4u, e2: wgsl.v4u) =>\n vec4b(e1.x < e2.x, e1.y < e2.y, e1.z < e2.z, e1.w < e2.w),\n } as Record<\n VecKind,\n <T extends wgsl.AnyNumericVecInstance>(\n e1: T,\n e2: T,\n ) => T extends wgsl.AnyVec2Instance ? wgsl.v2b\n : T extends wgsl.AnyVec3Instance ? wgsl.v3b\n : wgsl.v4b\n >,\n\n or: {\n 'vec2<bool>': (e1: wgsl.v2b, e2: wgsl.v2b) =>\n vec2b(e1.x || e2.x, e1.y || e2.y),\n 'vec3<bool>': (e1: wgsl.v3b, e2: wgsl.v3b) =>\n vec3b(e1.x || e2.x, e1.y || e2.y, e1.z || e2.z),\n 'vec4<bool>': (e1: wgsl.v4b, e2: wgsl.v4b) =>\n vec4b(e1.x || e2.x, e1.y || e2.y, e1.z || e2.z, e1.w || e2.w),\n } as Record<\n VecKind,\n <T extends wgsl.AnyBooleanVecInstance>(e1: T, e2: T) => T\n >,\n\n all: {\n 'vec2<bool>': (e: wgsl.v2b) => e.x && e.y,\n 'vec3<bool>': (e: wgsl.v3b) => e.x && e.y && e.z,\n 'vec4<bool>': (e: wgsl.v4b) => e.x && e.y && e.z && e.w,\n } as Record<VecKind, (v: wgsl.AnyBooleanVecInstance) => boolean>,\n\n abs: {\n vec2f: unary2f(Math.abs),\n vec2h: unary2h(Math.abs),\n vec2i: unary2i(Math.abs),\n vec2u: unary2u(Math.abs),\n\n vec3f: unary3f(Math.abs),\n vec3h: unary3h(Math.abs),\n vec3i: unary3i(Math.abs),\n vec3u: unary3u(Math.abs),\n\n vec4f: unary4f(Math.abs),\n vec4h: unary4h(Math.abs),\n vec4i: unary4i(Math.abs),\n vec4u: unary4u(Math.abs),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n atan2: {\n vec2f: binaryComponentWise2f(Math.atan2),\n vec2h: binaryComponentWise2h(Math.atan2),\n\n vec3f: binaryComponentWise3f(Math.atan2),\n vec3h: binaryComponentWise3h(Math.atan2),\n\n vec4f: binaryComponentWise4f(Math.atan2),\n vec4h: binaryComponentWise4h(Math.atan2),\n } as Record<VecKind, <T extends vBase>(a: T, b: T) => T>,\n\n acos: {\n vec2f: unary2f(Math.acos),\n vec2h: unary2h(Math.acos),\n vec2i: unary2i(Math.acos),\n vec2u: unary2u(Math.acos),\n\n vec3f: unary3f(Math.acos),\n vec3h: unary3h(Math.acos),\n vec3i: unary3i(Math.acos),\n vec3u: unary3u(Math.acos),\n\n vec4f: unary4f(Math.acos),\n vec4h: unary4h(Math.acos),\n vec4i: unary4i(Math.acos),\n vec4u: unary4u(Math.acos),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n acosh: {\n vec2f: unary2f(Math.acosh),\n vec2h: unary2h(Math.acosh),\n\n vec3f: unary3f(Math.acosh),\n vec3h: unary3h(Math.acosh),\n\n vec4f: unary4f(Math.acosh),\n vec4h: unary4h(Math.acosh),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n asin: {\n vec2f: unary2f(Math.asin),\n vec2h: unary2h(Math.asin),\n\n vec3f: unary3f(Math.asin),\n vec3h: unary3h(Math.asin),\n\n vec4f: unary4f(Math.asin),\n vec4h: unary4h(Math.asin),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n asinh: {\n vec2f: unary2f(Math.asinh),\n vec2h: unary2h(Math.asinh),\n\n vec3f: unary3f(Math.asinh),\n vec3h: unary3h(Math.asinh),\n\n vec4f: unary4f(Math.asinh),\n vec4h: unary4h(Math.asinh),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n atan: {\n vec2f: unary2f(Math.atan),\n vec2h: unary2h(Math.atan),\n\n vec3f: unary3f(Math.atan),\n vec3h: unary3h(Math.atan),\n\n vec4f: unary4f(Math.atan),\n vec4h: unary4h(Math.atan),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n atanh: {\n vec2f: unary2f(Math.atanh),\n vec2h: unary2h(Math.atanh),\n\n vec3f: unary3f(Math.atanh),\n vec3h: unary3h(Math.atanh),\n\n vec4f: unary4f(Math.atanh),\n vec4h: unary4h(Math.atanh),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n ceil: {\n vec2f: unary2f(Math.ceil),\n vec2h: unary2h(Math.ceil),\n\n vec3f: unary3f(Math.ceil),\n vec3h: unary3h(Math.ceil),\n\n vec4f: unary4f(Math.ceil),\n vec4h: unary4h(Math.ceil),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n clamp: {\n vec2f: (v: wgsl.v2f, low: wgsl.v2f, high: wgsl.v2f) =>\n vec2f(clamp(v.x, low.x, high.x), clamp(v.y, low.y, high.y)),\n vec2h: (v: wgsl.v2h, low: wgsl.v2h, high: wgsl.v2h) =>\n vec2h(clamp(v.x, low.x, high.x), clamp(v.y, low.y, high.y)),\n vec2i: (v: wgsl.v2i, low: wgsl.v2i, high: wgsl.v2i) =>\n vec2i(clamp(v.x, low.x, high.x), clamp(v.y, low.y, high.y)),\n vec2u: (v: wgsl.v2u, low: wgsl.v2u, high: wgsl.v2u) =>\n vec2u(clamp(v.x, low.x, high.x), clamp(v.y, low.y, high.y)),\n\n vec3f: (v: wgsl.v3f, low: wgsl.v3f, high: wgsl.v3f) =>\n vec3f(\n clamp(v.x, low.x, high.x),\n clamp(v.y, low.y, high.y),\n clamp(v.z, low.z, high.z),\n ),\n vec3h: (v: wgsl.v3h, low: wgsl.v3h, high: wgsl.v3h) =>\n vec3h(\n clamp(v.x, low.x, high.x),\n clamp(v.y, low.y, high.y),\n clamp(v.z, low.z, high.z),\n ),\n vec3i: (v: wgsl.v3i, low: wgsl.v3i, high: wgsl.v3f) =>\n vec3i(\n clamp(v.x, low.x, high.x),\n clamp(v.y, low.y, high.y),\n clamp(v.z, low.z, high.z),\n ),\n vec3u: (v: wgsl.v3u, low: wgsl.v3u, high: wgsl.v3f) =>\n vec3u(\n clamp(v.x, low.x, high.x),\n clamp(v.y, low.y, high.y),\n clamp(v.z, low.z, high.z),\n ),\n\n vec4f: (v: wgsl.v4f, low: wgsl.v4f, high: wgsl.v4f) =>\n vec4f(\n clamp(v.x, low.x, high.x),\n clamp(v.y, low.y, high.y),\n clamp(v.z, low.z, high.z),\n clamp(v.w, low.w, high.w),\n ),\n vec4h: (v: wgsl.v4h, low: wgsl.v4h, high: wgsl.v4h) =>\n vec4h(\n clamp(v.x, low.x, high.x),\n clamp(v.y, low.y, high.y),\n clamp(v.z, low.z, high.z),\n clamp(v.w, low.w, high.w),\n ),\n vec4i: (v: wgsl.v4i, low: wgsl.v4i, high: wgsl.v4i) =>\n vec4i(\n clamp(v.x, low.x, high.x),\n clamp(v.y, low.y, high.y),\n clamp(v.z, low.z, high.z),\n clamp(v.w, low.w, high.w),\n ),\n vec4u: (v: wgsl.v4u, low: wgsl.v4u, high: wgsl.v4u) =>\n vec4u(\n clamp(v.x, low.x, high.x),\n clamp(v.y, low.y, high.y),\n clamp(v.z, low.z, high.z),\n clamp(v.w, low.w, high.w),\n ),\n } as Record<VecKind, <T extends vBase>(v: T, low: T, high: T) => T>,\n\n length: {\n vec2f: lengthVec2,\n vec2h: lengthVec2,\n\n vec3f: lengthVec3,\n vec3h: lengthVec3,\n\n vec4f: lengthVec4,\n vec4h: lengthVec4,\n } as Record<VecKind, (v: vBase) => number>,\n\n add: {\n vec2f: binaryComponentWise2f((a, b) => a + b),\n vec2h: binaryComponentWise2h((a, b) => a + b),\n vec2i: binaryComponentWise2i((a, b) => a + b),\n vec2u: binaryComponentWise2u((a, b) => a + b),\n\n vec3f: binaryComponentWise3f((a, b) => a + b),\n vec3h: binaryComponentWise3h((a, b) => a + b),\n vec3i: binaryComponentWise3i((a, b) => a + b),\n vec3u: binaryComponentWise3u((a, b) => a + b),\n\n vec4f: binaryComponentWise4f((a, b) => a + b),\n vec4h: binaryComponentWise4h((a, b) => a + b),\n vec4i: binaryComponentWise4i((a, b) => a + b),\n vec4u: binaryComponentWise4u((a, b) => a + b),\n\n mat2x2f: binaryComponentWise2x2f((a, b) => a + b),\n mat3x3f: binaryComponentWise3x3f((a, b) => a + b),\n mat4x4f: binaryComponentWise4x4f((a, b) => a + b),\n } as Record<\n VecKind | MatKind,\n <T extends vBase | mBase>(lhs: T, rhs: T) => T\n >,\n\n smoothstep: {\n vec2f: ternaryComponentWise2f(smoothstepScalar),\n vec2h: ternaryComponentWise2h(smoothstepScalar),\n vec3f: ternaryComponentWise3f(smoothstepScalar),\n vec3h: ternaryComponentWise3h(smoothstepScalar),\n vec4f: ternaryComponentWise4f(smoothstepScalar),\n vec4h: ternaryComponentWise4h(smoothstepScalar),\n } as Record<\n VecKind,\n <T extends vBase>(\n edge0: T,\n edge1: T,\n x: T,\n ) => T extends wgsl.AnyVec2Instance ? wgsl.v2f\n : T extends wgsl.AnyVec3Instance ? wgsl.v3f\n : T extends wgsl.AnyVec4Instance ? wgsl.v4f\n : wgsl.AnyVecInstance\n >,\n\n addMixed: {\n vec2f: (a: wgsl.v2f, b: number) => unary2f((e) => e + b)(a),\n vec2h: (a: wgsl.v2h, b: number) => unary2h((e) => e + b)(a),\n vec2i: (a: wgsl.v2i, b: number) => unary2i((e) => e + b)(a),\n vec2u: (a: wgsl.v2u, b: number) => unary2u((e) => e + b)(a),\n\n vec3f: (a: wgsl.v3f, b: number) => unary3f((e) => e + b)(a),\n vec3h: (a: wgsl.v3h, b: number) => unary3h((e) => e + b)(a),\n vec3i: (a: wgsl.v3i, b: number) => unary3i((e) => e + b)(a),\n vec3u: (a: wgsl.v3u, b: number) => unary3u((e) => e + b)(a),\n\n vec4f: (a: wgsl.v4f, b: number) => unary4f((e) => e + b)(a),\n vec4h: (a: wgsl.v4h, b: number) => unary4h((e) => e + b)(a),\n vec4i: (a: wgsl.v4i, b: number) => unary4i((e) => e + b)(a),\n vec4u: (a: wgsl.v4u, b: number) => unary4u((e) => e + b)(a),\n\n mat2x2f: (a: wgsl.m2x2f, b: number) => unary2x2f((e) => e + b)(a),\n mat3x3f: (a: wgsl.m3x3f, b: number) => unary3x3f((e) => e + b)(a),\n mat4x4f: (a: wgsl.m4x4f, b: number) => unary4x4f((e) => e + b)(a),\n } as Record<\n VecKind | MatKind,\n <T extends vBase | mBase>(lhs: T, rhs: number) => T\n >,\n\n mulSxV: {\n vec2f: (s: number, v: wgsl.v2f) => unary2f((e) => s * e)(v),\n vec2h: (s: number, v: wgsl.v2h) => unary2h((e) => s * e)(v),\n vec2i: (s: number, v: wgsl.v2i) => unary2i((e) => s * e)(v),\n vec2u: (s: number, v: wgsl.v2u) => unary2u((e) => s * e)(v),\n\n vec3f: (s: number, v: wgsl.v3f) => unary3f((e) => s * e)(v),\n vec3h: (s: number, v: wgsl.v3h) => unary3h((e) => s * e)(v),\n vec3i: (s: number, v: wgsl.v3i) => unary3i((e) => s * e)(v),\n vec3u: (s: number, v: wgsl.v3u) => unary3u((e) => s * e)(v),\n\n vec4f: (s: number, v: wgsl.v4f) => unary4f((e) => s * e)(v),\n vec4h: (s: number, v: wgsl.v4h) => unary4h((e) => s * e)(v),\n vec4i: (s: number, v: wgsl.v4i) => unary4i((e) => s * e)(v),\n vec4u: (s: number, v: wgsl.v4u) => unary4u((e) => s * e)(v),\n\n mat2x2f: (s: number, m: wgsl.m2x2f) => unary2x2f((e) => s * e)(m),\n mat3x3f: (s: number, m: wgsl.m3x3f) => unary3x3f((e) => s * e)(m),\n mat4x4f: (s: number, m: wgsl.m4x4f) => unary4x4f((e) => s * e)(m),\n } as Record<\n VecKind | MatKind,\n <T extends vBase | wgsl.AnyMatInstance>(s: number, v: T) => T\n >,\n\n mulVxV: {\n vec2f: binaryComponentWise2f((a, b) => a * b),\n vec2h: binaryComponentWise2h((a, b) => a * b),\n vec2i: binaryComponentWise2i((a, b) => a * b),\n vec2u: binaryComponentWise2u((a, b) => a * b),\n\n vec3f: binaryComponentWise3f((a, b) => a * b),\n vec3h: binaryComponentWise3h((a, b) => a * b),\n vec3i: binaryComponentWise3i((a, b) => a * b),\n vec3u: binaryComponentWise3u((a, b) => a * b),\n\n vec4f: binaryComponentWise4f((a, b) => a * b),\n vec4h: binaryComponentWise4h((a, b) => a * b),\n vec4i: binaryComponentWise4i((a, b) => a * b),\n vec4u: binaryComponentWise4u((a, b) => a * b),\n\n mat2x2f: (a: wgsl.m2x2f, b: wgsl.m2x2f) => {\n const a_ = a.columns;\n const b_ = b.columns;\n\n return mat2x2f(\n a_[0].x * b_[0].x + a_[1].x * b_[0].y,\n a_[0].y * b_[0].x + a_[1].y * b_[0].y,\n a_[0].x * b_[1].x + a_[1].x * b_[1].y,\n a_[0].y * b_[1].x + a_[1].y * b_[1].y,\n );\n },\n\n mat3x3f: (a: wgsl.m3x3f, b: wgsl.m3x3f) => {\n const a_ = a.columns;\n const b_ = b.columns;\n\n return mat3x3f(\n a_[0].x * b_[0].x + a_[1].x * b_[0].y + a_[2].x * b_[0].z,\n a_[0].y * b_[0].x + a_[1].y * b_[0].y + a_[2].y * b_[0].z,\n a_[0].z * b_[0].x + a_[1].z * b_[0].y + a_[2].z * b_[0].z,\n a_[0].x * b_[1].x + a_[1].x * b_[1].y + a_[2].x * b_[1].z,\n a_[0].y * b_[1].x + a_[1].y * b_[1].y + a_[2].y * b_[1].z,\n a_[0].z * b_[1].x + a_[1].z * b_[1].y + a_[2].z * b_[1].z,\n a_[0].x * b_[2].x + a_[1].x * b_[2].y + a_[2].x * b_[2].z,\n a_[0].y * b_[2].x + a_[1].y * b_[2].y + a_[2].y * b_[2].z,\n a_[0].z * b_[2].x + a_[1].z * b_[2].y + a_[2].z * b_[2].z,\n );\n },\n\n mat4x4f: (a: wgsl.m4x4f, b: wgsl.m4x4f) => {\n const a_ = a.columns;\n const b_ = b.columns;\n\n return mat4x4f(\n a_[0].x * b_[0].x +\n a_[1].x * b_[0].y +\n a_[2].x * b_[0].z +\n a_[3].x * b_[0].w,\n a_[0].y * b_[0].x +\n a_[1].y * b_[0].y +\n a_[2].y * b_[0].z +\n a_[3].y * b_[0].w,\n a_[0].z * b_[0].x +\n a_[1].z * b_[0].y +\n a_[2].z * b_[0].z +\n a_[3].z * b_[0].w,\n a_[0].w * b_[0].x +\n a_[1].w * b_[0].y +\n a_[2].w * b_[0].z +\n a_[3].w * b_[0].w,\n a_[0].x * b_[1].x +\n a_[1].x * b_[1].y +\n a_[2].x * b_[1].z +\n a_[3].x * b_[1].w,\n a_[0].y * b_[1].x +\n a_[1].y * b_[1].y +\n a_[2].y * b_[1].z +\n a_[3].y * b_[1].w,\n a_[0].z * b_[1].x +\n a_[1].z * b_[1].y +\n a_[2].z * b_[1].z +\n a_[3].z * b_[1].w,\n a_[0].w * b_[1].x +\n a_[1].w * b_[1].y +\n a_[2].w * b_[1].z +\n a_[3].w * b_[1].w,\n a_[0].x * b_[2].x +\n a_[1].x * b_[2].y +\n a_[2].x * b_[2].z +\n a_[3].x * b_[2].w,\n a_[0].y * b_[2].x +\n a_[1].y * b_[2].y +\n a_[2].y * b_[2].z +\n a_[3].y * b_[2].w,\n a_[0].z * b_[2].x +\n a_[1].z * b_[2].y +\n a_[2].z * b_[2].z +\n a_[3].z * b_[2].w,\n a_[0].w * b_[2].x +\n a_[1].w * b_[2].y +\n a_[2].w * b_[2].z +\n a_[3].w * b_[2].w,\n a_[0].x * b_[3].x +\n a_[1].x * b_[3].y +\n a_[2].x * b_[3].z +\n a_[3].x * b_[3].w,\n a_[0].y * b_[3].x +\n a_[1].y * b_[3].y +\n a_[2].y * b_[3].z +\n a_[3].y * b_[3].w,\n a_[0].z * b_[3].x +\n a_[1].z * b_[3].y +\n a_[2].z * b_[3].z +\n a_[3].z * b_[3].w,\n a_[0].w * b_[3].x +\n a_[1].w * b_[3].y +\n a_[2].w * b_[3].z +\n a_[3].w * b_[3].w,\n );\n },\n } as Record<\n VecKind | MatKind,\n <T extends vBase | wgsl.AnyMatInstance>(lhs: T, rhs: T) => T\n >,\n\n mulMxV: {\n mat2x2f: (m: wgsl.m2x2f, v: wgsl.v2f) => {\n const m_ = m.columns;\n return vec2f(\n m_[0].x * v.x + m_[1].x * v.y,\n m_[0].y * v.x + m_[1].y * v.y,\n );\n },\n\n mat3x3f: (m: wgsl.m3x3f, v: wgsl.v3f) => {\n const m_ = m.columns;\n return vec3f(\n m_[0].x * v.x + m_[1].x * v.y + m_[2].x * v.z,\n m_[0].y * v.x + m_[1].y * v.y + m_[2].y * v.z,\n m_[0].z * v.x + m_[1].z * v.y + m_[2].z * v.z,\n );\n },\n\n mat4x4f: (m: wgsl.m4x4f, v: wgsl.v4f) => {\n const m_ = m.columns;\n return vec4f(\n m_[0].x * v.x + m_[1].x * v.y + m_[2].x * v.z + m_[3].x * v.w,\n m_[0].y * v.x + m_[1].y * v.y + m_[2].y * v.z + m_[3].y * v.w,\n m_[0].z * v.x + m_[1].z * v.y + m_[2].z * v.z + m_[3].z * v.w,\n m_[0].w * v.x + m_[1].w * v.y + m_[2].w * v.z + m_[3].w * v.w,\n );\n },\n } as Record<\n MatKind,\n <T extends wgsl.AnyMatInstance>(\n m: T,\n v: wgsl.vBaseForMat<T>,\n ) => wgsl.vBaseForMat<T>\n >,\n\n mulVxM: {\n mat2x2f: (v: wgsl.v2f, m: wgsl.m2x2f) => {\n const m_ = m.columns;\n return vec2f(\n v.x * m_[0].x + v.y * m_[0].y,\n v.x * m_[1].x + v.y * m_[1].y,\n );\n },\n\n mat3x3f: (v: wgsl.v3f, m: wgsl.m3x3f) => {\n const m_ = m.columns;\n return vec3f(\n v.x * m_[0].x + v.y * m_[0].y + v.z * m_[0].z,\n v.x * m_[1].x + v.y * m_[1].y + v.z * m_[1].z,\n v.x * m_[2].x + v.y * m_[2].y + v.z * m_[2].z,\n );\n },\n\n mat4x4f: (v: wgsl.v4f, m: wgsl.m4x4f) => {\n const m_ = m.columns;\n return vec4f(\n v.x * m_[0].x + v.y * m_[0].y + v.z * m_[0].z + v.w * m_[0].w,\n v.x * m_[1].x + v.y * m_[1].y + v.z * m_[1].z + v.w * m_[1].w,\n v.x * m_[2].x + v.y * m_[2].y + v.z * m_[2].z + v.w * m_[2].w,\n v.x * m_[3].x + v.y * m_[3].y + v.z * m_[3].z + v.w * m_[3].w,\n );\n },\n } as Record<\n MatKind,\n <T extends wgsl.AnyMatInstance>(\n v: wgsl.vBaseForMat<T>,\n m: T,\n ) => wgsl.vBaseForMat<T>\n >,\n\n div: {\n vec2f: binaryComponentWise2f((a, b) => a / b),\n vec2h: binaryComponentWise2h((a, b) => a / b),\n vec2i: binaryComponentWise2i(divInteger),\n vec2u: binaryComponentWise2u(divInteger),\n\n vec3f: binaryComponentWise3f((a, b) => a / b),\n vec3h: binaryComponentWise3h((a, b) => a / b),\n vec3i: binaryComponentWise3i(divInteger),\n vec3u: binaryComponentWise3u(divInteger),\n\n vec4f: binaryComponentWise4f((a, b) => a / b),\n vec4h: binaryComponentWise4h((a, b) => a / b),\n vec4i: binaryComponentWise4i(divInteger),\n vec4u: binaryComponentWise4u(divInteger),\n } as Record<VecKind, <T extends vBase>(a: T, b: T) => T>,\n\n dot: {\n vec2f: dotVec2,\n vec2h: dotVec2,\n vec2i: dotVec2,\n vec2u: dotVec2,\n vec3f: dotVec3,\n vec3h: dotVec3,\n vec3i: dotVec3,\n vec3u: dotVec3,\n vec4f: dotVec4,\n vec4h: dotVec4,\n vec4i: dotVec4,\n vec4u: dotVec4,\n } as Record<VecKind, <T extends vBase>(lhs: T, rhs: T) => number>,\n\n normalize: {\n vec2f: (v: wgsl.v2f) => {\n const len = lengthVec2(v);\n return vec2f(v.x / len, v.y / len);\n },\n vec2h: (v: wgsl.v2h) => {\n const len = lengthVec2(v);\n return vec2h(v.x / len, v.y / len);\n },\n vec2i: (v: wgsl.v2i) => {\n const len = lengthVec2(v);\n return vec2i(v.x / len, v.y / len);\n },\n vec2u: (v: wgsl.v2u) => {\n const len = lengthVec2(v);\n return vec2u(v.x / len, v.y / len);\n },\n\n vec3f: (v: wgsl.v3f) => {\n const len = lengthVec3(v);\n return vec3f(v.x / len, v.y / len, v.z / len);\n },\n vec3h: (v: wgsl.v3h) => {\n const len = lengthVec3(v);\n return vec3h(v.x / len, v.y / len, v.z / len);\n },\n vec3i: (v: wgsl.v3i) => {\n const len = lengthVec3(v);\n return vec3i(v.x / len, v.y / len, v.z / len);\n },\n vec3u: (v: wgsl.v3u) => {\n const len = lengthVec3(v);\n return vec3u(v.x / len, v.y / len, v.z / len);\n },\n\n vec4f: (v: wgsl.v4f) => {\n const len = lengthVec4(v);\n return vec4f(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4h: (v: wgsl.v4h) => {\n const len = lengthVec4(v);\n return vec4h(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4i: (v: wgsl.v4i) => {\n const len = lengthVec4(v);\n return vec4i(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n vec4u: (v: wgsl.v4u) => {\n const len = lengthVec4(v);\n return vec4u(v.x / len, v.y / len, v.z / len, v.w / len);\n },\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n cross: {\n vec3f: (a: wgsl.v3f, b: wgsl.v3f) => {\n return vec3f(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n vec3h: (a: wgsl.v3h, b: wgsl.v3h) => {\n return vec3h(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x,\n );\n },\n } as Record<\n 'vec3f' | 'vec3h',\n <T extends wgsl.v3f | wgsl.v3h>(a: T, b: T) => T\n >,\n\n mod: {\n vec2f: binaryComponentWise2f((a, b) => a % b),\n vec2h: binaryComponentWise2h((a, b) => a % b),\n vec2i: binaryComponentWise2i((a, b) => a % b),\n vec2u: binaryComponentWise2u((a, b) => a % b),\n\n vec3f: binaryComponentWise3f((a, b) => a % b),\n vec3h: binaryComponentWise3h((a, b) => a % b),\n vec3i: binaryComponentWise3i((a, b) => a % b),\n vec3u: binaryComponentWise3u((a, b) => a % b),\n\n vec4f: binaryComponentWise4f((a, b) => a % b),\n vec4h: binaryComponentWise4h((a, b) => a % b),\n vec4i: binaryComponentWise4i((a, b) => a % b),\n vec4u: binaryComponentWise4u((a, b) => a % b),\n } as Record<VecKind, <T extends vBase>(a: T, b: T) => T>,\n\n floor: {\n vec2f: unary2f(Math.floor),\n vec2h: unary2h(Math.floor),\n\n vec3f: unary3f(Math.floor),\n vec3h: unary3h(Math.floor),\n\n vec4f: unary4f(Math.floor),\n vec4h: unary4h(Math.floor),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n max: {\n vec2f: binaryComponentWise2f(Math.max),\n vec2h: binaryComponentWise2h(Math.max),\n vec2i: binaryComponentWise2i(Math.max),\n vec2u: binaryComponentWise2u(Math.max),\n\n vec3f: binaryComponentWise3f(Math.max),\n vec3h: binaryComponentWise3h(Math.max),\n vec3i: binaryComponentWise3i(Math.max),\n vec3u: binaryComponentWise3u(Math.max),\n\n vec4f: binaryComponentWise4f(Math.max),\n vec4h: binaryComponentWise4h(Math.max),\n vec4i: binaryComponentWise4i(Math.max),\n vec4u: binaryComponentWise4u(Math.max),\n } as Record<VecKind, <T extends vBase>(a: T, b: T) => T>,\n\n min: {\n vec2f: binaryComponentWise2f(Math.min),\n vec2h: binaryComponentWise2h(Math.min),\n vec2i: binaryComponentWise2i(Math.min),\n vec2u: binaryComponentWise2u(Math.min),\n\n vec3f: binaryComponentWise3f(Math.min),\n vec3h: binaryComponentWise3h(Math.min),\n vec3i: binaryComponentWise3i(Math.min),\n vec3u: binaryComponentWise3u(Math.min),\n\n vec4f: binaryComponentWise4f(Math.min),\n vec4h: binaryComponentWise4h(Math.min),\n vec4i: binaryComponentWise4i(Math.min),\n vec4u: binaryComponentWise4u(Math.min),\n } as Record<VecKind, <T extends vBase>(a: T, b: T) => T>,\n\n pow: {\n vec2f: (base: wgsl.v2f, exponent: wgsl.v2f) =>\n vec2f(base.x ** exponent.x, base.y ** exponent.y),\n vec2h: (base: wgsl.v2h, exponent: wgsl.v2h) =>\n vec2h(base.x ** exponent.x, base.y ** exponent.y),\n\n vec3f: (base: wgsl.v3f, exponent: wgsl.v3f) =>\n vec3f(base.x ** exponent.x, base.y ** exponent.y, base.z ** exponent.z),\n vec3h: (base: wgsl.v3h, exponent: wgsl.v3h) =>\n vec3h(base.x ** exponent.x, base.y ** exponent.y, base.z ** exponent.z),\n\n vec4f: (base: wgsl.v4f, exponent: wgsl.v4f) =>\n vec4f(\n base.x ** exponent.x,\n base.y ** exponent.y,\n base.z ** exponent.z,\n base.w ** exponent.w,\n ),\n vec4h: (base: wgsl.v4h, exponent: wgsl.v4h) =>\n vec4h(\n base.x ** exponent.x,\n base.y ** exponent.y,\n base.z ** exponent.z,\n base.w ** exponent.w,\n ),\n } as Record<\n 'vec2f' | 'vec3f' | 'vec4f' | 'vec2h' | 'vec3h' | 'vec4h' | 'number',\n <T extends wgsl.AnyFloatVecInstance | number>(a: T, b: T) => T\n >,\n\n sign: {\n vec2f: unary2f(Math.sign),\n vec2h: unary2h(Math.sign),\n vec2i: unary2i(Math.sign),\n\n vec3f: unary3f(Math.sign),\n vec3h: unary3h(Math.sign),\n vec3i: unary3i(Math.sign),\n\n vec4f: unary4f(Math.sign),\n vec4h: unary4h(Math.sign),\n vec4i: unary4i(Math.sign),\n } as Record<VecKind, <T extends vBase>(e: T) => T>,\n\n sqrt: {\n vec2f: unary2f(Math.sqrt),\n vec2h: unary2h(Math.sqrt),\n\n vec3f: unary3f(Math.sqrt),\n vec3h: unary3h(Math.sqrt),\n\n vec4f: unary4f(Math.sqrt),\n vec4h: unary4h(Math.sqrt),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n mix: {\n vec2f: (e1: wgsl.v2f, e2: wgsl.v2f, e3: wgsl.v2f | number) => {\n if (typeof e3 === 'number') {\n return vec2f(e1.x * (1 - e3) + e2.x * e3, e1.y * (1 - e3) + e2.y * e3);\n }\n return vec2f(\n e1.x * (1 - e3.x) + e2.x * e3.x,\n e1.y * (1 - e3.y) + e2.y * e3.y,\n );\n },\n vec2h: (e1: wgsl.v2h, e2: wgsl.v2h, e3: wgsl.v2h | number) => {\n if (typeof e3 === 'number') {\n return vec2h(e1.x * (1 - e3) + e2.x * e3, e1.y * (1 - e3) + e2.y * e3);\n }\n return vec2h(\n e1.x * (1 - e3.x) + e2.x * e3.x,\n e1.y * (1 - e3.y) + e2.y * e3.y,\n );\n },\n\n vec3f: (e1: wgsl.v3f, e2: wgsl.v3f, e3: wgsl.v3f | number) => {\n if (typeof e3 === 'number') {\n return vec3f(\n e1.x * (1 - e3) + e2.x * e3,\n e1.y * (1 - e3) + e2.y * e3,\n e1.z * (1 - e3) + e2.z * e3,\n );\n }\n return vec3f(\n e1.x * (1 - e3.x) + e2.x * e3.x,\n e1.y * (1 - e3.y) + e2.y * e3.y,\n e1.z * (1 - e3.z) + e2.z * e3.z,\n );\n },\n vec3h: (e1: wgsl.v3h, e2: wgsl.v3h, e3: wgsl.v3h | number) => {\n if (typeof e3 === 'number') {\n return vec3h(\n e1.x * (1 - e3) + e2.x * e3,\n e1.y * (1 - e3) + e2.y * e3,\n e1.z * (1 - e3) + e2.z * e3,\n );\n }\n return vec3h(\n e1.x * (1 - e3.x) + e2.x * e3.x,\n e1.y * (1 - e3.y) + e2.y * e3.y,\n e1.z * (1 - e3.z) + e2.z * e3.z,\n );\n },\n\n vec4f: (e1: wgsl.v4f, e2: wgsl.v4f, e3: wgsl.v4f | number) => {\n if (typeof e3 === 'number') {\n return vec4f(\n e1.x * (1 - e3) + e2.x * e3,\n e1.y * (1 - e3) + e2.y * e3,\n e1.z * (1 - e3) + e2.z * e3,\n e1.w * (1 - e3) + e2.w * e3,\n );\n }\n return vec4f(\n e1.x * (1 - e3.x) + e2.x * e3.x,\n e1.y * (1 - e3.y) + e2.y * e3.y,\n e1.z * (1 - e3.z) + e2.z * e3.z,\n e1.w * (1 - e3.w) + e2.w * e3.w,\n );\n },\n vec4h: (e1: wgsl.v4h, e2: wgsl.v4h, e3: wgsl.v4h | number) => {\n if (typeof e3 === 'number') {\n return vec4h(\n e1.x * (1 - e3) + e2.x * e3,\n e1.y * (1 - e3) + e2.y * e3,\n e1.z * (1 - e3) + e2.z * e3,\n e1.w * (1 - e3) + e2.w * e3,\n );\n }\n return vec4h(\n e1.x * (1 - e3.x) + e2.x * e3.x,\n e1.y * (1 - e3.y) + e2.y * e3.y,\n e1.z * (1 - e3.z) + e2.z * e3.z,\n e1.w * (1 - e3.w) + e2.w * e3.w,\n );\n },\n } as Record<\n 'vec2f' | 'vec3f' | 'vec4f' | 'vec2h' | 'vec3h' | 'vec4h',\n <T extends wgsl.v2f | wgsl.v3f | wgsl.v4f | wgsl.v2h | wgsl.v3h | wgsl.v4h>(\n a: T,\n b: T,\n c: T | number,\n ) => T\n >,\n\n sin: {\n vec2f: unary2f(Math.sin),\n vec2h: unary2h(Math.sin),\n\n vec3f: unary3f(Math.sin),\n vec3h: unary3h(Math.sin),\n\n vec4f: unary4f(Math.sin),\n vec4h: unary4h(Math.sin),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n cos: {\n vec2f: unary2f(Math.cos),\n vec2h: unary2h(Math.cos),\n\n vec3f: unary3f(Math.cos),\n vec3h: unary3h(Math.cos),\n\n vec4f: unary4f(Math.cos),\n vec4h: unary4h(Math.cos),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n cosh: {\n vec2f: unary2f(Math.cosh),\n vec2h: unary2h(Math.cosh),\n\n vec3f: unary3f(Math.cosh),\n vec3h: unary3h(Math.cosh),\n\n vec4f: unary4f(Math.cosh),\n vec4h: unary4h(Math.cosh),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n exp: {\n vec2f: unary2f(Math.exp),\n vec2h: unary2h(Math.exp),\n\n vec3f: unary3f(Math.exp),\n vec3h: unary3h(Math.exp),\n\n vec4f: unary4f(Math.exp),\n vec4h: unary4h(Math.exp),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n exp2: {\n vec2f: unary2f((val) => 2 ** val),\n vec2h: unary2h((val) => 2 ** val),\n\n vec3f: unary3f((val) => 2 ** val),\n vec3h: unary3h((val) => 2 ** val),\n\n vec4f: unary4f((val) => 2 ** val),\n vec4h: unary4h((val) => 2 ** val),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n log: {\n vec2f: unary2f(Math.log),\n vec2h: unary2h(Math.log),\n\n vec3f: unary3f(Math.log),\n vec3h: unary3h(Math.log),\n\n vec4f: unary4f(Math.log),\n vec4h: unary4h(Math.log),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n log2: {\n vec2f: unary2f(Math.log2),\n vec2h: unary2h(Math.log2),\n\n vec3f: unary3f(Math.log2),\n vec3h: unary3h(Math.log2),\n\n vec4f: unary4f(Math.log2),\n vec4h: unary4h(Math.log2),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n fract: {\n vec2f: unary2f((value) => value - Math.floor(value)),\n vec2h: unary2h((value) => value - Math.floor(value)),\n\n vec3f: unary3f((value) => value - Math.floor(value)),\n vec3h: unary3h((value) => value - Math.floor(value)),\n\n vec4f: unary4f((value) => value - Math.floor(value)),\n vec4h: unary4h((value) => value - Math.floor(value)),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n isCloseToZero: {\n vec2f: (v: wgsl.v2f, n: number) => Math.abs(v.x) <= n && Math.abs(v.y) <= n,\n vec2h: (v: wgsl.v2h, n: number) => Math.abs(v.x) <= n && Math.abs(v.y) <= n,\n\n vec3f: (v: wgsl.v3f, n: number) =>\n Math.abs(v.x) <= n && Math.abs(v.y) <= n && Math.abs(v.z) <= n,\n vec3h: (v: wgsl.v3h, n: number) =>\n Math.abs(v.x) <= n && Math.abs(v.y) <= n && Math.abs(v.z) <= n,\n\n vec4f: (v: wgsl.v4f, n: number) =>\n Math.abs(v.x) <= n &&\n Math.abs(v.y) <= n &&\n Math.abs(v.z) <= n &&\n Math.abs(v.w) <= n,\n vec4h: (v: wgsl.v4h, n: number) =>\n Math.abs(v.x) <= n &&\n Math.abs(v.y) <= n &&\n Math.abs(v.z) <= n &&\n Math.abs(v.w) <= n,\n } as Record<VecKind, <T extends vBase>(v: T, n: number) => boolean>,\n\n neg: {\n vec2f: unary2f((value) => -value),\n vec2h: unary2h((value) => -value),\n vec2i: unary2i((value) => -value),\n vec2u: unary2u((value) => -value),\n 'vec2<bool>': (e: wgsl.v2b) => vec2b(!e.x, !e.y),\n\n vec3f: unary3f((value) => -value),\n vec3h: unary3h((value) => -value),\n vec3i: unary3i((value) => -value),\n vec3u: unary3u((value) => -value),\n 'vec3<bool>': (e: wgsl.v3b) => vec3b(!e.x, !e.y, !e.z),\n\n vec4f: unary4f((value) => -value),\n vec4h: unary4h((value) => -value),\n vec4i: unary4i((value) => -value),\n vec4u: unary4u((value) => -value),\n 'vec4<bool>': (e: wgsl.v4b) => vec4b(!e.x, !e.y, !e.z, !e.w),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n select: {\n vec2f: (f: wgsl.v2f, t: wgsl.v2f, c: wgsl.v2b) =>\n vec2f(c.x ? t.x : f.x, c.y ? t.y : f.y),\n vec2h: (f: wgsl.v2h, t: wgsl.v2h, c: wgsl.v2b) =>\n vec2h(c.x ? t.x : f.x, c.y ? t.y : f.y),\n vec2i: (f: wgsl.v2i, t: wgsl.v2i, c: wgsl.v2b) =>\n vec2i(c.x ? t.x : f.x, c.y ? t.y : f.y),\n vec2u: (f: wgsl.v2u, t: wgsl.v2u, c: wgsl.v2b) =>\n vec2u(c.x ? t.x : f.x, c.y ? t.y : f.y),\n 'vec2<bool>': (f: wgsl.v2b, t: wgsl.v2b, c: wgsl.v2b) =>\n vec2b(c.x ? t.x : f.x, c.y ? t.y : f.y),\n\n vec3f: (f: wgsl.v3f, t: wgsl.v3f, c: wgsl.v3b) =>\n vec3f(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z),\n vec3h: (f: wgsl.v3h, t: wgsl.v3h, c: wgsl.v3b) =>\n vec3h(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z),\n vec3i: (f: wgsl.v3i, t: wgsl.v3i, c: wgsl.v3b) =>\n vec3i(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z),\n vec3u: (f: wgsl.v3u, t: wgsl.v3u, c: wgsl.v3b) =>\n vec3u(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z),\n 'vec3<bool>': (f: wgsl.v3b, t: wgsl.v3b, c: wgsl.v3b) =>\n vec3b(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z),\n\n vec4f: (f: wgsl.v4f, t: wgsl.v4f, c: wgsl.v4b) =>\n vec4f(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z, c.w ? t.w : f.w),\n vec4h: (f: wgsl.v4h, t: wgsl.v4h, c: wgsl.v4b) =>\n vec4h(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z, c.w ? t.w : f.w),\n vec4i: (f: wgsl.v4i, t: wgsl.v4i, c: wgsl.v4b) =>\n vec4i(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z, c.w ? t.w : f.w),\n vec4u: (f: wgsl.v4u, t: wgsl.v4u, c: wgsl.v4b) =>\n vec4u(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z, c.w ? t.w : f.w),\n 'vec4<bool>': (f: wgsl.v4b, t: wgsl.v4b, c: wgsl.v4b) =>\n vec4b(c.x ? t.x : f.x, c.y ? t.y : f.y, c.z ? t.z : f.z, c.w ? t.w : f.w),\n } as Record<\n VecKind,\n <T extends wgsl.AnyVecInstance>(\n f: T,\n t: T,\n c: T extends wgsl.AnyVec2Instance ? wgsl.v2b\n : T extends wgsl.AnyVec3Instance ? wgsl.v3b\n : wgsl.v4b,\n ) => T\n >,\n\n tanh: {\n vec2f: unary2f(Math.tanh),\n vec2h: unary2h(Math.tanh),\n\n vec3f: unary3f(Math.tanh),\n vec3h: unary3h(Math.tanh),\n\n vec4f: unary4f(Math.tanh),\n vec4h: unary4h(Math.tanh),\n } as Record<VecKind, <T extends vBase>(v: T) => T>,\n\n bitcastU32toF32: {\n vec2u: (n: wgsl.v2u) =>\n vec2f(bitcastU32toF32Impl(n.x), bitcastU32toF32Impl(n.y)),\n vec3u: (n: wgsl.v3u) =>\n vec3f(\n bitcastU32toF32Impl(n.x),\n bitcastU32toF32Impl(n.y),\n bitcastU32toF32Impl(n.z),\n ),\n vec4u: (n: wgsl.v4u) =>\n vec4f(\n bitcastU32toF32Impl(n.x),\n bitcastU32toF32Impl(n.y),\n bitcastU32toF32Impl(n.z),\n bitcastU32toF32Impl(n.w),\n ),\n } as Record<\n VecKind,\n <T extends wgsl.AnyUnsignedVecInstance>(\n v: T,\n ) => T extends wgsl.v2u ? wgsl.v2f\n : T extends wgsl.v3u ? wgsl.v3f\n : wgsl.v4f\n >,\n\n bitcastU32toI32: {\n vec2u: (n: wgsl.v2u) =>\n vec2i(bitcastU32toI32Impl(n.x), bitcastU32toI32Impl(n.y)),\n vec3u: (n: wgsl.v3u) =>\n vec3i(\n bitcastU32toI32Impl(n.x),\n bitcastU32toI32Impl(n.y),\n bitcastU32toI32Impl(n.z),\n ),\n vec4u: (n: wgsl.v4u) =>\n vec4i(\n bitcastU32toI32Impl(n.x),\n bitcastU32toI32Impl(n.y),\n bitcastU32toI32Impl(n.z),\n bitcastU32toI32Impl(n.w),\n ),\n } as Record<\n VecKind,\n <T extends wgsl.AnyUnsignedVecInstance>(\n v: T,\n ) => T extends wgsl.v2u ? wgsl.v2i\n : T extends wgsl.v3u ? wgsl.v3i\n : wgsl.v4i\n >,\n};\n","import { dualImpl } from '../core/function/dualImpl.ts';\nimport { stitch } from '../core/resolve/stitch.ts';\nimport { abstractFloat, f16, f32 } from '../data/numeric.ts';\nimport { vecTypeToConstructor } from '../data/vector.ts';\nimport { VectorOps } from '../data/vectorOps.ts';\nimport {\n type AnyMatInstance,\n type AnyNumericVecInstance,\n type BaseData,\n isFloat32VecInstance,\n isMat,\n isMatInstance,\n isVec,\n isVecInstance,\n type mBaseForVec,\n type vBaseForMat,\n} from '../data/wgslTypes.ts';\nimport { SignatureNotSupportedError } from '../errors.ts';\nimport { unify } from '../tgsl/conversion.ts';\n\ntype NumVec = AnyNumericVecInstance;\ntype Mat = AnyMatInstance;\n\nconst getPrimitive = (t: BaseData): BaseData =>\n 'primitive' in t ? (t.primitive as BaseData) : t;\n\nconst makeBinarySignature = (opts?: {\n matVecProduct?: boolean;\n noMat?: boolean;\n restrict?: BaseData[];\n}) =>\n(lhs: BaseData, rhs: BaseData) => {\n const { restrict } = opts ?? {};\n const fail = (msg: string): never => {\n if (restrict) {\n throw new SignatureNotSupportedError([lhs, rhs], restrict);\n }\n throw new Error(\n `Cannot apply operator to ${lhs.type} and ${rhs.type}: ${msg}`,\n );\n };\n\n if (opts?.noMat && (isMat(lhs) || isMat(rhs))) {\n return fail('matrices not supported');\n }\n const lhsC = isVec(lhs) || isMat(lhs);\n const rhsC = isVec(rhs) || isMat(rhs);\n\n if (!lhsC && !rhsC) {\n // scalar × scalar\n const unified = unify([lhs, rhs], restrict);\n if (!unified) return fail('incompatible scalar types');\n return { argTypes: unified, returnType: unified[0] };\n }\n\n if (lhsC && rhsC) {\n // vec × mat or mat × vec\n if (opts?.matVecProduct && isVec(lhs) !== isVec(rhs)) {\n return { argTypes: [lhs, rhs], returnType: isVec(lhs) ? lhs : rhs };\n }\n // composite × composite (same kind)\n if (lhs.type !== rhs.type) return fail('operands must have the same type');\n return { argTypes: [lhs, rhs], returnType: lhs };\n }\n\n // scalar × composite\n const [scalar, composite] = lhsC ? [rhs, lhs] : [lhs, rhs];\n const unified = unify([scalar], [getPrimitive(composite)]);\n if (!unified) {\n return fail(`scalar not convertible to ${getPrimitive(composite).type}`);\n }\n return {\n argTypes: lhsC ? [lhs, unified[0]] : [unified[0], rhs],\n returnType: composite,\n };\n};\n\nconst binaryArithmeticSignature = makeBinarySignature();\nconst binaryMulSignature = makeBinarySignature({ matVecProduct: true });\nconst binaryDivSignature = makeBinarySignature({\n noMat: true,\n restrict: [f32, f16, abstractFloat],\n});\n\nfunction cpuAdd(lhs: number, rhs: number): number; // default addition\nfunction cpuAdd<T extends NumVec>(lhs: number, rhs: T): T; // mixed addition\nfunction cpuAdd<T extends NumVec>(lhs: T, rhs: number): T; // mixed addition\nfunction cpuAdd<T extends NumVec | Mat>(lhs: T, rhs: T): T; // component-wise addition\nfunction cpuAdd<\n // union overload\n Lhs extends number | NumVec | Mat,\n Rhs extends Lhs extends number ? number | NumVec\n : Lhs extends NumVec ? number | Lhs\n : Lhs extends Mat ? Lhs\n : never,\n>(lhs: Lhs, rhs: Rhs): Lhs | Rhs;\nfunction cpuAdd(lhs: number | NumVec | Mat, rhs: number | NumVec | Mat) {\n if (typeof lhs === 'number' && typeof rhs === 'number') {\n return lhs + rhs; // default addition\n }\n if (typeof lhs === 'number' && isVecInstance(rhs)) {\n return VectorOps.addMixed[rhs.kind](rhs, lhs); // mixed addition\n }\n if (isVecInstance(lhs) && typeof rhs === 'number') {\n return VectorOps.addMixed[lhs.kind](lhs, rhs); // mixed addition\n }\n if (\n (isVecInstance(lhs) && isVecInstance(rhs)) ||\n (isMatInstance(lhs) && isMatInstance(rhs))\n ) {\n return VectorOps.add[lhs.kind](lhs, rhs); // component-wise addition\n }\n\n throw new Error('Add/Sub called with invalid arguments.');\n}\n\nexport const add = dualImpl({\n name: 'add',\n signature: binaryArithmeticSignature,\n normalImpl: cpuAdd,\n codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} + ${rhs})`,\n});\n\nfunction cpuSub(lhs: number, rhs: number): number; // default subtraction\nfunction cpuSub<T extends NumVec>(lhs: number, rhs: T): T; // mixed subtraction\nfunction cpuSub<T extends NumVec>(lhs: T, rhs: number): T; // mixed subtraction\nfunction cpuSub<T extends NumVec | Mat>(lhs: T, rhs: T): T; // component-wise subtraction\nfunction cpuSub<\n // union overload\n Lhs extends number | NumVec | Mat,\n Rhs extends Lhs extends number ? number | NumVec\n : Lhs extends NumVec ? number | Lhs\n : Lhs extends Mat ? Lhs\n : never,\n>(lhs: Lhs, rhs: Rhs): Lhs | Rhs;\nfunction cpuSub(lhs: number | NumVec | Mat, rhs: number | NumVec | Mat) {\n // while illegal on the wgsl side, we can do this in js\n return cpuAdd(lhs, cpuMul(-1, rhs));\n}\n\nexport const sub = dualImpl({\n name: 'sub',\n signature: binaryArithmeticSignature,\n normalImpl: cpuSub,\n codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} - ${rhs})`,\n});\n\nfunction cpuMul(lhs: number, rhs: number): number; // default multiplication\nfunction cpuMul<MV extends NumVec | Mat>(lhs: number, rhs: MV): MV; // scale\nfunction cpuMul<MV extends NumVec | Mat>(lhs: MV, rhs: number): MV; // scale\nfunction cpuMul<V extends NumVec>(lhs: V, rhs: V): V; // component-wise multiplication\nfunction cpuMul<M extends Mat, V extends vBaseForMat<M>>(lhs: V, rhs: M): V; // row-vector-matrix\nfunction cpuMul<M extends Mat, V extends vBaseForMat<M>>(lhs: M, rhs: V): V; // matrix-column-vector\nfunction cpuMul<M extends Mat>(lhs: M, rhs: M): M; // matrix multiplication\nfunction cpuMul<\n // union overload\n Lhs extends number | NumVec | Mat,\n Rhs extends Lhs extends number ? number | NumVec | Mat\n : Lhs extends NumVec ? number | Lhs | mBaseForVec<Lhs>\n : Lhs extends Mat ? number | vBaseForMat<Lhs> | Lhs\n : never,\n>(lhs: Lhs, rhs: Rhs): Lhs | Rhs;\nfunction cpuMul(lhs: number | NumVec | Mat, rhs: number | NumVec | Mat) {\n if (typeof lhs === 'number' && typeof rhs === 'number') {\n return lhs * rhs; // default multiplication\n }\n if (typeof lhs === 'number' && (isVecInstance(rhs) || isMatInstance(rhs))) {\n return VectorOps.mulSxV[rhs.kind](lhs, rhs); // scale\n }\n if ((isVecInstance(lhs) || isMatInstance(lhs)) && typeof rhs === 'number') {\n return VectorOps.mulSxV[lhs.kind](rhs, lhs); // scale\n }\n if (isVecInstance(lhs) && isVecInstance(rhs)) {\n return VectorOps.mulVxV[lhs.kind](lhs, rhs); // component-wise\n }\n if (isFloat32VecInstance(lhs) && isMatInstance(rhs)) {\n return VectorOps.mulVxM[rhs.kind](lhs, rhs); // row-vector-matrix\n }\n if (isMatInstance(lhs) && isFloat32VecInstance(rhs)) {\n return VectorOps.mulMxV[lhs.kind](lhs, rhs); // matrix-column-vector\n }\n if (isMatInstance(lhs) && isMatInstance(rhs)) {\n return VectorOps.mulVxV[lhs.kind](lhs, rhs); // matrix multiplication\n }\n\n throw new Error('Mul called with invalid arguments.');\n}\n\nexport const mul = dualImpl({\n name: 'mul',\n signature: binaryMulSignature,\n normalImpl: cpuMul,\n codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} * ${rhs})`,\n});\n\nfunction cpuDiv(lhs: number, rhs: number): number; // default js division\nfunction cpuDiv<T extends NumVec>(lhs: T, rhs: T): T; // component-wise division\nfunction cpuDiv<T extends NumVec>(lhs: number, rhs: T): T; // mixed division\nfunction cpuDiv<T extends NumVec>(lhs: T, rhs: number): T; // mixed division\nfunction cpuDiv(lhs: NumVec | number, rhs: NumVec | number): NumVec | number {\n if (typeof lhs === 'number' && typeof rhs === 'number') {\n return lhs / rhs;\n }\n if (typeof lhs === 'number' && isVecInstance(rhs)) {\n const schema = vecTypeToConstructor[rhs.kind];\n return VectorOps.div[rhs.kind](schema(lhs), rhs);\n }\n if (isVecInstance(lhs) && typeof rhs === 'number') {\n const schema = vecTypeToConstructor[lhs.kind];\n return VectorOps.div[lhs.kind](lhs, schema(rhs));\n }\n if (isVecInstance(lhs) && isVecInstance(rhs)) {\n return VectorOps.div[lhs.kind](lhs, rhs);\n }\n throw new Error('Div called with invalid arguments.');\n}\n\nexport const div = dualImpl({\n name: 'div',\n signature: binaryDivSignature,\n normalImpl: cpuDiv,\n codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} / ${rhs})`,\n ignoreImplicitCastWarning: true,\n});\n\ntype ModOverload = {\n (a: number, b: number): number;\n <T extends NumVec>(a: T, b: T): T;\n <T extends NumVec>(a: number, b: T): T;\n <T extends NumVec>(a: T, b: number): T;\n};\n\n/**\n * @privateRemarks\n * Both JS and WGSL implementations use truncated definition of modulo\n */\nexport const mod = dualImpl({\n name: 'mod',\n signature: binaryDivSignature,\n normalImpl: (<T extends NumVec | number>(a: T, b: T): T => {\n if (typeof a === 'number' && typeof b === 'number') {\n return (a % b) as T; // scalar % scalar\n }\n if (typeof a === 'number' && isVecInstance(b)) {\n // scalar % vector\n const schema = vecTypeToConstructor[b.kind];\n return VectorOps.mod[b.kind](schema(a), b) as T;\n }\n if (isVecInstance(a) && typeof b === 'number') {\n const schema = vecTypeToConstructor[a.kind];\n // vector % scalar\n return VectorOps.mod[a.kind](a, schema(b)) as T;\n }\n\n if (isVecInstance(a) && isVecInstance(b)) {\n // vector % vector\n return VectorOps.mod[a.kind](a, b) as T;\n }\n throw new Error(\n 'Mod called with invalid arguments, expected types: number or vector.',\n );\n }) as ModOverload,\n codegenImpl: (_ctx, [lhs, rhs]) => stitch`(${lhs} % ${rhs})`,\n});\n\nfunction cpuNeg(value: number): number;\nfunction cpuNeg<T extends NumVec>(value: T): T;\nfunction cpuNeg(value: NumVec | number): NumVec | number {\n if (typeof value === 'number') {\n return -value;\n }\n return VectorOps.neg[value.kind](value);\n}\n\nexport const neg = dualImpl({\n name: 'neg',\n signature: (arg) => ({\n argTypes: [arg],\n returnType: arg,\n }),\n normalImpl: cpuNeg,\n codegenImpl: (_ctx, [arg]) => stitch`-(${arg})`,\n});\n"],"mappings":"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;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACD,CAAC;AAEF,MAAM,WAAW,IAAI,IAAI;CAEvB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CAEA;CACA;CACA;CAEA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACD,CAAC;AAgCF,SAAS,eAAe,QAA4B;AAClD,KAAI,OAEF,QAAO,OACJ,WAAW,OAAO,IAAI,CACtB,WAAW,YAAY,GAAG;AAE/B,QAAO;;;;;;;;;;;;AAaT,SAAS,kBAAkB,OAAwB;AACjD,KAAI,UAAU,OAAO,MAAM,WAAW,KAAK,IAAI,KAAK,KAAK,MAAM,CAC7D,OAAM,IAAI,MACR,uBAAuB,MAAM,qEAC9B;CAEH,MAAM,SAAS,MAAM,MAAM,IAAI,CAAC;AAChC,QAAO,CAAC,aAAa,IAAI,OAAO,IAAI,CAAC,SAAS,IAAI,OAAO;;;;;AAM3D,SAAgB,YAAY,OAAwB;AAClD,KAAI,UAAU,OAAO,MAAM,WAAW,KAAK,IAAI,KAAK,KAAK,MAAM,CAC7D,OAAM,IAAI,MACR,uBAAuB,MAAM,qEAC9B;CAEH,MAAM,SAAS,MAAM,MAAM,IAAI,CAAC;AAChC,QAAO,CAAC,aAAa,IAAI,OAAO;;AAalC,IAAe,mBAAf,MAAwD;CAGtD,CAASC;CACT,CAASC;CAET,cAAc;AACZ,QAAKD,YAAa,IAAI,IAAY,CAChC,GAAG,cACH,GAAG,SACJ,CAAC;AACF,QAAKC,aAAc,EAAE;;CAGvB,KAAIC,sBAAgD;AAC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"}