gofront 1.2.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,418 @@
1
+ // WebGL, WebGPU, and TypedArray standard library type definitions.
2
+
3
+ import {
4
+ ANY,
5
+ BOOL,
6
+ FLOAT32,
7
+ FLOAT64,
8
+ INT,
9
+ INT8,
10
+ INT16,
11
+ INT32,
12
+ STRING,
13
+ UINT8,
14
+ UINT16,
15
+ UINT32,
16
+ VOID,
17
+ } from "../types.js";
18
+
19
+ const func = (params, returns = [VOID], variadic = false) => ({
20
+ kind: "func",
21
+ params,
22
+ returns,
23
+ variadic,
24
+ });
25
+
26
+ const WEBGL_CONSTANTS_LIST = {
27
+ ARRAY_BUFFER: 0x8892,
28
+ ELEMENT_ARRAY_BUFFER: 0x8893,
29
+ UNIFORM_BUFFER: 0x8a11,
30
+ STATIC_DRAW: 0x88e4,
31
+ DYNAMIC_DRAW: 0x88e8,
32
+ STREAM_DRAW: 0x88e0,
33
+ FLOAT: 0x1406,
34
+ UNSIGNED_SHORT: 0x1403,
35
+ UNSIGNED_BYTE: 0x1401,
36
+ UNSIGNED_INT: 0x1405,
37
+ BYTE: 0x1400,
38
+ SHORT: 0x1402,
39
+ INT: 0x1404,
40
+ HALF_FLOAT: 0x140b,
41
+ TRIANGLES: 0x0004,
42
+ TRIANGLE_STRIP: 0x0005,
43
+ TRIANGLE_FAN: 0x0006,
44
+ LINES: 0x0001,
45
+ LINE_STRIP: 0x0003,
46
+ LINE_LOOP: 0x0002,
47
+ POINTS: 0x0000,
48
+ COLOR_BUFFER_BIT: 0x00004000,
49
+ DEPTH_BUFFER_BIT: 0x00000100,
50
+ STENCIL_BUFFER_BIT: 0x00000400,
51
+ DEPTH_TEST: 0x0b71,
52
+ BLEND: 0x0be2,
53
+ CULL_FACE: 0x0b44,
54
+ VERTEX_SHADER: 0x8b31,
55
+ FRAGMENT_SHADER: 0x8b30,
56
+ COMPILE_STATUS: 0x8b81,
57
+ LINK_STATUS: 0x8b82,
58
+ VALIDATE_STATUS: 0x8b83,
59
+ RGBA: 0x1908,
60
+ RGB: 0x1907,
61
+ ALPHA: 0x1906,
62
+ LUMINANCE: 0x1909,
63
+ RGBA8: 0x8058,
64
+ RGBA32F: 0x8814,
65
+ TEXTURE_2D: 0x0de1,
66
+ TEXTURE_CUBE_MAP: 0x8513,
67
+ TEXTURE0: 0x84c0,
68
+ TEXTURE_MIN_FILTER: 0x2801,
69
+ TEXTURE_MAG_FILTER: 0x2800,
70
+ TEXTURE_WRAP_S: 0x2802,
71
+ TEXTURE_WRAP_T: 0x2803,
72
+ NEAREST: 0x2600,
73
+ LINEAR: 0x2601,
74
+ NEAREST_MIPMAP_NEAREST: 0x2700,
75
+ LINEAR_MIPMAP_NEAREST: 0x2701,
76
+ NEAREST_MIPMAP_LINEAR: 0x2702,
77
+ LINEAR_MIPMAP_LINEAR: 0x2703,
78
+ REPEAT: 0x2901,
79
+ CLAMP_TO_EDGE: 0x812f,
80
+ MIRRORED_REPEAT: 0x8370,
81
+ BACK: 0x0405,
82
+ FRONT: 0x0404,
83
+ FRONT_AND_BACK: 0x0408,
84
+ CW: 0x0900,
85
+ CCW: 0x0901,
86
+ LESS: 0x0201,
87
+ LEQUAL: 0x0203,
88
+ GREATER: 0x0204,
89
+ GEQUAL: 0x0206,
90
+ EQUAL: 0x0202,
91
+ NOTEQUAL: 0x0205,
92
+ ALWAYS: 0x0207,
93
+ NEVER: 0x0200,
94
+ SRC_ALPHA: 0x0302,
95
+ ONE_MINUS_SRC_ALPHA: 0x0303,
96
+ ONE: 1,
97
+ ZERO: 0,
98
+ FRAMEBUFFER: 0x8d40,
99
+ RENDERBUFFER: 0x8d41,
100
+ COLOR_ATTACHMENT0: 0x8ce0,
101
+ DEPTH_ATTACHMENT: 0x8d00,
102
+ FRAMEBUFFER_COMPLETE: 0x8cd5,
103
+ };
104
+
105
+ function buildArrayBufferType() {
106
+ const fields = new Map([["byteLength", INT]]);
107
+ const methods = new Map();
108
+ const named = { kind: "named", name: "ArrayBuffer", underlying: null };
109
+ const iface = {
110
+ kind: "interface",
111
+ name: "ArrayBuffer",
112
+ fields,
113
+ methods,
114
+ };
115
+ named.underlying = iface;
116
+ methods.set("slice", func([INT, INT], [named]));
117
+ return named;
118
+ }
119
+
120
+ function buildDataViewType(arrayBufferType) {
121
+ const fields = new Map([
122
+ ["buffer", arrayBufferType],
123
+ ["byteLength", INT],
124
+ ["byteOffset", INT],
125
+ ]);
126
+ const methods = new Map([
127
+ ["getInt8", func([INT], [INT8])],
128
+ ["getUint8", func([INT], [UINT8])],
129
+ ["getInt16", func([INT, BOOL], [INT16])],
130
+ ["getUint16", func([INT, BOOL], [UINT16])],
131
+ ["getInt32", func([INT, BOOL], [INT32])],
132
+ ["getUint32", func([INT, BOOL], [UINT32])],
133
+ ["getFloat32", func([INT, BOOL], [FLOAT32])],
134
+ ["getFloat64", func([INT, BOOL], [FLOAT64])],
135
+ ["setInt8", func([INT, INT8])],
136
+ ["setUint8", func([INT, UINT8])],
137
+ ["setInt16", func([INT, INT16, BOOL])],
138
+ ["setUint16", func([INT, UINT16, BOOL])],
139
+ ["setInt32", func([INT, INT32, BOOL])],
140
+ ["setUint32", func([INT, UINT32, BOOL])],
141
+ ["setFloat32", func([INT, FLOAT32, BOOL])],
142
+ ["setFloat64", func([INT, FLOAT64, BOOL])],
143
+ ]);
144
+ const named = { kind: "named", name: "DataView", underlying: null };
145
+ named.underlying = { kind: "interface", name: "DataView", fields, methods };
146
+ return named;
147
+ }
148
+
149
+ function buildTypedArrayType(name, elemType, arrayBufferType) {
150
+ const fields = new Map([
151
+ ["buffer", arrayBufferType],
152
+ ["byteLength", INT],
153
+ ["byteOffset", INT],
154
+ ["length", INT],
155
+ ]);
156
+ const methods = new Map();
157
+ const named = { kind: "named", name, underlying: null };
158
+ const iface = {
159
+ kind: "interface",
160
+ name,
161
+ fields,
162
+ methods,
163
+ _elemType: elemType,
164
+ _isTypedArray: true,
165
+ };
166
+ named.underlying = iface;
167
+ methods.set("subarray", func([INT, INT], [named]));
168
+ methods.set("slice", func([INT, INT], [named]));
169
+ methods.set("set", func([ANY, INT], [VOID]));
170
+ return named;
171
+ }
172
+
173
+ function createWebGLMethods() {
174
+ const methods = new Map();
175
+ const add = (name, fn) => {
176
+ methods.set(name, fn);
177
+ const camel = name[0].toLowerCase() + name.slice(1);
178
+ if (camel !== name) methods.set(camel, fn);
179
+ };
180
+
181
+ // Buffer operations
182
+ add("BufferData", func([INT, ANY, INT]));
183
+ add("BufferSubData", func([INT, INT, ANY]));
184
+ add("CreateBuffer", func([], [ANY]));
185
+ add("BindBuffer", func([INT, ANY]));
186
+ add("DeleteBuffer", func([ANY]));
187
+ add("VertexAttribPointer", func([INT, INT, INT, BOOL, INT, INT]));
188
+ add("VertexAttribIPointer", func([INT, INT, INT, INT, INT]));
189
+ add("EnableVertexAttribArray", func([INT]));
190
+ add("DisableVertexAttribArray", func([INT]));
191
+
192
+ // Shaders and programs
193
+ add("CreateShader", func([INT], [ANY]));
194
+ add("ShaderSource", func([ANY, STRING]));
195
+ add("CompileShader", func([ANY]));
196
+ add("GetShaderParameter", func([ANY, INT], [ANY]));
197
+ add("GetShaderInfoLog", func([ANY], [STRING]));
198
+ add("DeleteShader", func([ANY]));
199
+ add("CreateProgram", func([], [ANY]));
200
+ add("AttachShader", func([ANY, ANY]));
201
+ add("DetachShader", func([ANY, ANY]));
202
+ add("LinkProgram", func([ANY]));
203
+ add("GetProgramParameter", func([ANY, INT], [ANY]));
204
+ add("GetProgramInfoLog", func([ANY], [STRING]));
205
+ add("UseProgram", func([ANY]));
206
+ add("DeleteProgram", func([ANY]));
207
+
208
+ // Uniforms and attributes
209
+ add("GetUniformLocation", func([ANY, STRING], [ANY]));
210
+ add("GetAttribLocation", func([ANY, STRING], [INT]));
211
+ add("Uniform1f", func([ANY, FLOAT64]));
212
+ add("Uniform2f", func([ANY, FLOAT64, FLOAT64]));
213
+ add("Uniform3f", func([ANY, FLOAT64, FLOAT64, FLOAT64]));
214
+ add("Uniform4f", func([ANY, FLOAT64, FLOAT64, FLOAT64, FLOAT64]));
215
+ add("Uniform1i", func([ANY, INT]));
216
+ add("Uniform2i", func([ANY, INT, INT]));
217
+ add("Uniform3i", func([ANY, INT, INT, INT]));
218
+ add("Uniform4i", func([ANY, INT, INT, INT, INT]));
219
+ add("Uniform1fv", func([ANY, ANY]));
220
+ add("Uniform2fv", func([ANY, ANY]));
221
+ add("Uniform3fv", func([ANY, ANY]));
222
+ add("Uniform4fv", func([ANY, ANY]));
223
+ add("Uniform1iv", func([ANY, ANY]));
224
+ add("Uniform2iv", func([ANY, ANY]));
225
+ add("Uniform3iv", func([ANY, ANY]));
226
+ add("Uniform4iv", func([ANY, ANY]));
227
+ add("UniformMatrix2fv", func([ANY, BOOL, ANY]));
228
+ add("UniformMatrix3fv", func([ANY, BOOL, ANY]));
229
+ add("UniformMatrix4fv", func([ANY, BOOL, ANY]));
230
+
231
+ // Viewport, clear, draw
232
+ add("Viewport", func([INT, INT, INT, INT]));
233
+ add("ClearColor", func([FLOAT64, FLOAT64, FLOAT64, FLOAT64]));
234
+ add("ClearDepth", func([FLOAT64]));
235
+ add("Clear", func([INT]));
236
+ add("DrawArrays", func([INT, INT, INT]));
237
+ add("DrawElements", func([INT, INT, INT, INT]));
238
+ add("DrawArraysInstanced", func([INT, INT, INT, INT]));
239
+ add("DrawElementsInstanced", func([INT, INT, INT, INT, INT]));
240
+ add("Enable", func([INT]));
241
+ add("Disable", func([INT]));
242
+ add("CullFace", func([INT]));
243
+ add("FrontFace", func([INT]));
244
+ add("DepthFunc", func([INT]));
245
+ add("DepthMask", func([BOOL]));
246
+ add("BlendFunc", func([INT, INT]));
247
+ add("BlendFuncSeparate", func([INT, INT, INT, INT]));
248
+ add("Flush", func([]));
249
+ add("Finish", func([]));
250
+
251
+ // Textures
252
+ add("CreateTexture", func([], [ANY]));
253
+ add("BindTexture", func([INT, ANY]));
254
+ add("DeleteTexture", func([ANY]));
255
+ add("TexParameteri", func([INT, INT, INT]));
256
+ add("TexParameterf", func([INT, INT, FLOAT64]));
257
+ add(
258
+ "TexImage2D",
259
+ func([INT, INT, INT, INT, INT, INT, INT, INT, ANY], [VOID], true),
260
+ );
261
+ add("GenerateMipmap", func([INT]));
262
+ add("ActiveTexture", func([INT]));
263
+
264
+ // WebGL2 VAOs
265
+ add("CreateVertexArray", func([], [ANY]));
266
+ add("BindVertexArray", func([ANY]));
267
+ add("DeleteVertexArray", func([ANY]));
268
+
269
+ // Framebuffers
270
+ add("CreateFramebuffer", func([], [ANY]));
271
+ add("BindFramebuffer", func([INT, ANY]));
272
+ add("DeleteFramebuffer", func([ANY]));
273
+ add("FramebufferTexture2D", func([INT, INT, INT, ANY, INT]));
274
+ add("CheckFramebufferStatus", func([INT], [INT]));
275
+
276
+ return methods;
277
+ }
278
+
279
+ function createWebGPUMethods() {
280
+ const queueMethods = new Map();
281
+ const addQueue = (name, fn) => {
282
+ queueMethods.set(name, fn);
283
+ const camel = name[0].toLowerCase() + name.slice(1);
284
+ if (camel !== name) queueMethods.set(camel, fn);
285
+ };
286
+ addQueue("Submit", func([ANY]));
287
+ addQueue("WriteBuffer", func([ANY, INT, ANY]));
288
+
289
+ const deviceMethods = new Map();
290
+ const addDev = (name, fn) => {
291
+ deviceMethods.set(name, fn);
292
+ const camel = name[0].toLowerCase() + name.slice(1);
293
+ if (camel !== name) deviceMethods.set(camel, fn);
294
+ };
295
+ addDev("CreateBuffer", func([ANY], [ANY]));
296
+ addDev("CreateShaderModule", func([ANY], [ANY]));
297
+ addDev("CreateRenderPipeline", func([ANY], [ANY]));
298
+ addDev("CreateComputePipeline", func([ANY], [ANY]));
299
+ addDev("CreateCommandEncoder", func([ANY], [ANY]));
300
+ addDev("CreateBindGroup", func([ANY], [ANY]));
301
+ addDev("CreateBindGroupLayout", func([ANY], [ANY]));
302
+ addDev("CreatePipelineLayout", func([ANY], [ANY]));
303
+
304
+ const adapterMethods = new Map();
305
+ const addAdapt = (name, fn) => {
306
+ adapterMethods.set(name, fn);
307
+ const camel = name[0].toLowerCase() + name.slice(1);
308
+ if (camel !== name) adapterMethods.set(camel, fn);
309
+ };
310
+ addAdapt("RequestDevice", func([ANY], [ANY]));
311
+
312
+ return { queueMethods, deviceMethods, adapterMethods };
313
+ }
314
+
315
+ export function setupWebGlobals(globals, types) {
316
+ const arrayBuffer = buildArrayBufferType();
317
+ const dataView = buildDataViewType(arrayBuffer);
318
+
319
+ const typedArrays = [
320
+ ["Float32Array", FLOAT32],
321
+ ["Float64Array", FLOAT64],
322
+ ["Int8Array", INT8],
323
+ ["Int16Array", INT16],
324
+ ["Int32Array", INT32],
325
+ ["Uint8Array", UINT8],
326
+ ["Uint16Array", UINT16],
327
+ ["Uint32Array", UINT32],
328
+ ["Uint8ClampedArray", UINT8],
329
+ ].map(([name, elem]) => buildTypedArrayType(name, elem, arrayBuffer));
330
+
331
+ types.set("ArrayBuffer", arrayBuffer);
332
+ types.set("DataView", dataView);
333
+ globals.define("ArrayBuffer", arrayBuffer);
334
+ globals.define("DataView", dataView);
335
+
336
+ for (const ta of typedArrays) {
337
+ types.set(ta.name, ta);
338
+ globals.define(ta.name, ta);
339
+ }
340
+
341
+ // WebGL constants map
342
+ const constFields = new Map();
343
+ for (const [k] of Object.entries(WEBGL_CONSTANTS_LIST)) {
344
+ constFields.set(k, INT);
345
+ }
346
+
347
+ const webglMethods = createWebGLMethods();
348
+ const webglContext = {
349
+ kind: "named",
350
+ name: "WebGLRenderingContext",
351
+ underlying: {
352
+ kind: "interface",
353
+ name: "WebGLRenderingContext",
354
+ fields: constFields,
355
+ methods: webglMethods,
356
+ _isOpen: true,
357
+ },
358
+ };
359
+ const webgl2Context = {
360
+ kind: "named",
361
+ name: "WebGL2RenderingContext",
362
+ underlying: {
363
+ kind: "interface",
364
+ name: "WebGL2RenderingContext",
365
+ fields: constFields,
366
+ methods: webglMethods,
367
+ _isOpen: true,
368
+ },
369
+ };
370
+
371
+ types.set("WebGLRenderingContext", webglContext);
372
+ types.set("WebGL2RenderingContext", webgl2Context);
373
+ globals.define("WebGLRenderingContext", webglContext);
374
+ globals.define("WebGL2RenderingContext", webgl2Context);
375
+
376
+ // WebGPU types
377
+ const { queueMethods, deviceMethods, adapterMethods } = createWebGPUMethods();
378
+ const gpuQueue = {
379
+ kind: "named",
380
+ name: "GPUQueue",
381
+ underlying: {
382
+ kind: "interface",
383
+ name: "GPUQueue",
384
+ fields: new Map(),
385
+ methods: queueMethods,
386
+ _isOpen: true,
387
+ },
388
+ };
389
+ const gpuDevice = {
390
+ kind: "named",
391
+ name: "GPUDevice",
392
+ underlying: {
393
+ kind: "interface",
394
+ name: "GPUDevice",
395
+ fields: new Map([["queue", gpuQueue]]),
396
+ methods: deviceMethods,
397
+ _isOpen: true,
398
+ },
399
+ };
400
+ const gpuAdapter = {
401
+ kind: "named",
402
+ name: "GPUAdapter",
403
+ underlying: {
404
+ kind: "interface",
405
+ name: "GPUAdapter",
406
+ fields: new Map(),
407
+ methods: adapterMethods,
408
+ _isOpen: true,
409
+ },
410
+ };
411
+
412
+ types.set("GPUQueue", gpuQueue);
413
+ types.set("GPUDevice", gpuDevice);
414
+ types.set("GPUAdapter", gpuAdapter);
415
+ globals.define("GPUQueue", gpuQueue);
416
+ globals.define("GPUDevice", gpuDevice);
417
+ globals.define("GPUAdapter", gpuAdapter);
418
+ }
@@ -9,8 +9,10 @@
9
9
 
