gofront 1.5.1 → 1.6.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.
Files changed (91) hide show
  1. package/README.md +174 -466
  2. package/package.json +16 -20
  3. package/src/backend/js/expressions.js +288 -128
  4. package/src/backend/js/index.js +138 -56
  5. package/src/backend/js/runtime.js +1055 -53
  6. package/src/backend/js/source-map.js +32 -0
  7. package/src/backend/js/statements.js +151 -83
  8. package/src/backend/js/stdlib/base64.js +12 -0
  9. package/src/backend/js/stdlib/binary.js +102 -0
  10. package/src/backend/js/stdlib/bits.js +15 -1
  11. package/src/backend/js/stdlib/builder.js +28 -9
  12. package/src/backend/js/stdlib/bytes.js +75 -18
  13. package/src/backend/js/stdlib/errors.js +22 -3
  14. package/src/backend/js/stdlib/fmt.js +95 -20
  15. package/src/backend/js/stdlib/hex.js +17 -0
  16. package/src/backend/js/stdlib/html.js +1 -1
  17. package/src/backend/js/stdlib/index.js +19 -0
  18. package/src/backend/js/stdlib/io.js +105 -3
  19. package/src/backend/js/stdlib/maps.js +1 -1
  20. package/src/backend/js/stdlib/math.js +13 -1
  21. package/src/backend/js/stdlib/path.js +20 -6
  22. package/src/backend/js/stdlib/rand.js +10 -5
  23. package/src/backend/js/stdlib/sha256.js +12 -0
  24. package/src/backend/js/stdlib/shared.js +17 -0
  25. package/src/backend/js/stdlib/slices.js +53 -27
  26. package/src/backend/js/stdlib/sort.js +1 -1
  27. package/src/backend/js/stdlib/strconv.js +52 -11
  28. package/src/backend/js/stdlib/strings.js +152 -16
  29. package/src/backend/js/stdlib/sync.js +13 -0
  30. package/src/backend/js/stdlib/testing.js +2 -2
  31. package/src/backend/js/stdlib/time.js +93 -22
  32. package/src/backend/js/stdlib/unicode.js +2 -2
  33. package/src/backend/js/templ.js +1 -1
  34. package/src/backend/wasm/boundary.js +1677 -58
  35. package/src/backend/wasm/const-fold.js +205 -0
  36. package/src/backend/wasm/emit-builtins.js +1230 -0
  37. package/src/backend/wasm/emit-exprs.js +2096 -0
  38. package/src/backend/wasm/emit-maps.js +1999 -0
  39. package/src/backend/wasm/emit-shared.js +519 -0
  40. package/src/backend/wasm/emit-stdlib.js +13 -0
  41. package/src/backend/wasm/emit-stmts.js +2466 -0
  42. package/src/backend/wasm/emit.js +656 -5031
  43. package/src/backend/wasm/encode.js +259 -85
  44. package/src/backend/wasm/glue.js +19 -5
  45. package/src/backend/wasm/index.js +2432 -86
  46. package/src/backend/wasm/monomorph.js +711 -0
  47. package/src/backend/wasm/optimize.js +236 -0
  48. package/src/backend/wasm/stdlib/bytes.js +5039 -0
  49. package/src/backend/wasm/stdlib/core.js +8903 -0
  50. package/src/backend/wasm/stdlib/index.js +40 -0
  51. package/src/backend/wasm/stdlib/io.js +2161 -0
  52. package/src/backend/wasm/stdlib/packages.js +2400 -0
  53. package/src/backend/wasm/stdlib/pure.js +720 -0
  54. package/src/backend/wasm/stdlib/time.js +1200 -0
  55. package/src/backend/wasm/types.js +312 -36
  56. package/src/backend/wasm/wat.js +49 -2
  57. package/src/cli-core.js +276 -73
  58. package/src/compiler.js +162 -25
  59. package/src/dts-parser.js +79 -126
  60. package/src/index.js +88 -121
  61. package/src/lexer.js +80 -29
  62. package/src/lower/boxing.js +4 -6
  63. package/src/lower/captures.js +12 -23
  64. package/src/lower/escape.js +4 -9
  65. package/src/lower/functions.js +277 -5
  66. package/src/lower/globals.js +7 -15
  67. package/src/lower/index.js +5 -2
  68. package/src/lower/ownership.js +35 -19
  69. package/src/lower/range.js +2 -5
  70. package/src/lower/walk.js +25 -0
  71. package/src/minifier.js +20 -68
  72. package/src/parser/declarations.js +3 -6
  73. package/src/parser/expressions.js +3 -8
  74. package/src/parser/index.js +18 -3
  75. package/src/parser/statements.js +25 -38
  76. package/src/parser/types.js +1 -2
  77. package/src/resolver.js +3 -27
  78. package/src/templ-lexer.js +29 -63
  79. package/src/templ-parser.js +22 -45
  80. package/src/test-runner.js +20 -0
  81. package/src/typechecker/assignability.js +123 -14
  82. package/src/typechecker/expressions.js +244 -4
  83. package/src/typechecker/index.js +27 -1
  84. package/src/typechecker/resolve.js +71 -12
  85. package/src/typechecker/statements.js +0 -7
  86. package/src/typechecker/stdlib/core.js +292 -103
  87. package/src/typechecker/stdlib/extended.js +471 -4
  88. package/src/typechecker/stdlib/shared.js +53 -0
  89. package/src/typechecker/stdlib.js +2 -0
  90. package/src/typechecker/types.js +545 -8
  91. package/src/vendor.js +2 -2
