goscript 0.0.26 → 0.0.29

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 (228) hide show
  1. package/README.md +4 -4
  2. package/cmd/goscript/cmd_compile.go +0 -3
  3. package/cmd/goscript/deps.go +11 -0
  4. package/compiler/analysis.go +298 -55
  5. package/compiler/assignment.go +2 -2
  6. package/compiler/builtin_test.go +1 -1
  7. package/compiler/compiler.go +200 -68
  8. package/compiler/compiler_test.go +17 -24
  9. package/compiler/composite-lit.go +32 -8
  10. package/compiler/decl.go +6 -6
  11. package/compiler/expr-call.go +170 -15
  12. package/compiler/expr-selector.go +100 -0
  13. package/compiler/expr.go +1 -1
  14. package/compiler/protobuf.go +557 -0
  15. package/compiler/spec-struct.go +4 -0
  16. package/compiler/spec-value.go +89 -10
  17. package/compiler/spec.go +254 -1
  18. package/compiler/stmt-assign.go +35 -0
  19. package/compiler/type-assert.go +87 -0
  20. package/compiler/type.go +4 -1
  21. package/dist/gs/builtin/builtin.d.ts +20 -1
  22. package/dist/gs/builtin/builtin.js +95 -4
  23. package/dist/gs/builtin/builtin.js.map +1 -1
  24. package/dist/gs/builtin/slice.d.ts +1 -1
  25. package/dist/gs/builtin/slice.js +21 -2
  26. package/dist/gs/builtin/slice.js.map +1 -1
  27. package/dist/gs/errors/errors.d.ts +5 -6
  28. package/dist/gs/errors/errors.js.map +1 -1
  29. package/dist/gs/internal/oserror/errors.d.ts +6 -0
  30. package/dist/gs/internal/oserror/errors.js +7 -0
  31. package/dist/gs/internal/oserror/errors.js.map +1 -0
  32. package/dist/gs/internal/oserror/index.d.ts +1 -0
  33. package/dist/gs/internal/oserror/index.js +2 -0
  34. package/dist/gs/internal/oserror/index.js.map +1 -0
  35. package/dist/gs/io/fs/format.d.ts +3 -0
  36. package/dist/gs/io/fs/format.js +56 -0
  37. package/dist/gs/io/fs/format.js.map +1 -0
  38. package/dist/gs/io/fs/fs.d.ts +79 -0
  39. package/dist/gs/io/fs/fs.js +200 -0
  40. package/dist/gs/io/fs/fs.js.map +1 -0
  41. package/dist/gs/io/fs/glob.d.ts +10 -0
  42. package/dist/gs/io/fs/glob.js +141 -0
  43. package/dist/gs/io/fs/glob.js.map +1 -0
  44. package/dist/gs/io/fs/index.d.ts +8 -0
  45. package/dist/gs/io/fs/index.js +9 -0
  46. package/dist/gs/io/fs/index.js.map +1 -0
  47. package/dist/gs/io/fs/readdir.d.ts +7 -0
  48. package/dist/gs/io/fs/readdir.js +152 -0
  49. package/dist/gs/io/fs/readdir.js.map +1 -0
  50. package/dist/gs/io/fs/readfile.d.ts +6 -0
  51. package/dist/gs/io/fs/readfile.js +118 -0
  52. package/dist/gs/io/fs/readfile.js.map +1 -0
  53. package/dist/gs/io/fs/stat.d.ts +6 -0
  54. package/dist/gs/io/fs/stat.js +87 -0
  55. package/dist/gs/io/fs/stat.js.map +1 -0
  56. package/dist/gs/io/fs/sub.d.ts +6 -0
  57. package/dist/gs/io/fs/sub.js +172 -0
  58. package/dist/gs/io/fs/sub.js.map +1 -0
  59. package/dist/gs/io/fs/walk.d.ts +7 -0
  60. package/dist/gs/io/fs/walk.js +76 -0
  61. package/dist/gs/io/fs/walk.js.map +1 -0
  62. package/dist/gs/io/index.d.ts +1 -0
  63. package/dist/gs/io/index.js +2 -0
  64. package/dist/gs/io/index.js.map +1 -0
  65. package/dist/gs/io/io.d.ts +107 -0
  66. package/dist/gs/io/io.js +385 -0
  67. package/dist/gs/io/io.js.map +1 -0
  68. package/dist/gs/path/index.d.ts +2 -0
  69. package/dist/gs/path/index.js +3 -0
  70. package/dist/gs/path/index.js.map +1 -0
  71. package/dist/gs/path/match.d.ts +6 -0
  72. package/dist/gs/path/match.js +281 -0
  73. package/dist/gs/path/match.js.map +1 -0
  74. package/dist/gs/path/path.d.ts +7 -0
  75. package/dist/gs/path/path.js +256 -0
  76. package/dist/gs/path/path.js.map +1 -0
  77. package/dist/gs/strings/builder.d.ts +18 -0
  78. package/dist/gs/strings/builder.js +205 -0
  79. package/dist/gs/strings/builder.js.map +1 -0
  80. package/dist/gs/strings/clone.d.ts +1 -0
  81. package/dist/gs/strings/clone.js +16 -0
  82. package/dist/gs/strings/clone.js.map +1 -0
  83. package/dist/gs/strings/compare.d.ts +1 -0
  84. package/dist/gs/strings/compare.js +14 -0
  85. package/dist/gs/strings/compare.js.map +1 -0
  86. package/dist/gs/strings/index.d.ts +2 -0
  87. package/dist/gs/strings/index.js +3 -0
  88. package/dist/gs/strings/index.js.map +1 -0
  89. package/dist/gs/strings/iter.d.ts +8 -0
  90. package/dist/gs/strings/iter.js +160 -0
  91. package/dist/gs/strings/iter.js.map +1 -0
  92. package/dist/gs/strings/reader.d.ts +34 -0
  93. package/dist/gs/strings/reader.js +418 -0
  94. package/dist/gs/strings/reader.js.map +1 -0
  95. package/dist/gs/strings/replace.d.ts +106 -0
  96. package/dist/gs/strings/replace.js +1136 -0
  97. package/dist/gs/strings/replace.js.map +1 -0
  98. package/dist/gs/strings/search.d.ts +24 -0
  99. package/dist/gs/strings/search.js +169 -0
  100. package/dist/gs/strings/search.js.map +1 -0
  101. package/dist/gs/strings/strings.d.ts +47 -0
  102. package/dist/gs/strings/strings.js +418 -0
  103. package/dist/gs/strings/strings.js.map +1 -0
  104. package/dist/gs/stringslite/index.d.ts +1 -0
  105. package/dist/gs/stringslite/index.js +2 -0
  106. package/dist/gs/stringslite/index.js.map +1 -0
  107. package/dist/gs/stringslite/strings.d.ts +11 -0
  108. package/dist/gs/stringslite/strings.js +67 -0
  109. package/dist/gs/stringslite/strings.js.map +1 -0
  110. package/dist/gs/sync/index.d.ts +1 -0
  111. package/dist/gs/sync/index.js +2 -0
  112. package/dist/gs/sync/index.js.map +1 -0
  113. package/dist/gs/sync/sync.d.ts +79 -0
  114. package/dist/gs/sync/sync.js +392 -0
  115. package/dist/gs/sync/sync.js.map +1 -0
  116. package/dist/gs/time/time.d.ts +11 -2
  117. package/dist/gs/time/time.js +337 -12
  118. package/dist/gs/time/time.js.map +1 -1
  119. package/dist/gs/unicode/index.d.ts +1 -0
  120. package/dist/gs/unicode/index.js +2 -0
  121. package/dist/gs/unicode/index.js.map +1 -0
  122. package/dist/gs/unicode/unicode.d.ts +105 -0
  123. package/dist/gs/unicode/unicode.js +332 -0
  124. package/dist/gs/unicode/unicode.js.map +1 -0
  125. package/dist/gs/unicode/utf8/index.d.ts +1 -0
  126. package/dist/gs/unicode/utf8/index.js +3 -0
  127. package/dist/gs/unicode/utf8/index.js.map +1 -0
  128. package/dist/gs/unicode/utf8/utf8.d.ts +20 -0
  129. package/dist/gs/unicode/utf8/utf8.js +196 -0
  130. package/dist/gs/unicode/utf8/utf8.js.map +1 -0
  131. package/dist/gs/unsafe/index.d.ts +1 -0
  132. package/dist/gs/unsafe/index.js +2 -0
  133. package/dist/gs/unsafe/index.js.map +1 -0
  134. package/dist/gs/unsafe/unsafe.d.ts +11 -0
  135. package/dist/gs/unsafe/unsafe.js +44 -0
  136. package/dist/gs/unsafe/unsafe.js.map +1 -0
  137. package/go.mod +2 -1
  138. package/go.sum +6 -2
  139. package/gs/README.md +6 -0
  140. package/gs/builtin/builtin.ts +171 -0
  141. package/gs/builtin/channel.ts +683 -0
  142. package/gs/builtin/defer.ts +58 -0
  143. package/gs/builtin/index.ts +1 -0
  144. package/gs/builtin/io.ts +22 -0
  145. package/gs/builtin/map.ts +50 -0
  146. package/gs/builtin/slice.ts +1030 -0
  147. package/gs/builtin/type.ts +1106 -0
  148. package/gs/builtin/varRef.ts +25 -0
  149. package/gs/cmp/godoc.txt +8 -0
  150. package/gs/cmp/index.ts +29 -0
  151. package/gs/context/context.ts +401 -0
  152. package/gs/context/godoc.txt +69 -0
  153. package/gs/context/index.ts +1 -0
  154. package/gs/errors/errors.ts +223 -0
  155. package/gs/errors/godoc.txt +63 -0
  156. package/gs/errors/index.ts +1 -0
  157. package/gs/internal/goarch/godoc.txt +39 -0
  158. package/gs/internal/goarch/index.ts +18 -0
  159. package/gs/internal/oserror/errors.ts +14 -0
  160. package/gs/internal/oserror/index.ts +1 -0
  161. package/gs/io/fs/format.ts +65 -0
  162. package/gs/io/fs/fs.ts +359 -0
  163. package/gs/io/fs/glob.ts +167 -0
  164. package/gs/io/fs/godoc.txt +35 -0
  165. package/gs/io/fs/index.ts +8 -0
  166. package/gs/io/fs/readdir.ts +126 -0
  167. package/gs/io/fs/readfile.ts +77 -0
  168. package/gs/io/fs/stat.ts +38 -0
  169. package/gs/io/fs/sub.ts +208 -0
  170. package/gs/io/fs/walk.ts +89 -0
  171. package/gs/io/godoc.txt +61 -0
  172. package/gs/io/index.ts +1 -0
  173. package/gs/io/io.go +75 -0
  174. package/gs/io/io.ts +546 -0
  175. package/gs/iter/godoc.txt +203 -0
  176. package/gs/iter/index.ts +1 -0
  177. package/gs/iter/iter.ts +117 -0
  178. package/gs/math/bits/index.ts +356 -0
  179. package/gs/math/godoc.txt +76 -0
  180. package/gs/path/index.ts +2 -0
  181. package/gs/path/match.ts +307 -0
  182. package/gs/path/path.ts +301 -0
  183. package/gs/runtime/godoc.txt +331 -0
  184. package/gs/runtime/index.ts +1 -0
  185. package/gs/runtime/runtime.ts +178 -0
  186. package/gs/slices/godoc.txt +44 -0
  187. package/gs/slices/index.ts +1 -0
  188. package/gs/slices/slices.ts +22 -0
  189. package/gs/strings/builder.test.ts +121 -0
  190. package/gs/strings/builder.ts +223 -0
  191. package/gs/strings/clone.test.ts +43 -0
  192. package/gs/strings/clone.ts +17 -0
  193. package/gs/strings/compare.test.ts +84 -0
  194. package/gs/strings/compare.ts +13 -0
  195. package/gs/strings/godoc.txt +66 -0
  196. package/gs/strings/index.ts +2 -0
  197. package/gs/strings/iter.test.ts +343 -0
  198. package/gs/strings/iter.ts +171 -0
  199. package/gs/strings/reader.test.ts +242 -0
  200. package/gs/strings/reader.ts +451 -0
  201. package/gs/strings/replace.test.ts +181 -0
  202. package/gs/strings/replace.ts +1310 -0
  203. package/gs/strings/search.test.ts +214 -0
  204. package/gs/strings/search.ts +213 -0
  205. package/gs/strings/strings.test.ts +477 -0
  206. package/gs/strings/strings.ts +510 -0
  207. package/gs/stringslite/godoc.txt +17 -0
  208. package/gs/stringslite/index.ts +1 -0
  209. package/gs/stringslite/strings.ts +82 -0
  210. package/gs/sync/godoc.txt +21 -0
  211. package/gs/sync/index.ts +1 -0
  212. package/gs/sync/sync.go +64 -0
  213. package/gs/sync/sync.ts +449 -0
  214. package/gs/time/godoc.txt +116 -0
  215. package/gs/time/index.ts +1 -0
  216. package/gs/time/time.ts +585 -0
  217. package/gs/unicode/godoc.txt +52 -0
  218. package/gs/unicode/index.ts +1 -0
  219. package/gs/unicode/unicode.go +38 -0
  220. package/gs/unicode/unicode.ts +418 -0
  221. package/gs/unicode/utf8/godoc.txt +22 -0
  222. package/gs/unicode/utf8/index.ts +2 -0
  223. package/gs/unicode/utf8/utf8.ts +227 -0
  224. package/gs/unsafe/godoc.txt +19 -0
  225. package/gs/unsafe/index.ts +1 -0
  226. package/gs/unsafe/unsafe.test.ts +68 -0
  227. package/gs/unsafe/unsafe.ts +77 -0
  228. package/package.json +4 -3