10
10
  import { setupCoreGlobals } from "./stdlib/core.js";
11
11
  import { setupExtendedGlobals } from "./stdlib/extended.js";
12
+ import { setupWebGlobals } from "./stdlib/web.js";
12
13
 
13
14
  export function setupGlobals(globals, types) {
14
15
  setupCoreGlobals(globals, types);
15
16
  setupExtendedGlobals(globals, types);
17
+ setupWebGlobals(globals, types);
16
18
  }
@@ -44,6 +44,19 @@ export const LOG_OPS = new Set(["&&", "||"]);
44
44
  // ── Built-in types ───────────────────────────────────────────
45
45
 
46
46
  export const INT = { kind: "basic", name: "int" };
47
+ export const INT8 = { kind: "basic", name: "int8" };
48
+ export const INT16 = { kind: "basic", name: "int16" };
49
+ export const INT32 = { kind: "basic", name: "int32" };
50
+ export const INT64 = { kind: "basic", name: "int64" };
51
+ export const UINT = { kind: "basic", name: "uint" };
52
+ export const UINT8 = { kind: "basic", name: "uint8" };
53
+ export const BYTE = UINT8;
54
+ export const UINT16 = { kind: "basic", name: "uint16" };
55
+ export const UINT32 = { kind: "basic", name: "uint32" };
56
+ export const UINT64 = { kind: "basic", name: "uint64" };
57
+ export const UINTPTR = { kind: "basic", name: "uintptr" };
58
+ export const RUNE = INT;
59
+ export const FLOAT32 = { kind: "basic", name: "float32" };
47
60
  export const FLOAT64 = { kind: "basic", name: "float64" };