@@ -4,81 +4,91 @@
4
4
  import {
5
5
  ANY,
6
6
  BOOL,
7
+ BROWSER_GLOBALS,
7
8
  ERROR,
9
+ FLOAT32,
8
10
  FLOAT64,
9
11
  INT,
12
+ INT8,
13
+ INT16,
14
+ INT32,
15
+ INT64,
10
16
  STRING,
17
+ UINT,
11
18
  UINT8,
19
+ UINT16,
12
20
  UINT32,
13
21
  UINT64,
14
22
  VOID,
15
23
  } from "../types.js";
16
24
 
17
- const TIME_T = { kind: "named", name: "time.Time", underlying: ANY };
25
+ const DURATION_T = {
26
+ kind: "named",
27
+ name: "time.Duration",
28
+ underlying: INT64,
29
+ methods: new Map([
30
+ ["Nanoseconds", { kind: "func", params: [], returns: [INT64] }],
31
+ ["Microseconds", { kind: "func", params: [], returns: [INT64] }],
32
+ ["Milliseconds", { kind: "func", params: [], returns: [INT64] }],
33
+ ["Seconds", { kind: "func", params: [], returns: [FLOAT64] }],
34
+ ["Minutes", { kind: "func", params: [], returns: [FLOAT64] }],
35
+ ["Hours", { kind: "func", params: [], returns: [FLOAT64] }],
36
+ ["String", { kind: "func", params: [], returns: [STRING] }],
37
+ ]),
38
+ };
39
+ const TIME_T = {
40
+ kind: "named",
41
+ name: "time.Time",
42
+ underlying: {
43
+ kind: "struct",
44
+ fields: new Map(),
45
+ methods: new Map(),
46
+ },
47
+ };
48
+ TIME_T.underlying.fields.set("_unixNano", INT64);
49
+ TIME_T.underlying.fields.set("_offset", INT32);
50
+ TIME_T.underlying.methods = new Map([
51
+ ["Format", { kind: "func", params: [STRING], returns: [STRING] }],
52
+ ["String", { kind: "func", params: [], returns: [STRING] }],
53
+ ["Year", { kind: "func", params: [], returns: [INT] }],
54
+ ["Month", { kind: "func", params: [], returns: [INT] }],
55
+ ["Day", { kind: "func", params: [], returns: [INT] }],
56
+ ["Hour", { kind: "func", params: [], returns: [INT] }],
57
+ ["Minute", { kind: "func", params: [], returns: [INT] }],
58
+ ["Second", { kind: "func", params: [], returns: [INT] }],
59
+ ["Weekday", { kind: "func", params: [], returns: [INT] }],
60
+ ["Unix", { kind: "func", params: [], returns: [INT64] }],
61
+ ["UnixMilli", { kind: "func", params: [], returns: [INT64] }],
62
+ ["UnixNano", { kind: "func", params: [], returns: [INT64] }],
63
+ ["Nanosecond", { kind: "func", params: [], returns: [INT] }],
64
+ ["IsZero", { kind: "func", params: [], returns: [BOOL] }],
65
+ ["UTC", { kind: "func", params: [], returns: [TIME_T] }],
66
+ ["Local", { kind: "func", params: [], returns: [TIME_T] }],
67
+ ["Add", { kind: "func", params: [DURATION_T], returns: [TIME_T] }],
68
+ ["Sub", { kind: "func", params: [TIME_T], returns: [DURATION_T] }],
69
+ ["Before", { kind: "func", params: [TIME_T], returns: [BOOL] }],
70
+ ["After", { kind: "func", params: [TIME_T], returns: [BOOL] }],
71
+ ["Equal", { kind: "func", params: [TIME_T], returns: [BOOL] }],
72
+ ["AddDate", { kind: "func", params: [INT, INT, INT], returns: [TIME_T] }],
73
+ ["Truncate", { kind: "func", params: [DURATION_T], returns: [TIME_T] }],
74
+ ["Round", { kind: "func", params: [DURATION_T], returns: [TIME_T] }],
75
+ ["Date", { kind: "func", params: [], returns: [INT, INT, INT] }],
76
+ ["Clock", { kind: "func", params: [], returns: [INT, INT, INT] }],
77
+ ["YearDay", { kind: "func", params: [], returns: [INT] }],
78
+ ["ISOWeek", { kind: "func", params: [], returns: [INT, INT] }],
79
+ ["Compare", { kind: "func", params: [TIME_T], returns: [INT] }],
80
+ ["In", { kind: "func", params: [ANY], returns: [TIME_T] }],
81
+ ["Location", { kind: "func", params: [], returns: [ANY] }],
82
+ ["Zone", { kind: "func", params: [], returns: [STRING, INT] }],
83
+ ]);
84
+ TIME_T.methods = TIME_T.underlying.methods;
85
+ const REPLACER_T = {
86
+ kind: "pointer",
87
+ base: { kind: "named", name: "strings.Replacer" },
88
+ };
18
89
 
