toilscript 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/LICENSE +201 -201
  2. package/NOTICE +94 -94
  3. package/README.md +101 -114
  4. package/bin/asc.js +0 -0
  5. package/bin/asinit.js +0 -0
  6. package/dist/asc.generated.d.ts +10022 -0
  7. package/dist/asc.js +24457 -0
  8. package/dist/asc.js.map +7 -0
  9. package/dist/importmap.json +9 -0
  10. package/dist/toilscript.generated.d.ts +11237 -0
  11. package/dist/toilscript.js +337 -0
  12. package/dist/toilscript.js.map +7 -0
  13. package/dist/web.js +22 -0
  14. package/lib/binaryen.d.ts +2 -2
  15. package/lib/binaryen.js +2 -2
  16. package/package.json +115 -114
  17. package/std/README.md +6 -6
  18. package/std/assembly/array.ts +550 -550
  19. package/std/assembly/arraybuffer.ts +77 -77
  20. package/std/assembly/atomics.ts +127 -127
  21. package/std/assembly/bindings/asyncify.ts +16 -16
  22. package/std/assembly/bindings/dom.ts +291 -291
  23. package/std/assembly/bindings/node.ts +6 -6
  24. package/std/assembly/bitflags.ts +53 -53
  25. package/std/assembly/builtins.ts +2650 -2650
  26. package/std/assembly/byteslice.ts +177 -177
  27. package/std/assembly/compat.ts +2 -2
  28. package/std/assembly/console.ts +42 -42
  29. package/std/assembly/crypto.ts +9 -9
  30. package/std/assembly/dataview.ts +181 -181
  31. package/std/assembly/date.ts +375 -375
  32. package/std/assembly/diagnostics.ts +11 -11
  33. package/std/assembly/encoding.ts +151 -151
  34. package/std/assembly/endian.ts +45 -45
  35. package/std/assembly/error.ts +44 -44
  36. package/std/assembly/fixedarray.ts +173 -173
  37. package/std/assembly/fixedmap.ts +326 -326
  38. package/std/assembly/fixedset.ts +275 -275
  39. package/std/assembly/function.ts +42 -42
  40. package/std/assembly/index.d.ts +2891 -2891
  41. package/std/assembly/iterator.ts +35 -35
  42. package/std/assembly/map.ts +269 -269
  43. package/std/assembly/math.ts +3289 -3289
  44. package/std/assembly/memory.ts +123 -123
  45. package/std/assembly/number.ts +388 -388
  46. package/std/assembly/object.ts +36 -36
  47. package/std/assembly/performance.ts +9 -9
  48. package/std/assembly/pointer.ts +80 -80
  49. package/std/assembly/polyfills.ts +27 -27
  50. package/std/assembly/process.ts +50 -50
  51. package/std/assembly/reference.ts +48 -48
  52. package/std/assembly/regexp.ts +12 -12
  53. package/std/assembly/rt/README.md +83 -83
  54. package/std/assembly/rt/common.ts +81 -81
  55. package/std/assembly/rt/index-incremental.ts +2 -2
  56. package/std/assembly/rt/index-memory.ts +1 -1
  57. package/std/assembly/rt/index-minimal.ts +2 -2
  58. package/std/assembly/rt/index-stub.ts +1 -1
  59. package/std/assembly/rt/index.d.ts +37 -37
  60. package/std/assembly/rt/itcms.ts +419 -419
  61. package/std/assembly/rt/memory-runtime.ts +94 -94
  62. package/std/assembly/rt/rtrace.ts +15 -15
  63. package/std/assembly/rt/stub.ts +133 -133
  64. package/std/assembly/rt/tcms.ts +254 -254
  65. package/std/assembly/rt/tlsf.ts +592 -592
  66. package/std/assembly/rt.ts +90 -90
  67. package/std/assembly/set.ts +225 -225
  68. package/std/assembly/shared/feature.ts +68 -68
  69. package/std/assembly/shared/runtime.ts +13 -13
  70. package/std/assembly/shared/target.ts +11 -11
  71. package/std/assembly/shared/tsconfig.json +11 -11
  72. package/std/assembly/shared/typeinfo.ts +72 -72
  73. package/std/assembly/staticarray.ts +423 -423
  74. package/std/assembly/string.ts +850 -850
  75. package/std/assembly/symbol.ts +114 -114
  76. package/std/assembly/table.ts +16 -16
  77. package/std/assembly/tsconfig.json +6 -6
  78. package/std/assembly/typedarray.ts +1954 -1954
  79. package/std/assembly/uri.ts +17 -17
  80. package/std/assembly/util/bytes.ts +107 -107
  81. package/std/assembly/util/casemap.ts +497 -497
  82. package/std/assembly/util/error.ts +58 -58
  83. package/std/assembly/util/hash.ts +117 -117
  84. package/std/assembly/util/math.ts +1922 -1922
  85. package/std/assembly/util/memory.ts +290 -290
  86. package/std/assembly/util/number.ts +873 -873
  87. package/std/assembly/util/sort.ts +313 -313
  88. package/std/assembly/util/string.ts +1202 -1202
  89. package/std/assembly/util/uri.ts +275 -275
  90. package/std/assembly/vector.ts +4 -4
  91. package/std/assembly.json +16 -16
  92. package/std/portable/index.d.ts +461 -461
  93. package/std/portable/index.js +416 -416
  94. package/std/portable.json +11 -11
  95. package/std/types/assembly/index.d.ts +1 -1
  96. package/std/types/assembly/package.json +2 -2
  97. package/std/types/portable/index.d.ts +1 -1
  98. package/std/types/portable/package.json +2 -2
  99. package/tsconfig-base.json +13 -13
  100. package/util/README.md +23 -23
  101. package/util/browser/fs.js +1 -1
  102. package/util/browser/module.js +5 -5
  103. package/util/browser/path.js +520 -520
  104. package/util/browser/process.js +59 -59
  105. package/util/browser/url.js +23 -23
  106. package/util/cpu.d.ts +9 -9
  107. package/util/cpu.js +42 -42
  108. package/util/find.d.ts +6 -6
  109. package/util/find.js +20 -20
  110. package/util/node.d.ts +21 -21
  111. package/util/node.js +34 -34
  112. package/util/options.d.ts +70 -70
  113. package/util/options.js +262 -262
  114. package/util/terminal.d.ts +52 -52
  115. package/util/terminal.js +35 -35
  116. package/util/text.d.ts +26 -26
  117. package/util/text.js +114 -114
  118. package/util/tsconfig.json +9 -9
  119. package/util/web.d.ts +11 -11
  120. package/util/web.js +33 -33