@@ -0,0 +1,1136 @@
1
+ import * as $ from '@goscript/builtin/builtin.js';
2
+ import { makeStringFinder } from './search.js';
3
+ import { Count, HasPrefix } from './strings.js';
4
+ import { Builder } from './builder.js';
5
+ export class Replacer {
6
+ // guards buildOnce method
7
+ get built() {
8
+ return this._fields.built.value;
9
+ }
10
+ set built(value) {
11
+ this._fields.built.value = value;
12
+ }
13
+ get r() {
14
+ return this._fields.r.value;
15
+ }
16
+ set r(value) {
17
+ this._fields.r.value = value;
18
+ }
19
+ get oldnew() {
20
+ return this._fields.oldnew.value;
21
+ }
22
+ set oldnew(value) {
23
+ this._fields.oldnew.value = value;
24
+ }
25
+ _fields;
26
+ constructor(init) {
27
+ this._fields = {
28
+ built: $.varRef(init?.built ?? false),
29
+ r: $.varRef(init?.r ?? null),
30
+ oldnew: $.varRef(init?.oldnew ?? null),
31
+ };
32
+ }
33
+ clone() {
34
+ const cloned = new Replacer();
35
+ cloned._fields = {
36
+ built: $.varRef(this._fields.built.value),
37
+ r: $.varRef(this._fields.r.value),
38
+ oldnew: $.varRef(this._fields.oldnew.value),
39
+ };
40
+ return cloned;
41
+ }
42
+ buildOnce() {
43
+ if (this.built) {
44
+ return;
45
+ }
46
+ const r = this;
47
+ const built = r.build();
48
+ r.r = built;
49
+ r.oldnew = null;
50
+ r.built = true;
51
+ }
52
+ build() {
53
+ const b = this;
54
+ let oldnew = b.oldnew;
55
+ // Handle empty case - no replacements to do
56
+ if ($.len(oldnew) == 0) {
57
+ return {
58
+ Replace: (s) => s,
59
+ WriteString: (w, s) => {
60
+ const bytes = $.stringToBytes(s);
61
+ return w.Write(bytes);
62
+ },
63
+ };
64
+ }
65
+ if ($.len(oldnew) == 2 && $.len(oldnew[0]) > 1) {
66
+ return makeSingleStringReplacer(oldnew[0], oldnew[1]);
67
+ }
68
+ let allNewBytes = true;
69
+ for (let i = 0; i < $.len(oldnew); i += 2) {
70
+ if ($.len(oldnew[i]) != 1) {
71
+ return makeGenericReplacer(oldnew);
72
+ }
73
+ if ($.len(oldnew[i + 1]) != 1) {
74
+ allNewBytes = false;
75
+ }
76
+ }
77
+ if (allNewBytes) {
78
+ let r = new Array(256);
79
+ for (let i = 0; i < r.length; i++) {
80
+ r[i] = i;
81
+ }
82
+ // The first occurrence of old->new map takes precedence
83
+ // over the others with the same old string.
84
+ for (let i = $.len(oldnew) - 2; i >= 0; i -= 2) {
85
+ let o = $.indexString(oldnew[i], 0);
86
+ let n = $.indexString(oldnew[i + 1], 0);
87
+ r[o] = n;
88
+ }
89
+ return {
90
+ Replace: (s) => {
91
+ let result = '';
92
+ for (let i = 0; i < s.length; i++) {
93
+ const charCode = s.charCodeAt(i);
94
+ if (charCode < 256) {
95
+ result += String.fromCharCode(r[charCode]);
96
+ }
97
+ else {
98
+ result += s[i];
99
+ }
100
+ }
101
+ return result;
102
+ },
103
+ WriteString: (w, s) => {
104
+ const replaced = this.Replace(s);
105
+ const bytes = $.stringToBytes(replaced);
106
+ return w.Write(bytes);
107
+ },
108
+ };
109
+ }
110
+ let r = new byteStringReplacer({
111
+ toReplace: $.makeSlice(0, $.len(oldnew) / 2),
112
+ });
113
+ for (let i = $.len(oldnew) - 2; i >= 0; i -= 2) {
114
+ let o = $.indexString(oldnew[i], 0);
115
+ let n = oldnew[i + 1];
116
+ // To avoid counting repetitions multiple times.
117
+ // We need to use string([]byte{o}) instead of string(o),
118
+ // to avoid utf8 encoding of o.
119
+ // E. g. byte(150) produces string of length 2.
120
+ if (r.replacements[o] == null) {
121
+ // We need to use string([]byte{o}) instead of string(o),
122
+ // to avoid utf8 encoding of o.
123
+ // E. g. byte(150) produces string of length 2.
124
+ r.toReplace = $.append(r.toReplace, $.bytesToString(new Uint8Array([o])));
125
+ }
126
+ r.replacements[o] = $.stringToBytes(n);
127
+ }
128
+ return r;
129
+ }
130
+ // Replace returns a copy of s with all replacements performed.
131
+ Replace(s) {
132
+ const r = this;
133
+ r.buildOnce();
134
+ return r.r.Replace(s);
135
+ }
136
+ // WriteString writes s to w with all replacements performed.
137
+ WriteString(w, s) {
138
+ const r = this;
139
+ r.buildOnce();
140
+ return r.r.WriteString(w, s);
141
+ }
142
+ // Register this type with the runtime type system
143
+ static __typeInfo = $.registerStructType('Replacer', new Replacer(), [
144
+ { name: 'buildOnce', args: [], returns: [] },
145
+ { name: 'build', args: [], returns: [{ type: 'replacer' }] },
146
+ {
147
+ name: 'Replace',
148
+ args: [{ name: 's', type: { kind: $.TypeKind.Basic, name: 'string' } }],
149
+ returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }],
150
+ },
151
+ {
152
+ name: 'WriteString',
153
+ args: [
154
+ { name: 'w', type: 'Writer' },
155
+ { name: 's', type: { kind: $.TypeKind.Basic, name: 'string' } },
156
+ ],
157
+ returns: [
158
+ { type: { kind: $.TypeKind.Basic, name: 'number' } },
159
+ {
160
+ type: {
161
+ kind: $.TypeKind.Interface,
162
+ name: 'GoError',
163
+ methods: [
164
+ {
165
+ name: 'Error',
166
+ args: [],
167
+ returns: [
168
+ { type: { kind: $.TypeKind.Basic, name: 'string' } },
169
+ ],
170
+ },
171
+ ],
172
+ },
173
+ },
174
+ ],
175
+ },
176
+ ], Replacer, {
177
+ built: { kind: $.TypeKind.Basic, name: 'boolean' },
178
+ r: 'replacer',
179
+ oldnew: {
180
+ kind: $.TypeKind.Slice,
181
+ elemType: { kind: $.TypeKind.Basic, name: 'string' },
182
+ },
183
+ });
184
+ }
185
+ $.registerInterfaceType('replacer', null, // Zero value for interface is null
186
+ [
187
+ {
188
+ name: 'Replace',
189
+ args: [{ name: 's', type: { kind: $.TypeKind.Basic, name: 'string' } }],
190
+ returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }],
191
+ },
192
+ {
193
+ name: 'WriteString',
194
+ args: [
195
+ { name: 'w', type: 'Writer' },
196
+ { name: 's', type: { kind: $.TypeKind.Basic, name: 'string' } },
197
+ ],
198
+ returns: [
199
+ { type: { kind: $.TypeKind.Basic, name: 'number' } },
200
+ {
201
+ type: {
202
+ kind: $.TypeKind.Interface,
203
+ name: 'GoError',
204
+ methods: [
205
+ {
206
+ name: 'Error',
207
+ args: [],
208
+ returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }],
209
+ },
210
+ ],
211
+ },
212
+ },
213
+ ],
214
+ },
215
+ ]);
216
+ // NewReplacer returns a new [Replacer] from a list of old, new string
217
+ // pairs. Replacements are performed in the order they appear in the
218
+ // target string, without overlapping matches. The old string
219
+ // comparisons are done in argument order.
220
+ //
221
+ // NewReplacer panics if given an odd number of arguments.
222
+ export function NewReplacer(...oldnew) {
223
+ if ($.len(oldnew) % 2 == 1) {
224
+ $.panic('strings.NewReplacer: odd argument count');
225
+ }
226
+ return new Replacer({ oldnew: $.append(null, ...oldnew) });
227
+ }
228
+ class trieNode {
229
+ // value is the value of the trie node's key/value pair. It is empty if
230
+ // this node is not a complete key.
231
+ get value() {
232
+ return this._fields.value.value;
233
+ }
234
+ set value(value) {
235
+ this._fields.value.value = value;
236
+ }
237
+ // priority is the priority (higher is more important) of the trie node's
238
+ // key/value pair; keys are not necessarily matched shortest- or longest-
239
+ // first. Priority is positive if this node is a complete key, and zero
240
+ // otherwise. In the example above, positive/zero priorities are marked
241
+ // with a trailing "+" or "-".
242
+ get priority() {
243
+ return this._fields.priority.value;
244
+ }
245
+ set priority(value) {
246
+ this._fields.priority.value = value;
247
+ }
248
+ // prefix is the difference in keys between this trie node and the next.
249
+ // In the example above, node n4 has prefix "cbc" and n4's next node is n5.
250
+ // Node n5 has no children and so has zero prefix, next and table fields.
251
+ get prefix() {
252
+ return this._fields.prefix.value;
253
+ }
254
+ set prefix(value) {
255
+ this._fields.prefix.value = value;
256
+ }
257
+ get next() {
258
+ return this._fields.next.value;
259
+ }
260
+ set next(value) {
261
+ this._fields.next.value = value;
262
+ }
263
+ // table is a lookup table indexed by the next byte in the key, after
264
+ // remapping that byte through genericReplacer.mapping to create a dense
265
+ // index. In the example above, the keys only use 'a', 'b', 'c', 'x' and
266
+ // 'y', which remap to 0, 1, 2, 3 and 4. All other bytes remap to 5, and
267
+ // genericReplacer.tableSize will be 5. Node n0's table will be
268
+ // []*trieNode{ 0:n1, 1:n4, 3:n6 }, where the 0, 1 and 3 are the remapped
269
+ // 'a', 'b' and 'x'.
270
+ get table() {
271
+ return this._fields.table.value;
272
+ }
273
+ set table(value) {
274
+ this._fields.table.value = value;
275
+ }
276
+ _fields;
277
+ constructor(init) {
278
+ this._fields = {
279
+ value: $.varRef(init?.value ?? ''),
280
+ priority: $.varRef(init?.priority ?? 0),
281
+ prefix: $.varRef(init?.prefix ?? ''),
282
+ next: $.varRef(init?.next ?? null),
283
+ table: $.varRef(init?.table ?? null),
284
+ };
285
+ }
286
+ clone() {
287
+ const cloned = new trieNode();
288
+ cloned._fields = {
289
+ value: $.varRef(this._fields.value.value),
290
+ priority: $.varRef(this._fields.priority.value),
291
+ prefix: $.varRef(this._fields.prefix.value),
292
+ next: $.varRef(this._fields.next.value),
293
+ table: $.varRef(this._fields.table.value),
294
+ };
295
+ return cloned;
296
+ }
297
+ add(key, val, priority, r) {
298
+ const t = this;
299
+ if (key == '') {
300
+ if (t.priority == 0) {
301
+ t.value = val;
302
+ t.priority = priority;
303
+ }
304
+ return;
305
+ }
306
+ if (t.prefix != '') {
307
+ // Need to split the prefix among multiple nodes.
308
+ // length of the longest common prefix
309
+ let n = 0;
310
+ for (; n < $.len(t.prefix) && n < $.len(key); n++) {
311
+ if ($.indexString(t.prefix, n) != $.indexString(key, n)) {
312
+ break;
313
+ }
314
+ }
315
+ // First byte differs, start a new lookup table here. Looking up
316
+ // what is currently t.prefix[0] will lead to prefixNode, and
317
+ // looking up key[0] will lead to keyNode.
318
+ // Insert new node after the common section of the prefix.
319
+ if (n == $.len(t.prefix)) {
320
+ t.next.add($.sliceString(key, n, undefined), val, priority, r);
321
+ }
322
+ else if (n == 0) {
323
+ // First byte differs, start a new lookup table here. Looking up
324
+ // what is currently t.prefix[0] will lead to prefixNode, and
325
+ // looking up key[0] will lead to keyNode.
326
+ let prefixNode = null;
327
+ if ($.len(t.prefix) == 1) {
328
+ prefixNode = t.next;
329
+ }
330
+ else {
331
+ prefixNode = new trieNode({
332
+ next: t.next,
333
+ prefix: $.sliceString(t.prefix, 1, undefined),
334
+ });
335
+ }
336
+ let keyNode = new trieNode();
337
+ t.table = $.makeSlice(r.tableSize);
338
+ t.table[r.mapping[$.indexString(t.prefix, 0)]] = prefixNode;
339
+ t.table[r.mapping[$.indexString(key, 0)]] = keyNode;
340
+ t.prefix = '';
341
+ t.next = null;
342
+ keyNode.add($.sliceString(key, 1, undefined), val, priority, r);
343
+ }
344
+ else {
345
+ // Insert new node after the common section of the prefix.
346
+ let next = new trieNode({
347
+ next: t.next,
348
+ prefix: $.sliceString(t.prefix, n, undefined),
349
+ });
350
+ t.prefix = $.sliceString(t.prefix, undefined, n);
351
+ t.next = next;
352
+ next.add($.sliceString(key, n, undefined), val, priority, r);
353
+ }
354
+ }
355
+ else if (t.table != null) {
356
+ // Insert into existing table.
357
+ let m = r.mapping[$.indexString(key, 0)];
358
+ if (t.table[m] == null) {
359
+ t.table[m] = new trieNode();
360
+ }
361
+ t.table[m].add($.sliceString(key, 1, undefined), val, priority, r);
362
+ }
363
+ else {
364
+ t.prefix = key;
365
+ t.next = new trieNode();
366
+ t.next.add('', val, priority, r);
367
+ }
368
+ }
369
+ // Register this type with the runtime type system
370
+ static __typeInfo = $.registerStructType('trieNode', new trieNode(), [
371
+ {
372
+ name: 'add',
373
+ args: [
374
+ { name: 'key', type: { kind: $.TypeKind.Basic, name: 'string' } },
375
+ { name: 'val', type: { kind: $.TypeKind.Basic, name: 'string' } },
376
+ {
377
+ name: 'priority',
378
+ type: { kind: $.TypeKind.Basic, name: 'number' },
379
+ },
380
+ {
381
+ name: 'r',
382
+ type: { kind: $.TypeKind.Pointer, elemType: 'genericReplacer' },
383
+ },
384
+ ],
385
+ returns: [],
386
+ },
387
+ ], trieNode, {
388
+ value: { kind: $.TypeKind.Basic, name: 'string' },
389
+ priority: { kind: $.TypeKind.Basic, name: 'number' },
390
+ prefix: { kind: $.TypeKind.Basic, name: 'string' },
391
+ next: { kind: $.TypeKind.Pointer, elemType: 'trieNode' },
392
+ table: {
393
+ kind: $.TypeKind.Slice,
394
+ elemType: { kind: $.TypeKind.Pointer, elemType: 'trieNode' },
395
+ },
396
+ });
397
+ }
398
+ class genericReplacer {
399
+ get root() {
400
+ return this._fields.root.value;
401
+ }
402
+ set root(value) {
403
+ this._fields.root.value = value;
404
+ }
405
+ // tableSize is the size of a trie node's lookup table. It is the number
406
+ // of unique key bytes.
407
+ get tableSize() {
408
+ return this._fields.tableSize.value;
409
+ }
410
+ set tableSize(value) {
411
+ this._fields.tableSize.value = value;
412
+ }
413
+ // mapping maps from key bytes to a dense index for trieNode.table.
414
+ get mapping() {
415
+ return this._fields.mapping.value;
416
+ }
417
+ set mapping(value) {
418
+ this._fields.mapping.value = value;
419
+ }
420
+ _fields;
421
+ constructor(init) {
422
+ this._fields = {
423
+ root: $.varRef(init?.root?.clone() ?? new trieNode()),
424
+ tableSize: $.varRef(init?.tableSize ?? 0),
425
+ mapping: $.varRef(init?.mapping ?? [
426
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
427
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
428
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
429
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
430
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
431
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
432
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
433
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
434
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
435
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
436
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
437
+ 0, 0, 0,
438
+ ]),
439
+ };
440
+ }
441
+ clone() {
442
+ const cloned = new genericReplacer();
443
+ cloned._fields = {
444
+ root: $.varRef(this._fields.root.value?.clone() ?? null),
445
+ tableSize: $.varRef(this._fields.tableSize.value),
446
+ mapping: $.varRef(this._fields.mapping.value),
447
+ };
448
+ return cloned;
449
+ }
450
+ lookup(s, ignoreRoot) {
451
+ const r = this;
452
+ let bestPriority = 0;
453
+ let node = r.root;
454
+ let n = 0;
455
+ let val = '';
456
+ let keylen = 0;
457
+ let found = false;
458
+ for (; node != null;) {
459
+ if (node.priority > bestPriority && !(ignoreRoot && node === r.root)) {
460
+ bestPriority = node.priority;
461
+ val = node.value;
462
+ keylen = n;
463
+ found = true;
464
+ }
465
+ if (s == '') {
466
+ break;
467
+ }
468
+ if (node.table != null) {
469
+ let index = r.mapping[$.indexString(s, 0)];
470
+ if (index == r.tableSize) {
471
+ break;
472
+ }
473
+ node = node.table[index];
474
+ s = $.sliceString(s, 1, undefined);
475
+ n++;
476
+ }
477
+ else if (node.prefix != '' && HasPrefix(s, node.prefix)) {
478
+ n += $.len(node.prefix);
479
+ s = $.sliceString(s, $.len(node.prefix), undefined);
480
+ node = node.next;
481
+ }
482
+ else {
483
+ break;
484
+ }
485
+ }
486
+ return [val, keylen, found];
487
+ }
488
+ Replace(s) {
489
+ const r = this;
490
+ let result = '';
491
+ let last = 0;
492
+ for (let i = 0; i <= $.len(s);) {
493
+ // Fast path: s[i] is not a prefix of any pattern.
494
+ if (i != $.len(s) && r.root.priority == 0) {
495
+ let index = r.mapping[$.indexString(s, i)];
496
+ if (index == r.tableSize || r.root.table[index] == null) {
497
+ i++;
498
+ continue;
499
+ }
500
+ }
501
+ // Ignore the empty match iff the previous loop found the empty match.
502
+ let [val, keylen, match] = r.lookup($.sliceString(s, i, undefined), false);
503
+ if (match) {
504
+ result += $.sliceString(s, last, i);
505
+ result += val;
506
+ i += keylen;
507
+ last = i;
508
+ continue;
509
+ }
510
+ i++;
511
+ }
512
+ if (last != $.len(s)) {
513
+ result += $.sliceString(s, last, undefined);
514
+ }
515
+ return result;
516
+ }
517
+ WriteString(w, s) {
518
+ const r = this;
519
+ let sw = getStringWriter(w);
520
+ let last = 0;
521
+ let wn = 0;
522
+ let n = 0;
523
+ let err = null;
524
+ let prevMatchEmpty = false;
525
+ for (let i = 0; i <= $.len(s);) {
526
+ // Fast path: s[i] is not a prefix of any pattern.
527
+ if (i != $.len(s) && r.root.priority == 0) {
528
+ let index = r.mapping[$.indexString(s, i)];
529
+ if (index == r.tableSize || r.root.table[index] == null) {
530
+ i++;
531
+ continue;
532
+ }
533
+ }
534
+ // Ignore the empty match iff the previous loop found the empty match.
535
+ let [val, keylen, match] = r.lookup($.sliceString(s, i, undefined), prevMatchEmpty);
536
+ prevMatchEmpty = match && keylen == 0;
537
+ if (match) {
538
+ ;
539
+ [wn, err] = sw.WriteString($.sliceString(s, last, i));
540
+ n += wn;
541
+ if (err != null) {
542
+ return [n, err];
543
+ }
544
+ ;
545
+ [wn, err] = sw.WriteString(val);
546
+ n += wn;
547
+ if (err != null) {
548
+ return [n, err];
549
+ }
550
+ i += keylen;
551
+ last = i;
552
+ continue;
553
+ }
554
+ i++;
555
+ }
556
+ if (last != $.len(s)) {
557
+ ;
558
+ [wn, err] = sw.WriteString($.sliceString(s, last, undefined));
559
+ n += wn;
560
+ }
561
+ return [n, err];
562
+ }
563
+ // Register this type with the runtime type system
564
+ static __typeInfo = $.registerStructType('genericReplacer', new genericReplacer(), [
565
+ {
566
+ name: 'lookup',
567
+ args: [
568
+ { name: 's', type: { kind: $.TypeKind.Basic, name: 'string' } },
569
+ {
570
+ name: 'ignoreRoot',
571
+ type: { kind: $.TypeKind.Basic, name: 'boolean' },
572
+ },
573
+ ],
574
+ returns: [
575
+ { type: { kind: $.TypeKind.Basic, name: 'string' } },
576
+ { type: { kind: $.TypeKind.Basic, name: 'number' } },
577
+ { type: { kind: $.TypeKind.Basic, name: 'boolean' } },
578
+ ],
579
+ },
580
+ {
581
+ name: 'Replace',
582
+ args: [{ name: 's', type: { kind: $.TypeKind.Basic, name: 'string' } }],
583
+ returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }],
584
+ },
585
+ {
586
+ name: 'WriteString',
587
+ args: [
588
+ { name: 'w', type: 'Writer' },
589
+ { name: 's', type: { kind: $.TypeKind.Basic, name: 'string' } },
590
+ ],
591
+ returns: [
592
+ { type: { kind: $.TypeKind.Basic, name: 'number' } },
593
+ {
594
+ type: {
595
+ kind: $.TypeKind.Interface,
596
+ name: 'GoError',
597
+ methods: [
598
+ {
599
+ name: 'Error',
600
+ args: [],
601
+ returns: [
602
+ { type: { kind: $.TypeKind.Basic, name: 'string' } },
603
+ ],
604
+ },
605
+ ],
606
+ },
607
+ },
608
+ ],
609
+ },
610
+ ], genericReplacer, {
611
+ root: 'trieNode',
612
+ tableSize: { kind: $.TypeKind.Basic, name: 'number' },
613
+ mapping: {
614
+ kind: $.TypeKind.Array,
615
+ length: 256,
616
+ elemType: { kind: $.TypeKind.Basic, name: 'number' },
617
+ },
618
+ });
619
+ }
620
+ export function makeGenericReplacer(oldnew) {
621
+ let r = new genericReplacer();
622
+ // Find each byte used, then assign them each an index.
623
+ for (let i = 0; i < $.len(oldnew); i += 2) {
624
+ let key = oldnew[i];
625
+ for (let j = 0; j < $.len(key); j++) {
626
+ r.mapping[$.indexString(key, j)] = 1;
627
+ }
628
+ }
629
+ for (let _i = 0; _i < $.len(r.mapping); _i++) {
630
+ const b = r.mapping[_i];
631
+ {
632
+ r.tableSize += b;
633
+ }
634
+ }
635
+ let index = 0;
636
+ for (let i = 0; i < $.len(r.mapping); i++) {
637
+ const b = r.mapping[i];
638
+ {
639
+ if (b == 0) {
640
+ r.mapping[i] = $.byte(r.tableSize);
641
+ }
642
+ else {
643
+ r.mapping[i] = index;
644
+ index++;
645
+ }
646
+ }
647
+ }
648
+ // Ensure root node uses a lookup table (for performance).
649
+ r.root.table = $.makeSlice(r.tableSize);
650
+ for (let i = 0; i < $.len(oldnew); i += 2) {
651
+ r.root.add(oldnew[i], oldnew[i + 1], $.len(oldnew) - i, r);
652
+ }
653
+ return r;
654
+ }
655
+ class stringWriter {
656
+ get w() {
657
+ return this._fields.w.value;
658
+ }
659
+ set w(value) {
660
+ this._fields.w.value = value;
661
+ }
662
+ _fields;
663
+ constructor(init) {
664
+ this._fields = {
665
+ w: $.varRef(init?.w),
666
+ };
667
+ }
668
+ clone() {
669
+ const cloned = new stringWriter();
670
+ cloned._fields = {
671
+ w: $.varRef(this._fields.w.value),
672
+ };
673
+ return cloned;
674
+ }
675
+ WriteString(s) {
676
+ const w = this;
677
+ return w.w.Write($.stringToBytes(s));
678
+ }
679
+ // Register this type with the runtime type system
680
+ static __typeInfo = $.registerStructType('stringWriter', new stringWriter(), [
681
+ {
682
+ name: 'WriteString',
683
+ args: [{ name: 's', type: { kind: $.TypeKind.Basic, name: 'string' } }],
684
+ returns: [
685
+ { type: { kind: $.TypeKind.Basic, name: 'number' } },
686
+ {
687
+ type: {
688
+ kind: $.TypeKind.Interface,
689
+ name: 'GoError',
690
+ methods: [
691
+ {
692
+ name: 'Error',
693
+ args: [],
694
+ returns: [
695
+ { type: { kind: $.TypeKind.Basic, name: 'string' } },
696
+ ],
697
+ },
698
+ ],
699
+ },
700
+ },
701
+ ],
702
+ },
703
+ ], stringWriter, { w: 'Writer' });
704
+ }
705
+ export function getStringWriter(w) {
706
+ let { value: sw, ok: ok } = $.typeAssert(w, 'io.StringWriter');
707
+ if (!ok) {
708
+ sw = new stringWriter({ w: w });
709
+ }
710
+ return sw;
711
+ }
712
+ class singleStringReplacer {
713
+ get finder() {
714
+ return this._fields.finder.value;
715
+ }
716
+ set finder(value) {
717
+ this._fields.finder.value = value;
718
+ }
719
+ // value is the new string that replaces that pattern when it's found.
720
+ get value() {
721
+ return this._fields.value.value;
722
+ }
723
+ set value(value) {
724
+ this._fields.value.value = value;
725
+ }
726
+ _fields;
727
+ constructor(init) {
728
+ this._fields = {
729
+ finder: $.varRef(init?.finder ?? null),
730
+ value: $.varRef(init?.value ?? ''),
731
+ };
732
+ }
733
+ clone() {
734
+ const cloned = new singleStringReplacer();
735
+ cloned._fields = {
736
+ finder: $.varRef(this._fields.finder.value),
737
+ value: $.varRef(this._fields.value.value),
738
+ };
739
+ return cloned;
740
+ }
741
+ Replace(s) {
742
+ const r = this;
743
+ let buf = new Builder();
744
+ let [i, matched] = [0, false];
745
+ for (;;) {
746
+ let match = r.finder.next($.sliceString(s, i, undefined));
747
+ if (match == -1) {
748
+ break;
749
+ }
750
+ matched = true;
751
+ buf.Grow(match + $.len(r.value));
752
+ buf.WriteString($.sliceString(s, i, i + match));
753
+ buf.WriteString(r.value);
754
+ i += match + $.len(r.finder.pattern);
755
+ }
756
+ if (!matched) {
757
+ return s;
758
+ }
759
+ buf.WriteString($.sliceString(s, i, undefined));
760
+ return buf.String();
761
+ }
762
+ WriteString(w, s) {
763
+ const r = this;
764
+ let sw = getStringWriter(w);
765
+ let i = 0;
766
+ let wn = 0;
767
+ let n = 0;
768
+ let err = null;
769
+ for (;;) {
770
+ let match = r.finder.next($.sliceString(s, i, undefined));
771
+ if (match == -1) {
772
+ break;
773
+ }
774
+ ;
775
+ [wn, err] = sw.WriteString($.sliceString(s, i, i + match));
776
+ n += wn;
777
+ if (err != null) {
778
+ return [n, err];
779
+ }
780
+ ;
781
+ [wn, err] = sw.WriteString(r.value);
782
+ n += wn;
783
+ if (err != null) {
784
+ return [n, err];
785
+ }
786
+ i += match + $.len(r.finder.pattern);
787
+ }
788
+ ;
789
+ [wn, err] = sw.WriteString($.sliceString(s, i, undefined));
790
+ n += wn;
791
+ return [n, err];
792
+ }
793
+ // Register this type with the runtime type system
794
+ static __typeInfo = $.registerStructType('singleStringReplacer', new singleStringReplacer(), [
795
+ {
796
+ name: 'Replace',
797
+ args: [{ name: 's', type: { kind: $.TypeKind.Basic, name: 'string' } }],
798
+ returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }],
799
+ },
800
+ {
801
+ name: 'WriteString',
802
+ args: [
803
+ { name: 'w', type: 'Writer' },
804
+ { name: 's', type: { kind: $.TypeKind.Basic, name: 'string' } },
805
+ ],
806
+ returns: [
807
+ { type: { kind: $.TypeKind.Basic, name: 'number' } },
808
+ {
809
+ type: {
810
+ kind: $.TypeKind.Interface,
811
+ name: 'GoError',
812
+ methods: [
813
+ {
814
+ name: 'Error',
815
+ args: [],
816
+ returns: [
817
+ { type: { kind: $.TypeKind.Basic, name: 'string' } },
818
+ ],
819
+ },
820
+ ],
821
+ },
822
+ },
823
+ ],
824
+ },
825
+ ], singleStringReplacer, {
826
+ finder: { kind: $.TypeKind.Pointer, elemType: 'stringFinder' },
827
+ value: { kind: $.TypeKind.Basic, name: 'string' },
828
+ });
829
+ }
830
+ export function makeSingleStringReplacer(pattern, value) {
831
+ return new singleStringReplacer({
832
+ finder: makeStringFinder(pattern),
833
+ value: value,
834
+ });
835
+ }
836
+ class byteStringReplacer {
837
+ // replacements contains replacement byte slices indexed by old byte.
838
+ // A nil []byte means that the old byte should not be replaced.
839
+ get replacements() {
840
+ return this._fields.replacements.value;
841
+ }
842
+ set replacements(value) {
843
+ this._fields.replacements.value = value;
844
+ }
845
+ // toReplace keeps a list of bytes to replace. Depending on length of toReplace
846
+ // and length of target string it may be faster to use Count, or a plain loop.
847
+ // We store single byte as a string, because Count takes a string.
848
+ get toReplace() {
849
+ return this._fields.toReplace.value;
850
+ }
851
+ set toReplace(value) {
852
+ this._fields.toReplace.value = value;
853
+ }
854
+ _fields;
855
+ constructor(init) {
856
+ this._fields = {
857
+ replacements: $.varRef(init?.replacements ?? [
858
+ new Uint8Array(0),
859
+ new Uint8Array(0),
860
+ new Uint8Array(0),
861
+ new Uint8Array(0),
862
+ new Uint8Array(0),
863
+ new Uint8Array(0),
864
+ new Uint8Array(0),
865
+ new Uint8Array(0),
866
+ new Uint8Array(0),
867
+ new Uint8Array(0),
868
+ new Uint8Array(0),
869
+ new Uint8Array(0),
870
+ new Uint8Array(0),
871
+ new Uint8Array(0),
872
+ new Uint8Array(0),
873
+ new Uint8Array(0),
874
+ new Uint8Array(0),
875
+ new Uint8Array(0),
876
+ new Uint8Array(0),
877
+ new Uint8Array(0),
878
+ new Uint8Array(0),
879
+ new Uint8Array(0),
880
+ new Uint8Array(0),
881
+ new Uint8Array(0),
882
+ new Uint8Array(0),
883
+ new Uint8Array(0),
884
+ new Uint8Array(0),
885
+ new Uint8Array(0),
886
+ new Uint8Array(0),
887
+ new Uint8Array(0),
888
+ new Uint8Array(0),
889
+ new Uint8Array(0),
890
+ new Uint8Array(0),
891
+ new Uint8Array(0),
892
+ new Uint8Array(0),
893
+ new Uint8Array(0),
894
+ new Uint8Array(0),
895
+ new Uint8Array(0),
896
+ new Uint8Array(0),
897
+ new Uint8Array(0),
898
+ new Uint8Array(0),
899
+ new Uint8Array(0),
900
+ new Uint8Array(0),
901
+ new Uint8Array(0),
902
+ new Uint8Array(0),
903
+ new Uint8Array(0),
904
+ new Uint8Array(0),
905
+ new Uint8Array(0),
906
+ new Uint8Array(0),
907
+ new Uint8Array(0),
908
+ new Uint8Array(0),
909
+ new Uint8Array(0),
910
+ new Uint8Array(0),
911
+ new Uint8Array(0),
912
+ new Uint8Array(0),
913
+ new Uint8Array(0),
914
+ new Uint8Array(0),
915
+ new Uint8Array(0),
916
+ new Uint8Array(0),
917
+ new Uint8Array(0),
918
+ new Uint8Array(0),
919
+ new Uint8Array(0),
920
+ new Uint8Array(0),
921
+ new Uint8Array(0),
922
+ new Uint8Array(0),
923
+ new Uint8Array(0),
924
+ new Uint8Array(0),
925
+ new Uint8Array(0),
926
+ new Uint8Array(0),
927
+ new Uint8Array(0),
928
+ new Uint8Array(0),
929
+ new Uint8Array(0),
930
+ new Uint8Array(0),
931
+ new Uint8Array(0),
932
+ new Uint8Array(0),
933
+ new Uint8Array(0),
934
+ new Uint8Array(0),
935
+ new Uint8Array(0),
936
+ new Uint8Array(0),
937
+ new Uint8Array(0),
938
+ new Uint8Array(0),
939
+ new Uint8Array(0),
940
+ new Uint8Array(0),
941
+ new Uint8Array(0),
942
+ new Uint8Array(0),
943
+ new Uint8Array(0),
944
+ new Uint8Array(0),
945
+ new Uint8Array(0),
946
+ new Uint8Array(0),
947
+ new Uint8Array(0),
948
+ new Uint8Array(0),
949
+ new Uint8Array(0),
950
+ new Uint8Array(0),
951
+ new Uint8Array(0),
952
+ new Uint8Array(0),
953
+ new Uint8Array(0),
954
+ new Uint8Array(0),
955
+ new Uint8Array(0),
956
+ new Uint8Array(0),
957
+ new Uint8Array(0),
958
+ new Uint8Array(0),
959
+ new Uint8Array(0),
960
+ new Uint8Array(0),
961
+ new Uint8Array(0),
962
+ new Uint8Array(0),
963
+ new Uint8Array(0),
964
+ new Uint8Array(0),
965
+ new Uint8Array(0),
966
+ new Uint8Array(0),
967
+ new Uint8Array(0),
968
+ new Uint8Array(0),
969
+ new Uint8Array(0),
970
+ new Uint8Array(0),
971
+ new Uint8Array(0),
972
+ new Uint8Array(0),
973
+ new Uint8Array(0),
974
+ new Uint8Array(0),
975
+ new Uint8Array(0),
976
+ new Uint8Array(0),
977
+ new Uint8Array(0),
978
+ new Uint8Array(0),
979
+ new Uint8Array(0),
980
+ new Uint8Array(0),
981
+ new Uint8Array(0),
982
+ new Uint8Array(0),
983
+ new Uint8Array(0),
984
+ new Uint8Array(0),
985
+ new Uint8Array(0),
986
+ new Uint8Array(0),
987
+ ]),
988
+ toReplace: $.varRef(init?.toReplace ?? null),
989
+ };
990
+ }
991
+ clone() {
992
+ const cloned = new byteStringReplacer();
993
+ cloned._fields = {
994
+ replacements: $.varRef(this._fields.replacements.value),
995
+ toReplace: $.varRef(this._fields.toReplace.value),
996
+ };
997
+ return cloned;
998
+ }
999
+ Replace(s) {
1000
+ const r = this;
1001
+ let newSize = $.len(s);
1002
+ let anyChanges = false;
1003
+ if ($.len(r.toReplace) * 8 <= $.len(s)) {
1004
+ // The -1 is because we are replacing 1 byte with len(replacements[b]) bytes.
1005
+ for (let _i = 0; _i < $.len(r.toReplace); _i++) {
1006
+ const x = r.toReplace[_i];
1007
+ {
1008
+ // The -1 is because we are replacing 1 byte with len(replacements[b]) bytes.
1009
+ {
1010
+ let c = Count(s, x);
1011
+ if (c != 0) {
1012
+ // The -1 is because we are replacing 1 byte with len(replacements[b]) bytes.
1013
+ newSize += c * ($.len(r.replacements[$.indexString(x, 0)]) - 1);
1014
+ anyChanges = true;
1015
+ }
1016
+ }
1017
+ }
1018
+ }
1019
+ }
1020
+ else {
1021
+ // See above for explanation of -1
1022
+ for (let i = 0; i < $.len(s); i++) {
1023
+ let b = $.indexString(s, i);
1024
+ // See above for explanation of -1
1025
+ if (r.replacements[b] != null) {
1026
+ // See above for explanation of -1
1027
+ newSize += $.len(r.replacements[b]) - 1;
1028
+ anyChanges = true;
1029
+ }
1030
+ }
1031
+ }
1032
+ if (!anyChanges) {
1033
+ return s;
1034
+ }
1035
+ let buf = new Uint8Array(newSize);
1036
+ let j = 0;
1037
+ for (let i = 0; i < $.len(s); i++) {
1038
+ let b = $.indexString(s, i);
1039
+ if (r.replacements[b] != null) {
1040
+ j += copy(buf.subarray(j), r.replacements[b]);
1041
+ }
1042
+ else {
1043
+ buf[j] = b;
1044
+ j++;
1045
+ }
1046
+ }
1047
+ return $.bytesToString(buf);
1048
+ }
1049
+ WriteString(w, s) {
1050
+ const r = this;
1051
+ let sw = getStringWriter(w);
1052
+ let last = 0;
1053
+ let n = 0;
1054
+ let err = null;
1055
+ for (let i = 0; i < $.len(s); i++) {
1056
+ let b = $.indexString(s, i);
1057
+ if (r.replacements[b] == null) {
1058
+ continue;
1059
+ }
1060
+ if (last != i) {
1061
+ let [nw, err] = sw.WriteString($.sliceString(s, last, i));
1062
+ n += nw;
1063
+ if (err != null) {
1064
+ return [n, err];
1065
+ }
1066
+ }
1067
+ last = i + 1;
1068
+ let [nw, err] = w.Write(r.replacements[b]);
1069
+ n += nw;
1070
+ if (err != null) {
1071
+ return [n, err];
1072
+ }
1073
+ }
1074
+ if (last != $.len(s)) {
1075
+ let [nw, err] = sw.WriteString($.sliceString(s, last, undefined));
1076
+ n += nw;
1077
+ }
1078
+ return [n, err];
1079
+ }
1080
+ // Register this type with the runtime type system
1081
+ static __typeInfo = $.registerStructType('byteStringReplacer', new byteStringReplacer(), [
1082
+ {
1083
+ name: 'Replace',
1084
+ args: [{ name: 's', type: { kind: $.TypeKind.Basic, name: 'string' } }],
1085
+ returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }],
1086
+ },
1087
+ {
1088
+ name: 'WriteString',
1089
+ args: [
1090
+ { name: 'w', type: 'Writer' },
1091
+ { name: 's', type: { kind: $.TypeKind.Basic, name: 'string' } },
1092
+ ],
1093
+ returns: [
1094
+ { type: { kind: $.TypeKind.Basic, name: 'number' } },
1095
+ {
1096
+ type: {
1097
+ kind: $.TypeKind.Interface,
1098
+ name: 'GoError',
1099
+ methods: [
1100
+ {
1101
+ name: 'Error',
1102
+ args: [],
1103
+ returns: [
1104
+ { type: { kind: $.TypeKind.Basic, name: 'string' } },
1105
+ ],
1106
+ },
1107
+ ],
1108
+ },
1109
+ },
1110
+ ],
1111
+ },
1112
+ ], byteStringReplacer, {
1113
+ replacements: {
1114
+ kind: $.TypeKind.Array,
1115
+ length: 256,
1116
+ elemType: {
1117
+ kind: $.TypeKind.Slice,
1118
+ elemType: { kind: $.TypeKind.Basic, name: 'number' },
1119
+ },
1120
+ },
1121
+ toReplace: {
1122
+ kind: $.TypeKind.Slice,
1123
+ elemType: { kind: $.TypeKind.Basic, name: 'string' },
1124
+ },
1125
+ });
1126
+ }
1127
+ let countCutOff = 8;
1128
+ // Helper function to copy bytes
1129
+ function copy(dst, src) {
1130
+ const n = Math.min(dst.length, src.length);
1131
+ for (let i = 0; i < n; i++) {
1132
+ dst[i] = src[i];
1133
+ }
1134
+ return n;
1135
+ }
1136
+ //# sourceMappingURL=replace.js.map