19
90
  export function setupCoreGlobals(globals, types) {
20
- const browserGlobals = [
21
- "console",
22
- "document",
23
- "window",
24
- "navigator",
25
- "location",
26
- "history",
27
- "screen",
28
- "performance",
29
- "crypto",
30
- "indexedDB",
31
- "fetch",
32
- "setTimeout",
33
- "setInterval",
34
- "clearTimeout",
35
- "clearInterval",
36
- "requestAnimationFrame",
37
- "cancelAnimationFrame",
38
- "Math",
39
- "JSON",
40
- "Date",
41
- "RegExp",
42
- "Promise",
43
- "Error",
44
- "Symbol",
45
- "String",
46
- "Number",
47
- "Boolean",
48
- "Array",
49
- "Object",
50
- "parseInt",
51
- "parseFloat",
52
- "isNaN",
53
- "isFinite",
54
- "encodeURIComponent",
55
- "decodeURIComponent",
56
- "atob",
57
- "btoa",
58
- "alert",
59
- "confirm",
60
- "prompt",
61
- "localStorage",
62
- "sessionStorage",
63
- "WebSocket",
64
- "Worker",
65
- "HTMLElement",
66
- "Element",
67
- "Event",
68
- "CustomEvent",
69
- "URL",
70
- "URLSearchParams",
71
- "FormData",
72
- "Headers",
73
- "Request",
74
- "Response",
75
- "Blob",
76
- "File",
77
- "FileReader",
78
- "TextEncoder",
79
- "TextDecoder",
80
- ];
81
- for (const g of browserGlobals) globals.define(g, ANY);
91
+ for (const g of BROWSER_GLOBALS) globals.define(g, ANY);
82
92
 
83
93
  const fmtVariadic = (ret) => ({
84
94
  kind: "func",
@@ -86,6 +96,12 @@ export function setupCoreGlobals(globals, types) {
86
96
  returns: [ret],
87
97
  variadic: true,
88
98
  });
99
+ const fmtPrintVariadic = (ret) => ({
100
+ kind: "func",
101
+ params: [ANY],
102
+ returns: [ret],
103
+ variadic: true,
104
+ });
89
105
  globals.define("fmt", {
90
106
  kind: "namespace",
91
107
  name: "fmt",
@@ -93,23 +109,23 @@ export function setupCoreGlobals(globals, types) {
93
109
  Sprintf: fmtVariadic(STRING),
94
110
  Errorf: fmtVariadic(ERROR),
95
111
  Printf: fmtVariadic(VOID),
96
- Println: fmtVariadic(VOID),
97
- Print: fmtVariadic(VOID),
112
+ Println: fmtPrintVariadic(VOID),
113
+ Print: fmtPrintVariadic(VOID),
98
114
  Fprintf: {
99
115
  kind: "func",
100
- params: [ANY, STRING],
116
+ params: [ANY, STRING, ANY],
101
117
  returns: [INT, ERROR],
102
118
  variadic: true,
103
119
  },
104
120
  Fprintln: {
105
121
  kind: "func",
106
- params: [ANY],
122
+ params: [ANY, ANY],
107
123
  returns: [INT, ERROR],
108
124
  variadic: true,
109
125
  },
110
126
  Fprint: {
111
127
  kind: "func",
112
- params: [ANY],
128
+ params: [ANY, ANY],
113
129
  returns: [INT, ERROR],
114
130
  variadic: true,
115
131
  },
@@ -178,6 +194,7 @@ export function setupCoreGlobals(globals, types) {
178
194
  },
179
195
  EqualFold: strFn2(STRING, BOOL),
180
196
  Fields: strFn1({ kind: "slice", elem: STRING }),
197
+ FieldsFunc: strFn2(ANY, { kind: "slice", elem: STRING }),
181
198
  Cut: {
182
199
  kind: "func",
183
200
  params: [STRING, STRING],
@@ -218,10 +235,11 @@ export function setupCoreGlobals(globals, types) {
218
235
  NewReplacer: {
219
236
  kind: "func",
220
237
  params: [STRING],
221
- returns: [ANY],
238
+ returns: [REPLACER_T],
222
239
  variadic: true,
223
240
  },
224
241
  NewReader: { kind: "func", params: [STRING], returns: [ANY] },
242
+ Builder: ANY,
225
243
  },
226
244
  });
227
245
 
@@ -253,6 +271,7 @@ export function setupCoreGlobals(globals, types) {
253
271
  },
254
272
  ToUpper: byFn1(BYTE_SLICE),
255
273
  ToLower: byFn1(BYTE_SLICE),
274
+ ToTitle: byFn1(BYTE_SLICE),
256
275
  TrimSpace: byFn1(BYTE_SLICE),
257
276
  Trim: byFn2(STRING, BYTE_SLICE),
258
277
  Equal: byFn2(BYTE_SLICE, BOOL),
@@ -280,6 +299,8 @@ export function setupCoreGlobals(globals, types) {
280
299
  LastIndex: byFn2(BYTE_SLICE, INT),
281
300
  LastIndexByte: byFn2(INT, INT),
282
301
  Fields: byFn1({ kind: "slice", elem: BYTE_SLICE }),
302
+ FieldsFunc: byFn2(ANY, { kind: "slice", elem: BYTE_SLICE }),
303
+ Clone: byFn1(BYTE_SLICE),
283
304
  Cut: {
284
305
  kind: "func",
285
306
  params: [BYTE_SLICE, BYTE_SLICE],
@@ -294,6 +315,7 @@ export function setupCoreGlobals(globals, types) {
294
315
  returns: [{ kind: "slice", elem: BYTE_SLICE }],
295
316
  },
296
317
  NewReader: { kind: "func", params: [BYTE_SLICE], returns: [ANY] },
318
+ Buffer: ANY,
297
319
  },
298
320
  });
299
321
 
@@ -309,7 +331,8 @@ export function setupCoreGlobals(globals, types) {
309
331
  returns: [STRING],
310
332
  },
311
333
  FormatBool: { kind: "func", params: [BOOL], returns: [STRING] },
312
- FormatInt: { kind: "func", params: [INT, INT], returns: [STRING] },
334
+ FormatInt: { kind: "func", params: [INT64, INT], returns: [STRING] },
335
+ FormatUint: { kind: "func", params: [UINT64, INT], returns: [STRING] },
313
336
  ParseFloat: {
314
337
  kind: "func",
315
338
  params: [STRING, INT],
@@ -320,12 +343,22 @@ export function setupCoreGlobals(globals, types) {
320
343
  params: [STRING, INT, INT],
321
344
  returns: [INT, ERROR],
322
345
  },
346
+ ParseUint: {
347
+ kind: "func",
348
+ params: [STRING, INT, INT],
349
+ returns: [UINT64, ERROR],
350
+ },
323
351
  ParseBool: { kind: "func", params: [STRING], returns: [BOOL, ERROR] },
324
352
  Quote: { kind: "func", params: [STRING], returns: [STRING] },
325
353
  Unquote: { kind: "func", params: [STRING], returns: [STRING, ERROR] },
326
354
  AppendInt: {
327
355
  kind: "func",
328
- params: [BYTE_SLICE, INT, INT],
356
+ params: [BYTE_SLICE, INT64, INT],
357
+ returns: [BYTE_SLICE],
358
+ },
359
+ AppendUint: {
360
+ kind: "func",
361
+ params: [BYTE_SLICE, UINT64, INT],
329
362
  returns: [BYTE_SLICE],
330
363
  },
331
364
  AppendFloat: {
@@ -333,6 +366,13 @@ export function setupCoreGlobals(globals, types) {
333
366
  params: [BYTE_SLICE, FLOAT64, INT, INT, INT],
334
367
  returns: [BYTE_SLICE],
335
368
  },
369
+ AppendBool: {
370
+ kind: "func",
371
+ params: [BYTE_SLICE, BOOL],
372
+ returns: [BYTE_SLICE],
373
+ },
374
+ ErrSyntax: ERROR,
375
+ ErrRange: ERROR,
336
376
  },
337
377
  });
338
378
 
@@ -421,12 +461,43 @@ export function setupCoreGlobals(globals, types) {
421
461
  params: [FLOAT64, FLOAT64],
422
462
  returns: [FLOAT64],
423
463
  },
464
+ Float64bits: { kind: "func", params: [FLOAT64], returns: [UINT64] },
465
+ Float64frombits: { kind: "func", params: [UINT64], returns: [FLOAT64] },
466
+ Float32bits: { kind: "func", params: [FLOAT32], returns: [UINT32] },
467
+ Float32frombits: { kind: "func", params: [UINT32], returns: [FLOAT32] },
468
+ Sinh: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
469
+ Cosh: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
470
+ Tanh: { kind: "func", params: [FLOAT64], returns: [FLOAT64] },
424
471
  Pi: FLOAT64,
425
472
  E: FLOAT64,
473
+ Phi: FLOAT64,
474
+ Sqrt2: FLOAT64,
475
+ SqrtE: FLOAT64,
476
+ SqrtPi: FLOAT64,
477
+ SqrtPhi: FLOAT64,
478
+ Ln2: FLOAT64,
479
+ Log2E: FLOAT64,
480
+ Ln10: FLOAT64,
481
+ Log10E: FLOAT64,
482
+ MaxFloat32: FLOAT32,
483
+ SmallestNonzeroFloat32: FLOAT32,
426
484
  MaxFloat64: FLOAT64,
427
485
  SmallestNonzeroFloat64: FLOAT64,
428
486
  MaxInt: INT,
429
487
  MinInt: INT,
488
+ MaxInt8: INT8,
489
+ MinInt8: INT8,
490
+ MaxInt16: INT16,
491
+ MinInt16: INT16,
492
+ MaxInt32: INT32,
493
+ MinInt32: INT32,
494
+ MaxInt64: INT64,
495
+ MinInt64: INT64,
496
+ MaxUint8: UINT8,
497
+ MaxUint16: UINT16,
498
+ MaxUint32: UINT32,
499
+ MaxUint: UINT,
500
+ MaxUint64: UINT64,
430
501
  },
431
502
  });