48
61
  export const STRING = { kind: "basic", name: "string" };
49
62
  export const BOOL = { kind: "basic", name: "bool" };
@@ -73,30 +86,47 @@ export const UNTYPED_COMPLEX = { kind: "untyped", base: "complex128" };
73
86
 
74
87
  export const BASIC_TYPES = {
75
88
  int: INT,
89
+ int8: INT8,
90
+ int16: INT16,
91
+ int32: INT32,
92
+ int64: INT64,
93
+ uint: UINT,
94
+ uint8: UINT8,
95
+ uint16: UINT16,
96
+ uint32: UINT32,
97
+ uint64: UINT64,
98
+ uintptr: UINTPTR,
99
+ byte: UINT8,
100
+ rune: RUNE,
101
+ float32: FLOAT32,
76
102
  float64: FLOAT64,
103
+ complex64: COMPLEX64,
104
+ complex128: COMPLEX128,
77
105
  string: STRING,
78
106
  bool: BOOL,
79
107
  any: ANY,
80
- byte: INT,
81
- rune: INT,
82
- // Sized integer / float aliases — all map to int or float64 at runtime
83
- uint: INT,
84
- int8: INT,
85
- int16: INT,
86
- int32: INT,
87
- int64: INT,
88
- uint8: INT,
89
- uint16: INT,
90
- uint32: INT,
91
- uint64: INT,
92
- uintptr: INT,
93
- float32: FLOAT64,
94
- complex64: COMPLEX64,
95
- complex128: COMPLEX128,
96
108
  };