@@ -1,313 +1,313 @@
1
- import { compareImpl } from "./string";
2
-
3
- type Comparator<T> = (a: T, b: T) => i32;
4
-
5
- // @ts-ignore: decorator
6
- @lazy @inline const EMPTY = u32.MAX_VALUE;
7
- // @ts-ignore: decorator
8
- @inline const INSERTION_SORT_THRESHOLD = 48;
9
- // @ts-ignore: decorator
10
- @inline const MIN_RUN_LENGTH = 32;
11
-
12
- // @ts-ignore: decorator
13
- @inline
14
- function log2u(n: u32): u32 {
15
- return 31 - clz(n);
16
- }
17
-
18
- // @ts-ignore: decorator
19
- @inline
20
- export function COMPARATOR<T>(): Comparator<T> {
21
- if (isInteger<T>()) {
22
- if (isSigned<T>() && sizeof<T>() <= 4) {
23
- return (a, b) => i32(a) - i32(b);
24
- } else {
25
- return (a, b) => i32(a > b) - i32(a < b);
26
- }
27
- } else if (isFloat<T>()) {
28
- if (sizeof<T>() == 4) {
29
- return (a, b) => {
30
- let ia = reinterpret<i32>(f32(a));
31
- let ib = reinterpret<i32>(f32(b));
32
- ia ^= ia >> 31 >>> 1;
33
- ib ^= ib >> 31 >>> 1;
34
- return i32(ia > ib) - i32(ia < ib);
35
- };
36
- } else {
37
- return (a, b) => {
38
- let ia = reinterpret<i64>(f64(a));
39
- let ib = reinterpret<i64>(f64(b));
40
- ia ^= ia >> 63 >>> 1;
41
- ib ^= ib >> 63 >>> 1;
42
- return i32(ia > ib) - i32(ia < ib);
43
- };
44
- }
45
- } else if (isString<T>()) {
46
- return (a, b) => {
47
- if (
48
- changetype<usize>(a) == changetype<usize>(b) ||
49
- changetype<usize>(a) == 0 ||
50
- changetype<usize>(b) == 0
51
- ) return 0;
52
- let alen = changetype<string>(a).length;
53
- let blen = changetype<string>(b).length;
54
- if (!(alen | blen)) return 0;
55
- if (!alen) return -1;
56
- if (!blen) return 1;
57
- let res = compareImpl(
58
- changetype<string>(a), 0,
59
- changetype<string>(b), 0,
60
- <usize>min(alen, blen)
61
- );
62
- return res ? res : alen - blen;
63
- };
64
- } else {
65
- return (a, b) => i32(a > b) - i32(a < b);
66
- }
67
- }
68
-
69
- // Power Sort implementation (stable) from paper "Nearly-Optimal Mergesorts"
70
- // https://arxiv.org/pdf/1805.04154.pdf
71
- // This method usually outperform TimSort.
72
- // TODO: refactor c >>> 31 to c < 0 when binaryen will support this opt
73
- export function SORT<T>(
74
- ptr: usize,
75
- len: i32,
76
- comparator: Comparator<T>
77
- ): void {
78
- if (len <= INSERTION_SORT_THRESHOLD) {
79
- if (len <= 1) return;
80
- if (ASC_SHRINK_LEVEL < 1) {
81
- switch (len) {
82
- case 3: {
83
- let a = load<T>(ptr, 0);
84
- let b = load<T>(ptr, 1 << alignof<T>());
85
- let c = comparator(a, b) > 0;
86
- store<T>(ptr, select<T>(b, a, c), 0);
87
- a = select<T>(a, b, c);
88
- b = load<T>(ptr, 2 << alignof<T>());
89
- c = comparator(a, b) > 0;
90
- store<T>(ptr, select<T>(b, a, c), 1 << alignof<T>());
91
- store<T>(ptr, select<T>(a, b, c), 2 << alignof<T>());
92
- }
93
- case 2: {
94
- let a = load<T>(ptr, 0);
95
- let b = load<T>(ptr, 1 << alignof<T>());
96
- let c = comparator(a, b) > 0;
97
- store<T>(ptr, select<T>(b, a, c), 0);
98
- store<T>(ptr, select<T>(a, b, c), 1 << alignof<T>());
99
- return;
100
- }
101
- }
102
- }
103
- insertionSort<T>(ptr, 0, len - 1, 0, comparator);
104
- return;
105
- }
106
-
107
- let lgPlus2 = log2u(len) + 2;
108
- let lgPlus2Size = lgPlus2 << alignof<u32>();
109
- let leftRunStartBuf = __alloc(lgPlus2Size << 1);
110
- let leftRunEndBuf = leftRunStartBuf + lgPlus2Size;
111
-
112
- for (let i: u32 = 0; i < lgPlus2; ++i) {
113
- store<u32>(leftRunStartBuf + (<usize>i << alignof<u32>()), EMPTY);
114
- }
115
-
116
- let buffer = __alloc(len << alignof<T>());
117
-
118
- let hi = len - 1;
119
- let endA = extendRunRight<T>(ptr, 0, hi, comparator);
120
- let lenA = endA + 1;
121
-
122
- if (lenA < MIN_RUN_LENGTH) {
123
- endA = min(hi, MIN_RUN_LENGTH - 1);
124
- insertionSort<T>(ptr, 0, endA, lenA, comparator);
125
- }
126
-
127
- let top: u32 = 0, startA = 0;
128
- while (endA < hi) {
129
- let startB = endA + 1;
130
- let endB = extendRunRight<T>(ptr, startB, hi, comparator);
131
- let lenB = endB - startB + 1;
132
-
133
- if (lenB < MIN_RUN_LENGTH) {
134
- endB = min(hi, startB + MIN_RUN_LENGTH - 1);
135
- insertionSort<T>(ptr, startB, endB, lenB, comparator);
136
- }
137
-
138
- let k = nodePower(0, hi, startA, startB, endB);
139
-
140
- for (let i = top; i > k; --i) {
141
- let start = load<u32>(leftRunStartBuf + (<usize>i << alignof<u32>()));
142
- if (start != EMPTY) {
143
- mergeRuns<T>(
144
- ptr,
145
- start,
146
- load<u32>(leftRunEndBuf + (<usize>i << alignof<u32>())) + 1,
147
- endA,
148
- buffer,
149
- comparator
150
- );
151
- startA = start;
152
- store<u32>(leftRunStartBuf + (<usize>i << alignof<u32>()), EMPTY);
153
- }
154
- }
155
-
156
- store<u32>(leftRunStartBuf + (<usize>k << alignof<u32>()), startA);
157
- store<u32>(leftRunEndBuf + (<usize>k << alignof<u32>()), endA);
158
- startA = startB;
159
- endA = endB;
160
- top = k;
161
- }
162
-
163
- for (let i = top; i != 0; --i) {
164
- let start = load<u32>(leftRunStartBuf + (<usize>i << alignof<u32>()));
165
- if (start != EMPTY) {
166
- mergeRuns<T>(
167
- ptr,
168
- start,
169
- load<u32>(leftRunEndBuf + (<usize>i << alignof<u32>())) + 1,
170
- hi,
171
- buffer,
172
- comparator
173
- );
174
- }
175
- }
176
- // dealloc aux buffers
177
- __free(buffer);
178
- __free(leftRunStartBuf);
179
- }
180
-
181
- function insertionSort<T>(
182
- ptr: usize,
183
- left: i32,
184
- right: i32,
185
- presorted: i32,
186
- comparator: Comparator<T>
187
- ): void {
188
- if (ASC_SHRINK_LEVEL >= 1) {
189
- // slightly improved original insertion sort
190
- for (let i = left + presorted; i <= right; ++i) {
191
- let j = i - 1;
192
- let a = load<T>(ptr + (<usize>i << alignof<T>()));
193
- while (j >= left) {
194
- let b = load<T>(ptr + (<usize>j << alignof<T>()));
195
- if (comparator(a, b) < 0) {
196
- store<T>(ptr + (<usize>j << alignof<T>()), b, 1 << alignof<T>()); --j;
197
- } else break;
198
- }
199
- store<T>(ptr + (<usize>j << alignof<T>()), a, 1 << alignof<T>());
200
- }
201
- } else {
202
- // even-odd two-way insertion sort which allow increase minRunLen
203
- let range = right - left + 1;
204
- let i = left + select(range & 1, presorted - ((range - presorted) & 1), presorted == 0);
205
- for (; i <= right; i += 2) {
206
- let a = load<T>(ptr + (<usize>i << alignof<T>()), 0);
207
- let b = load<T>(ptr + (<usize>i << alignof<T>()), 1 << alignof<T>());
208
- let min = b, max = a;
209
- if (comparator(a, b) <= 0) {
210
- min = a, max = b;
211
- }
212
- let j = i - 1;
213
- while (j >= left) {
214
- a = load<T>(ptr + (<usize>j << alignof<T>()));
215
- if (comparator(a, max) > 0) {
216
- store<T>(ptr + (<usize>j << alignof<T>()), a, 2 << alignof<T>()); --j;
217
- } else break;
218
- }
219
- store<T>(ptr + (<usize>j << alignof<T>()), max, 2 << alignof<T>());
220
- while (j >= left) {
221
- a = load<T>(ptr + (<usize>j << alignof<T>()));
222
- if (comparator(a, min) > 0) {
223
- store<T>(ptr + (<usize>j << alignof<T>()), a, 1 << alignof<T>()); --j;
224
- } else break;
225
- }
226
- store<T>(ptr + (<usize>j << alignof<T>()), min, 1 << alignof<T>());
227
- }
228
- }
229
- }
230
-
231
- function nodePower(left: u32, right: u32, startA: u32, startB: u32, endB: u32): u32 {
232
- let n: u64 = right - left + 1;
233
- let s = startB - (left << 1);
234
- let l = startA + s;
235
- let r = endB + s + 1;
236
- let a = (<u64>l << 30) / n;
237
- let b = (<u64>r << 30) / n;
238
- return clz(<u32>(a ^ b));
239
- }
240
-
241
- function extendRunRight<T>(
242
- ptr: usize,
243
- i: i32,
244
- right: i32,
245
- comparator: Comparator<T>
246
- ): i32 {
247
- if (i == right) return i;
248
- let j = i;
249
- if (comparator(
250
- load<T>(ptr + (<usize> j << alignof<T>())),
251
- load<T>(ptr + (<usize>++j << alignof<T>()))
252
- ) > 0) {
253
- while (
254
- j < right &&
255
- (comparator(
256
- load<T>(ptr + (<usize>j << alignof<T>()), 1 << alignof<T>()),
257
- load<T>(ptr + (<usize>j << alignof<T>()))
258
- ) >>> 31) // < 0
259
- ) ++j;
260
- // reverse
261
- let k = j;
262
- while (i < k) {
263
- let tmp = load<T>(ptr + (<usize>i << alignof<T>()));
264
- store<T>(ptr + (<usize>i << alignof<T>()), load<T>(ptr + (<usize>k << alignof<T>()))); ++i;
265
- store<T>(ptr + (<usize>k << alignof<T>()), tmp); --k;
266
- }
267
- } else {
268
- while (
269
- j < right &&
270
- comparator(
271
- load<T>(ptr + (<usize>j << alignof<T>()), 1 << alignof<T>()),
272
- load<T>(ptr + (<usize>j << alignof<T>()))
273
- ) >= 0
274
- ) ++j;
275
- }
276
- return j;
277
- }
278
-
279
- // Merges arr[l..m - 1] and arr[m..r]
280
- function mergeRuns<T>(
281
- ptr: usize,
282
- l: i32,
283
- m: i32,
284
- r: i32,
285
- buffer: usize,
286
- comparator: Comparator<T>
287
- ): void {
288
- --m;
289
- let i: i32, j: i32, t = r + m;
290
- for (i = m + 1; i > l; --i) {
291
- store<T>(
292
- buffer + (<usize>(i - 1) << alignof<T>()),
293
- load<T>(ptr + (<usize>(i - 1) << alignof<T>()))
294
- );
295
- }
296
- for (j = m; j < r; ++j) {
297
- store<T>(
298
- buffer + (<usize>(t - j) << alignof<T>()),
299
- load<T>(ptr + (<usize>j << alignof<T>()), 1 << alignof<T>())
300
- );
301
- }
302
- for (let k = l; k <= r; ++k) {
303
- let a = load<T>(buffer + (<usize>j << alignof<T>()));
304
- let b = load<T>(buffer + (<usize>i << alignof<T>()));
305
- if (comparator(a, b) < 0) {
306
- store<T>(ptr + (<usize>k << alignof<T>()), a);
307
- --j;
308
- } else {
309
- store<T>(ptr + (<usize>k << alignof<T>()), b);
310
- ++i;
311
- }
312
- }
313
- }
1
+ import { compareImpl } from "./string";
2
+
3
+ type Comparator<T> = (a: T, b: T) => i32;
4
+
5
+ // @ts-ignore: decorator
6
+ @lazy @inline const EMPTY = u32.MAX_VALUE;
7
+ // @ts-ignore: decorator
8
+ @inline const INSERTION_SORT_THRESHOLD = 48;
9
+ // @ts-ignore: decorator
10
+ @inline const MIN_RUN_LENGTH = 32;
11
+
12
+ // @ts-ignore: decorator
13
+ @inline
14
+ function log2u(n: u32): u32 {
15
+ return 31 - clz(n);
16
+ }
17
+
18
+ // @ts-ignore: decorator
19
+ @inline
20
+ export function COMPARATOR<T>(): Comparator<T> {
21
+ if (isInteger<T>()) {
22
+ if (isSigned<T>() && sizeof<T>() <= 4) {
23
+ return (a, b) => i32(a) - i32(b);
24
+ } else {
25
+ return (a, b) => i32(a > b) - i32(a < b);
26
+ }
27
+ } else if (isFloat<T>()) {
28
+ if (sizeof<T>() == 4) {
29
+ return (a, b) => {
30
+ let ia = reinterpret<i32>(f32(a));
31
+ let ib = reinterpret<i32>(f32(b));
32
+ ia ^= ia >> 31 >>> 1;
33
+ ib ^= ib >> 31 >>> 1;
34
+ return i32(ia > ib) - i32(ia < ib);
35
+ };
36
+ } else {
37
+ return (a, b) => {
38
+ let ia = reinterpret<i64>(f64(a));
39
+ let ib = reinterpret<i64>(f64(b));
40
+ ia ^= ia >> 63 >>> 1;
41
+ ib ^= ib >> 63 >>> 1;
42
+ return i32(ia > ib) - i32(ia < ib);
43
+ };
44
+ }
45
+ } else if (isString<T>()) {
46
+ return (a, b) => {
47
+ if (
48
+ changetype<usize>(a) == changetype<usize>(b) ||
49
+ changetype<usize>(a) == 0 ||
50
+ changetype<usize>(b) == 0
51
+ ) return 0;
52
+ let alen = changetype<string>(a).length;
53
+ let blen = changetype<string>(b).length;
54
+ if (!(alen | blen)) return 0;
55
+ if (!alen) return -1;
56
+ if (!blen) return 1;
57
+ let res = compareImpl(
58
+ changetype<string>(a), 0,
59
+ changetype<string>(b), 0,
60
+ <usize>min(alen, blen)
61
+ );
62
+ return res ? res : alen - blen;
63
+ };
64
+ } else {
65
+ return (a, b) => i32(a > b) - i32(a < b);
66
+ }
67
+ }
68
+
69
+ // Power Sort implementation (stable) from paper "Nearly-Optimal Mergesorts"
70
+ // https://arxiv.org/pdf/1805.04154.pdf
71
+ // This method usually outperform TimSort.
72
+ // TODO: refactor c >>> 31 to c < 0 when binaryen will support this opt
73
+ export function SORT<T>(
74
+ ptr: usize,
75
+ len: i32,
76
+ comparator: Comparator<T>
77
+ ): void {
78
+ if (len <= INSERTION_SORT_THRESHOLD) {
79
+ if (len <= 1) return;
80
+ if (ASC_SHRINK_LEVEL < 1) {
81
+ switch (len) {
82
+ case 3: {
83
+ let a = load<T>(ptr, 0);
84
+ let b = load<T>(ptr, 1 << alignof<T>());
85
+ let c = comparator(a, b) > 0;
86
+ store<T>(ptr, select<T>(b, a, c), 0);
87
+ a = select<T>(a, b, c);
88
+ b = load<T>(ptr, 2 << alignof<T>());
89
+ c = comparator(a, b) > 0;
90
+ store<T>(ptr, select<T>(b, a, c), 1 << alignof<T>());
91
+ store<T>(ptr, select<T>(a, b, c), 2 << alignof<T>());
92
+ }
93
+ case 2: {
94
+ let a = load<T>(ptr, 0);
95
+ let b = load<T>(ptr, 1 << alignof<T>());
96
+ let c = comparator(a, b) > 0;
97
+ store<T>(ptr, select<T>(b, a, c), 0);
98
+ store<T>(ptr, select<T>(a, b, c), 1 << alignof<T>());
99
+ return;
100
+ }
101
+ }
102
+ }
103
+ insertionSort<T>(ptr, 0, len - 1, 0, comparator);
104
+ return;
105
+ }
106
+
107
+ let lgPlus2 = log2u(len) + 2;
108
+ let lgPlus2Size = lgPlus2 << alignof<u32>();
109
+ let leftRunStartBuf = __alloc(lgPlus2Size << 1);
110
+ let leftRunEndBuf = leftRunStartBuf + lgPlus2Size;
111
+
112
+ for (let i: u32 = 0; i < lgPlus2; ++i) {
113
+ store<u32>(leftRunStartBuf + (<usize>i << alignof<u32>()), EMPTY);
114
+ }
115
+
116
+ let buffer = __alloc(len << alignof<T>());
117
+
118
+ let hi = len - 1;
119
+ let endA = extendRunRight<T>(ptr, 0, hi, comparator);
120
+ let lenA = endA + 1;
121
+
122
+ if (lenA < MIN_RUN_LENGTH) {
123
+ endA = min(hi, MIN_RUN_LENGTH - 1);
124
+ insertionSort<T>(ptr, 0, endA, lenA, comparator);
125
+ }
126
+
127
+ let top: u32 = 0, startA = 0;
128
+ while (endA < hi) {
129
+ let startB = endA + 1;
130
+ let endB = extendRunRight<T>(ptr, startB, hi, comparator);
131
+ let lenB = endB - startB + 1;
132
+
133
+ if (lenB < MIN_RUN_LENGTH) {
134
+ endB = min(hi, startB + MIN_RUN_LENGTH - 1);
135
+ insertionSort<T>(ptr, startB, endB, lenB, comparator);
136
+ }
137
+
138
+ let k = nodePower(0, hi, startA, startB, endB);
139
+
140
+ for (let i = top; i > k; --i) {
141
+ let start = load<u32>(leftRunStartBuf + (<usize>i << alignof<u32>()));
142
+ if (start != EMPTY) {
143
+ mergeRuns<T>(
144
+ ptr,
145
+ start,
146
+ load<u32>(leftRunEndBuf + (<usize>i << alignof<u32>())) + 1,
147
+ endA,
148
+ buffer,
149
+ comparator
150
+ );
151
+ startA = start;
152
+ store<u32>(leftRunStartBuf + (<usize>i << alignof<u32>()), EMPTY);
153
+ }
154
+ }
155
+
156
+ store<u32>(leftRunStartBuf + (<usize>k << alignof<u32>()), startA);
157
+ store<u32>(leftRunEndBuf + (<usize>k << alignof<u32>()), endA);
158
+ startA = startB;
159
+ endA = endB;
160
+ top = k;
161
+ }
162
+
163
+ for (let i = top; i != 0; --i) {
164
+ let start = load<u32>(leftRunStartBuf + (<usize>i << alignof<u32>()));
165
+ if (start != EMPTY) {
166
+ mergeRuns<T>(
167
+ ptr,
168
+ start,
169
+ load<u32>(leftRunEndBuf + (<usize>i << alignof<u32>())) + 1,
170
+ hi,
171
+ buffer,
172
+ comparator
173
+ );
174
+ }
175
+ }
176
+ // dealloc aux buffers
177
+ __free(buffer);
178
+ __free(leftRunStartBuf);
179
+ }
180
+
181
+ function insertionSort<T>(
182
+ ptr: usize,
183
+ left: i32,
184
+ right: i32,
185
+ presorted: i32,
186
+ comparator: Comparator<T>
187
+ ): void {
188
+ if (ASC_SHRINK_LEVEL >= 1) {
189
+ // slightly improved original insertion sort
190
+ for (let i = left + presorted; i <= right; ++i) {
191
+ let j = i - 1;
192
+ let a = load<T>(ptr + (<usize>i << alignof<T>()));
193
+ while (j >= left) {
194
+ let b = load<T>(ptr + (<usize>j << alignof<T>()));
195
+ if (comparator(a, b) < 0) {
196
+ store<T>(ptr + (<usize>j << alignof<T>()), b, 1 << alignof<T>()); --j;
197
+ } else break;
198
+ }
199
+ store<T>(ptr + (<usize>j << alignof<T>()), a, 1 << alignof<T>());
200
+ }
201
+ } else {
202
+ // even-odd two-way insertion sort which allow increase minRunLen
203
+ let range = right - left + 1;
204
+ let i = left + select(range & 1, presorted - ((range - presorted) & 1), presorted == 0);
205
+ for (; i <= right; i += 2) {
206
+ let a = load<T>(ptr + (<usize>i << alignof<T>()), 0);
207
+ let b = load<T>(ptr + (<usize>i << alignof<T>()), 1 << alignof<T>());
208
+ let min = b, max = a;
209
+ if (comparator(a, b) <= 0) {
210
+ min = a, max = b;
211
+ }
212
+ let j = i - 1;
213
+ while (j >= left) {
214
+ a = load<T>(ptr + (<usize>j << alignof<T>()));
215
+ if (comparator(a, max) > 0) {
216
+ store<T>(ptr + (<usize>j << alignof<T>()), a, 2 << alignof<T>()); --j;
217
+ } else break;
218
+ }
219
+ store<T>(ptr + (<usize>j << alignof<T>()), max, 2 << alignof<T>());
220
+ while (j >= left) {
221
+ a = load<T>(ptr + (<usize>j << alignof<T>()));
222
+ if (comparator(a, min) > 0) {
223
+ store<T>(ptr + (<usize>j << alignof<T>()), a, 1 << alignof<T>()); --j;
224
+ } else break;
225
+ }
226
+ store<T>(ptr + (<usize>j << alignof<T>()), min, 1 << alignof<T>());
227
+ }
228
+ }
229
+ }
230
+
231
+ function nodePower(left: u32, right: u32, startA: u32, startB: u32, endB: u32): u32 {
232
+ let n: u64 = right - left + 1;
233
+ let s = startB - (left << 1);
234
+ let l = startA + s;
235
+ let r = endB + s + 1;
236
+ let a = (<u64>l << 30) / n;
237
+ let b = (<u64>r << 30) / n;
238
+ return clz(<u32>(a ^ b));
239
+ }
240
+
241
+ function extendRunRight<T>(
242
+ ptr: usize,
243
+ i: i32,
244
+ right: i32,
245
+ comparator: Comparator<T>
246
+ ): i32 {
247
+ if (i == right) return i;
248
+ let j = i;
249
+ if (comparator(
250
+ load<T>(ptr + (<usize> j << alignof<T>())),
251
+ load<T>(ptr + (<usize>++j << alignof<T>()))
252
+ ) > 0) {
253
+ while (
254
+ j < right &&
255
+ (comparator(
256
+ load<T>(ptr + (<usize>j << alignof<T>()), 1 << alignof<T>()),
257
+ load<T>(ptr + (<usize>j << alignof<T>()))
258
+ ) >>> 31) // < 0
259
+ ) ++j;
260
+ // reverse
261
+ let k = j;
262
+ while (i < k) {
263
+ let tmp = load<T>(ptr + (<usize>i << alignof<T>()));
264
+ store<T>(ptr + (<usize>i << alignof<T>()), load<T>(ptr + (<usize>k << alignof<T>()))); ++i;
265
+ store<T>(ptr + (<usize>k << alignof<T>()), tmp); --k;
266
+ }
267
+ } else {
268
+ while (
269
+ j < right &&
270
+ comparator(
271
+ load<T>(ptr + (<usize>j << alignof<T>()), 1 << alignof<T>()),
272
+ load<T>(ptr + (<usize>j << alignof<T>()))
273
+ ) >= 0
274
+ ) ++j;
275
+ }
276
+ return j;
277
+ }
278
+
279
+ // Merges arr[l..m - 1] and arr[m..r]
280
+ function mergeRuns<T>(
281
+ ptr: usize,
282
+ l: i32,
283
+ m: i32,
284
+ r: i32,
285
+ buffer: usize,
286
+ comparator: Comparator<T>
287
+ ): void {
288
+ --m;
289
+ let i: i32, j: i32, t = r + m;
290
+ for (i = m + 1; i > l; --i) {
291
+ store<T>(
292
+ buffer + (<usize>(i - 1) << alignof<T>()),
293
+ load<T>(ptr + (<usize>(i - 1) << alignof<T>()))
294
+ );
295
+ }
296
+ for (j = m; j < r; ++j) {
297
+ store<T>(
298
+ buffer + (<usize>(t - j) << alignof<T>()),
299
+ load<T>(ptr + (<usize>j << alignof<T>()), 1 << alignof<T>())
300
+ );
301
+ }
302
+ for (let k = l; k <= r; ++k) {
303
+ let a = load<T>(buffer + (<usize>j << alignof<T>()));
304
+ let b = load<T>(buffer + (<usize>i << alignof<T>()));
305
+ if (comparator(a, b) < 0) {
306
+ store<T>(ptr + (<usize>k << alignof<T>()), a);
307
+ --j;
308
+ } else {
309
+ store<T>(ptr + (<usize>k << alignof<T>()), b);
310
+ ++i;
311
+ }
312
+ }
313
+ }