432
503
 
@@ -442,6 +513,13 @@ export function setupCoreGlobals(globals, types) {
442
513
  TrailingZeros64: { kind: "func", params: [UINT64], returns: [INT] },
443
514
  OnesCount64: { kind: "func", params: [UINT64], returns: [INT] },
444
515
  RotateLeft64: { kind: "func", params: [UINT64, INT], returns: [UINT64] },
516
+ ReverseBytes16: { kind: "func", params: [UINT16], returns: [UINT16] },
517
+ ReverseBytes32: { kind: "func", params: [UINT32], returns: [UINT32] },
518
+ ReverseBytes64: { kind: "func", params: [UINT64], returns: [UINT64] },
519
+ Len32: { kind: "func", params: [UINT32], returns: [INT] },
520
+ Len64: { kind: "func", params: [UINT64], returns: [INT] },
521
+ Reverse32: { kind: "func", params: [UINT32], returns: [UINT32] },
522
+ Reverse64: { kind: "func", params: [UINT64], returns: [UINT64] },
445
523
  },
446
524
  });
447
525
 
@@ -452,6 +530,13 @@ export function setupCoreGlobals(globals, types) {
452
530
  New: { kind: "func", params: [STRING], returns: [ERROR] },
453
531
  Is: { kind: "func", params: [ERROR, ERROR], returns: [BOOL] },
454
532
  Unwrap: { kind: "func", params: [ERROR], returns: [ERROR] },
533
+ As: { kind: "func", params: [ERROR, ANY], returns: [BOOL] },
534
+ Join: {
535
+ kind: "func",
536
+ params: [ERROR],
537
+ returns: [ERROR],
538
+ variadic: true,
539
+ },
455
540
  },