97
109
 
98
110
  export const COMPARABLE = { kind: "basic", name: "comparable" };
99
111
 
112
+ export const SIZED_INT_NAMES = [
113
+ "int",
114
+ "int8",
115
+ "int16",
116
+ "int32",
117
+ "int64",
118
+ "uint",
119
+ "uint8",
120
+ "uint16",
121
+ "uint32",
122
+ "uint64",
123
+ "uintptr",
124
+ "byte",
125
+ "rune",
126
+ ];
127
+
128
+ export const SIZED_FLOAT_NAMES = ["float32", "float64"];
129
+
100
130
  function makeBasicPredicate(...names) {
101
131
  const set = new Set(names);
102
132
  const pred = (t) => {
@@ -109,10 +139,41 @@ function makeBasicPredicate(...names) {
109
139
  return pred;
110
140
  }
111
141
 
112
- export const isNumeric = makeBasicPredicate("int", "float64");
142
+ export const isNumeric = makeBasicPredicate(
143
+ ...SIZED_INT_NAMES,
144
+ ...SIZED_FLOAT_NAMES,
145
+ );
146
+ export const isInteger = makeBasicPredicate(...SIZED_INT_NAMES);
147
+ export const isFloat = makeBasicPredicate(...SIZED_FLOAT_NAMES);
113
148
  export const isString = makeBasicPredicate("string");
114
149
  export const isBool = makeBasicPredicate("bool");
115
150
 
151
+ // ── TypedArray mappings ──────────────────────────────────────
152
+ export const TYPED_ARRAY_CONSTRUCTORS = {
153
+ float32: "Float32Array",
154
+ float64: "Float64Array",
155
+ uint8: "Uint8Array",
156
+ byte: "Uint8Array",
157
+ int8: "Int8Array",
158
+ uint16: "Uint16Array",
159
+ int16: "Int16Array",
160
+ uint32: "Uint32Array",
161
+ int32: "Int32Array",
162
+ };
163
+
164
+ export function typedArrayConstructorForElem(elemType) {
165
+ if (!elemType) return null;
166
+ const name = elemType.kind === "basic" ? elemType.name : null;
167
+ return name ? (TYPED_ARRAY_CONSTRUCTORS[name] ?? null) : null;
168
+ }
169
+
170
+ export function isTypedArraySlice(type) {
171
+ if (!type) return false;
172
+ const base = type.kind === "named" ? type.underlying : type;
173
+ if (base?.kind !== "slice") return false;
174
+ return typedArrayConstructorForElem(base.elem) !== null;
175
+ }
176
+
116
177
  export function isComplex(t) {
117
178
  if (!t) return false;
118
179
  if (t.kind === "basic" && (t.name === "complex128" || t.name === "complex64"))