456
541
  });
457
542
 
@@ -460,23 +545,29 @@ export function setupCoreGlobals(globals, types) {
460
545
  name: "time",
461
546
  members: {
462
547
  Now: { kind: "func", params: [], returns: [TIME_T] },
463
- Since: { kind: "func", params: [TIME_T], returns: [INT] },
548
+ Since: { kind: "func", params: [TIME_T], returns: [DURATION_T] },
464
549
  Sleep: { kind: "func", params: [ANY], returns: [VOID], async: true },
465
550
  Parse: {
466
551
  kind: "func",
467
552
  params: [STRING, STRING],
468
553
  returns: [TIME_T, ERROR],
469
554
  },
470
- Unix: { kind: "func", params: [INT, INT], returns: [TIME_T] },
555
+ Unix: { kind: "func", params: [INT64, INT64], returns: [TIME_T] },
556
+ UnixMicro: { kind: "func", params: [INT64], returns: [TIME_T] },
557
+ UnixMilli: { kind: "func", params: [INT64], returns: [TIME_T] },
471
558
  Date: {
472
559
  kind: "func",
473
560
  params: [INT, INT, INT, INT, INT, INT, INT, ANY],
474
561
  returns: [TIME_T],
475
562
  },
476
- Millisecond: INT,
477
- Second: INT,
478
- Minute: INT,
479
- Hour: INT,
563
+ Duration: DURATION_T,
564
+ Nanosecond: DURATION_T,
565
+ Microsecond: DURATION_T,
566
+ Millisecond: DURATION_T,
567
+ Second: DURATION_T,
568
+ Minute: DURATION_T,
569
+ Hour: DURATION_T,
570
+ Time: TIME_T,
480
571
  RFC3339: STRING,
481
572
  RFC3339Nano: STRING,
482
573
  DateOnly: STRING,
@@ -505,6 +596,7 @@ export function setupCoreGlobals(globals, types) {
505
596
  Saturday: INT,
506
597
  },
507
598
  });
599
+ types.set("time.Duration", DURATION_T);
508
600
  types.set("time.Time", TIME_T);
509
601
 
510
602
  const runeToStr = { kind: "func", params: [INT], returns: [BOOL] };
@@ -540,12 +632,28 @@ export function setupCoreGlobals(globals, types) {
540
632
  },
541
633
  });
542
634
 
635
+ // Slice helpers that return a slice of the same type as their first argument.
636
+ const sameSlice = (params, extra = {}) => ({
637
+ kind: "func",
638
+ params,
639
+ returns: [ANY],
640
+ _derivedReturn: "arg0",
641
+ ...extra,
642
+ });
543
643
  globals.define("slices", {
544
644
  kind: "namespace",
545
645
  name: "slices",
546
646
  members: {
547
647
  Contains: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
648
+ ContainsFunc: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
548
649
  Index: { kind: "func", params: [ANY, ANY], returns: [INT] },
650
+ IndexFunc: { kind: "func", params: [ANY, ANY], returns: [INT] },
651
+ BinarySearch: { kind: "func", params: [ANY, ANY], returns: [INT, BOOL] },
652
+ BinarySearchFunc: {
653
+ kind: "func",
654
+ params: [ANY, ANY, ANY],
655
+ returns: [INT, BOOL],
656
+ },
549
657
  Equal: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
550
658
  Compare: { kind: "func", params: [ANY, ANY], returns: [INT] },
551
659
  Sort: { kind: "func", params: [ANY], returns: [VOID] },
@@ -554,30 +662,40 @@ export function setupCoreGlobals(globals, types) {
554
662
  IsSorted: { kind: "func", params: [ANY], returns: [BOOL] },
555
663
  IsSortedFunc: { kind: "func", params: [ANY, ANY], returns: [BOOL] },
556
664
  Reverse: { kind: "func", params: [ANY], returns: [VOID] },
557
- Max: { kind: "func", params: [ANY], returns: [ANY] },
558
- Min: { kind: "func", params: [ANY], returns: [ANY] },
559
- MaxFunc: { kind: "func", params: [ANY, ANY], returns: [ANY] },
560
- MinFunc: { kind: "func", params: [ANY, ANY], returns: [ANY] },
561
- Clone: { kind: "func", params: [ANY], returns: [ANY] },
562
- Compact: { kind: "func", params: [ANY], returns: [ANY] },
563
- CompactFunc: { kind: "func", params: [ANY, ANY], returns: [ANY] },
564
- Concat: { kind: "func", params: [ANY], returns: [ANY], variadic: true },
565
- Delete: { kind: "func", params: [ANY, INT, INT], returns: [ANY] },
566
- DeleteFunc: { kind: "func", params: [ANY, ANY], returns: [ANY] },
567
- Insert: {
568
- kind: "func",
569
- params: [ANY, INT, ANY],
665
+ Max: {
666
+ kind: "func",
667
+ params: [ANY],
570
668
  returns: [ANY],
571
- variadic: true,
669
+ _derivedReturn: "elemOfArg0",
572
670
  },
573
- Replace: {
671
+ Min: {
672
+ kind: "func",
673
+ params: [ANY],
674
+ returns: [ANY],
675
+ _derivedReturn: "elemOfArg0",
676
+ },
677
+ MaxFunc: {
574
678
  kind: "func",
575
- params: [ANY, INT, INT, ANY],
679
+ params: [ANY, ANY],
576
680
  returns: [ANY],
577
- variadic: true,
681
+ _derivedReturn: "elemOfArg0",
578
682
  },
579
- Grow: { kind: "func", params: [ANY, INT], returns: [ANY] },
580
- Clip: { kind: "func", params: [ANY], returns: [ANY] },
683
+ MinFunc: {
684
+ kind: "func",
685
+ params: [ANY, ANY],
686
+ returns: [ANY],
687
+ _derivedReturn: "elemOfArg0",
688
+ },
689
+ Clone: sameSlice([ANY]),
690
+ Compact: sameSlice([ANY]),
691
+ CompactFunc: sameSlice([ANY, ANY]),
692
+ Concat: sameSlice([ANY], { variadic: true }),
693
+ Delete: sameSlice([ANY, INT, INT]),
694
+ DeleteFunc: sameSlice([ANY, ANY]),
695
+ Insert: sameSlice([ANY, INT, ANY], { variadic: true }),
696
+ Replace: sameSlice([ANY, INT, INT, ANY], { variadic: true }),
697
+ Grow: sameSlice([ANY, INT]),
698
+ Clip: sameSlice([ANY]),
581
699
  },
582
700
  });
583
701
 
@@ -591,22 +709,93 @@ export function setupCoreGlobals(globals, types) {
591
709
  });
592
710
 
593
711
  const BYTE_SLICE_IO = { kind: "slice", elem: UINT8 };
712
+ const IO_WRITER = {
713
+ kind: "interface",
714
+ name: "io.Writer",
715
+ methods: new Map([
716
+ [
717
+ "Write",
718
+ { kind: "func", params: [BYTE_SLICE_IO], returns: [INT, ERROR] },
719
+ ],
720
+ ]),
721
+ };
722
+ const IO_READER = {
723
+ kind: "interface",
724
+ name: "io.Reader",
725
+ methods: new Map([
726
+ [
727
+ "Read",
728
+ { kind: "func", params: [BYTE_SLICE_IO], returns: [INT, ERROR] },
729
+ ],
730
+ ]),
731
+ };
732
+ const IO_CLOSER = {
733
+ kind: "interface",
734
+ name: "io.Closer",
735
+ methods: new Map([
736
+ ["Close", { kind: "func", params: [], returns: [ERROR] }],
737
+ ]),
738
+ };
739
+ const IO_READWRITER = {
740
+ kind: "interface",
741
+ name: "io.ReadWriter",
742
+ methods: new Map([
743
+ [
744
+ "Read",
745
+ { kind: "func", params: [BYTE_SLICE_IO], returns: [INT, ERROR] },
746
+ ],
747
+ [
748
+ "Write",
749
+ { kind: "func", params: [BYTE_SLICE_IO], returns: [INT, ERROR] },
750
+ ],
751
+ ]),
752
+ };
594
753
  globals.define("io", {
595
754
  kind: "namespace",
596
755
  name: "io",
597
756
  members: {
598
- Writer: ANY,
599
- Reader: ANY,
757
+ Writer: IO_WRITER,
758
+ Reader: IO_READER,
759
+ Closer: IO_CLOSER,
760
+ ReadWriter: IO_READWRITER,
600
761
  EOF: ERROR,
762
+ ErrUnexpectedEOF: ERROR,
763
+ ErrShortWrite: ERROR,
601
764
  WriteString: {
602
765
  kind: "func",
603
- params: [ANY, STRING],
766
+ params: [IO_WRITER, STRING],
767
+ returns: [INT, ERROR],
768
+ },
769
+ ReadFull: {
770
+ kind: "func",
771
+ params: [IO_READER, BYTE_SLICE_IO],
604
772
  returns: [INT, ERROR],
605
773
  },
606
- ReadAll: { kind: "func", params: [ANY], returns: [BYTE_SLICE_IO, ERROR] },
607
- Discard: ANY,
774
+ ReadAll: {
775
+ kind: "func",
776
+ params: [IO_READER],
777
+ returns: [BYTE_SLICE_IO, ERROR],
778
+ },
779
+ LimitReader: {
780
+ kind: "func",
781
+ params: [IO_READER, INT64],
782
+ returns: [IO_READER],
783
+ },
784
+ Copy: {
785
+ kind: "func",
786
+ params: [IO_WRITER, IO_READER],
787
+ returns: [INT64, ERROR],
788
+ },
789
+ CopyN: {
790
+ kind: "func",
791
+ params: [IO_WRITER, IO_READER, INT64],
792
+ returns: [INT64, ERROR],
793
+ },
794
+ Discard: IO_WRITER,
608
795
  },
609
796
  });
610
- types.set("io.Writer", ANY);
611
- types.set("io.Reader", ANY);
797
+ types.set("io.Writer", IO_WRITER);
798
+ types.set("io.Reader", IO_READER);
799
+ types.set("io.Closer", IO_CLOSER);
800
+ types.set("io.ReadWriter", IO_READWRITER);
612
801
  }