functionalscript 0.3.10 → 0.3.12

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 (54) hide show
  1. package/README.md +1 -0
  2. package/bnf/djs/module.f.d.ts +11 -0
  3. package/bnf/djs/module.f.js +6 -0
  4. package/bnf/djs/test.f.d.ts +1 -0
  5. package/bnf/djs/test.f.js +221 -0
  6. package/bnf/module.f.d.ts +135 -0
  7. package/bnf/module.f.js +142 -0
  8. package/bnf/test.f.d.ts +65 -0
  9. package/bnf/test.f.js +368 -0
  10. package/crypto/prime_field/module.f.d.ts +1 -4
  11. package/crypto/secp/module.f.d.ts +2 -2
  12. package/dev/test/module.f.js +2 -1
  13. package/fsc/module.f.js +5 -6
  14. package/fsm/module.f.d.ts +9 -9
  15. package/fsm/module.f.js +13 -22
  16. package/html/module.f.js +1 -2
  17. package/issues/31-json.f.d.ts +1 -0
  18. package/issues/31-json.f.js +241 -0
  19. package/js/tokenizer/module.f.js +6 -1
  20. package/nanvm-lib/tests/test.f.d.ts +4 -0
  21. package/nanvm-lib/tests/test.f.js +5 -7
  22. package/nodejs/version/module.f.d.ts +1 -1
  23. package/package.json +1 -1
  24. package/text/module.f.js +3 -3
  25. package/text/utf16/module.f.d.ts +11 -5
  26. package/text/utf16/module.f.js +2 -0
  27. package/text/utf16/test.f.js +8 -1
  28. package/types/btree/find/module.f.d.ts +2 -2
  29. package/types/btree/remove/module.f.d.ts +4 -4
  30. package/types/btree/remove/module.f.js +9 -11
  31. package/types/btree/remove/test.f.js +2 -2
  32. package/types/btree/set/module.f.d.ts +3 -3
  33. package/types/byte_set/test.f.js +31 -31
  34. package/types/function/module.f.d.ts +1 -1
  35. package/types/range_map/module.f.d.ts +79 -2
  36. package/types/range_map/module.f.js +49 -2
  37. package/types/range_map/test.f.d.ts +1 -0
  38. package/types/range_map/test.f.js +76 -33
  39. package/types/result/module.f.d.ts +48 -1
  40. package/types/result/module.f.js +40 -2
  41. package/types/result/test.f.d.ts +4 -0
  42. package/types/result/test.f.js +18 -0
  43. package/types/sorted_list/module.f.js +8 -7
  44. package/types/sorted_set/module.f.d.ts +28 -0
  45. package/types/sorted_set/test.f.d.ts +1 -0
  46. package/types/sorted_set/test.f.js +19 -0
  47. package/types/string/module.f.d.ts +17 -0
  48. package/types/string/module.f.js +17 -0
  49. package/types/string/test.f.d.ts +1 -0
  50. package/types/string/test.f.js +15 -0
  51. package/types/string_set/module.f.d.ts +21 -0
  52. package/types/string_set/module.f.js +21 -0
  53. package/types/string_set/test.f.d.ts +1 -0
  54. package/types/string_set/test.f.js +18 -1
package/bnf/test.f.js ADDED
@@ -0,0 +1,368 @@
1
+ import { firstSet, setOp } from "./module.f.js";
2
+ import * as j from "../json/module.f.js";
3
+ import { sort } from "../types/object/module.f.js";
4
+ const stringify = j.stringify(sort);
5
+ const eq = (a, e) => () => {
6
+ const r = stringify(firstSet(a));
7
+ if (r !== e) {
8
+ throw [r, e];
9
+ }
10
+ };
11
+ // https://www.json.org/json-en.html
12
+ const classic = () => {
13
+ // {"empty":true,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32]]}
14
+ const ws = () => ({ or: [
15
+ [],
16
+ ['\t', ws], // 9
17
+ ['\n', ws], // 10
18
+ ['\r', ws], // 13
19
+ [' ', ws], // 32
20
+ ] });
21
+ // {"empty":true,"map":[[false,42],[true,43],[false,44],[true,45]]}
22
+ const sign = { or: [
23
+ [],
24
+ '+', // 43
25
+ '-', // 45
26
+ ] };
27
+ // {"empty":false,"map":[[false,48],[true,57]]}
28
+ const onenine = [0x31, 0x39];
29
+ // {"empty":false,"map":[[false,47],[true,57]]}
30
+ const digit = { or: [
31
+ '0',
32
+ onenine,
33
+ ] };
34
+ // {"empty":false,"map":[[false,47],[true,57]]}
35
+ const digits = () => ({ or: [
36
+ digit,
37
+ [digit, digits]
38
+ ] });
39
+ // {"empty":true,"map":[[false,68],[true,69],[false,100],[true,101]]}
40
+ const exponent = { or: [
41
+ [],
42
+ ['E', sign, digits], // 69
43
+ ['e', sign, digits], // 101
44
+ ] };
45
+ // {"empty":true,"map":[[false,45],[true,46]]}
46
+ const fraction = { or: [
47
+ [],
48
+ ['.', digits] // 46
49
+ ] };
50
+ // {"empty":false,"map":[[false,44],[true,45],[false,47],[true,57]]}
51
+ const integer = { or: [
52
+ digit, // 48-57
53
+ [onenine, digits],
54
+ ['-', digit], // 45
55
+ ['-', onenine, digits],
56
+ ] };
57
+ // {"empty":false,"map":[[false,44],[true,45],[false,47],[true,57]]}
58
+ const number = [integer, fraction, exponent];
59
+ // {"empty":false,"map":[[false,47],[true,57],[false,64],[true,70],[false,96],[true,102]]}
60
+ const hex = { or: [
61
+ digit, // 48-57
62
+ [0x41, 0x46], // A..F
63
+ [0x61, 0x66], // a..f
64
+ ] };
65
+ // {"empty":false,"map":[[false,33],[true,34],[false,46],[true,47],[false,91],[true,92],[false,97],[true,98],[false,101],[true,102],[false,109],[true,110],[false,113],[true,114],[false,115],[true,117]]}
66
+ const escape = { or: [
67
+ '"', // 34
68
+ '/', // 47
69
+ '\\', // 92
70
+ 'b', // 98
71
+ 'f', // 102
72
+ 'n', // 110
73
+ 'r', // 114
74
+ 't', // 116
75
+ ['u', hex, hex, hex, hex] // 117
76
+ ] };
77
+ // {"empty":false,"map":[[false,31],[true,33],[false,34],[true,1114111]]}
78
+ const character = { or: [
79
+ [0x20, 0x21], // exclude '"' 0x22
80
+ [0x23, 0x5B], // exclude '\' 0x5C
81
+ [0x5D, 0x10FFFF], // 93-1114111
82
+ ['\\', escape], // 92
83
+ ] };
84
+ // {"empty":true,"map":[[false,31],[true,33],[false,34],[true,1114111]]}
85
+ const characters = () => ({ or: [
86
+ [],
87
+ [character, characters]
88
+ ] });
89
+ // {"empty":false,"map":[[false,33],[true,34]]}
90
+ const string = ['"', characters, '"'];
91
+ // {"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}
92
+ const element = () => [ws, value, ws];
93
+ // {"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}
94
+ const elements = () => ({ or: [
95
+ element,
96
+ [element, ',', elements]
97
+ ] });
98
+ // {"empty":false,"map":[[false,90],[true,91]]}
99
+ const array = { or: [
100
+ ['[', ws, ']'], // 91
101
+ ['[', elements, ']'],
102
+ ] };
103
+ // {"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34]]}
104
+ const member = [ws, string, ws, ':', element];
105
+ // {"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34]]}
106
+ const members = () => ({ or: [
107
+ member,
108
+ [member, ',', members],
109
+ ] });
110
+ // {"empty":false,"map":[[false,122],[true,123]]}
111
+ const object = { or: [
112
+ ['{', ws, '}'], // 123
113
+ ['{', members, '}'],
114
+ ] };
115
+ // {"empty":false,"map":[[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}
116
+ const value = { or: [
117
+ object, // 123
118
+ array, // 91
119
+ string, // 34
120
+ number, // 45, 48-57
121
+ 'true', // 116
122
+ 'false', // 102
123
+ 'null', // 110
124
+ ] };
125
+ // {"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}
126
+ const json = element;
127
+ return {
128
+ ws: eq(ws, '{"empty":true,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32]]}'),
129
+ sign: eq(sign, '{"empty":true,"map":[[false,42],[true,43],[false,44],[true,45]]}'),
130
+ digits: eq(digits, '{"empty":false,"map":[[false,47],[true,57]]}'),
131
+ exponent: eq(exponent, '{"empty":true,"map":[[false,68],[true,69],[false,100],[true,101]]}'),
132
+ fraction: eq(fraction, '{"empty":true,"map":[[false,45],[true,46]]}'),
133
+ onenine: eq(onenine, '{"empty":false,"map":[[false,48],[true,57]]}'),
134
+ digit: eq(digit, '{"empty":false,"map":[[false,47],[true,57]]}'),
135
+ string: eq(string, '{"empty":false,"map":[[false,33],[true,34]]}'),
136
+ member: eq(member, '{"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34]]}'),
137
+ members: eq(members, '{"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34]]}'),
138
+ object: eq(object, '{"empty":false,"map":[[false,122],[true,123]]}'),
139
+ array: eq(array, '{"empty":false,"map":[[false,90],[true,91]]}'),
140
+ integer: eq(integer, '{"empty":false,"map":[[false,44],[true,45],[false,47],[true,57]]}'),
141
+ number: eq(number, '{"empty":false,"map":[[false,44],[true,45],[false,47],[true,57]]}'),
142
+ value: eq(value, '{"empty":false,"map":[[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}'),
143
+ element: eq(element, '{"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}'),
144
+ elements: eq(elements, '{"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}'),
145
+ json: eq(json, '{"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}'),
146
+ hex: eq(hex, '{"empty":false,"map":[[false,47],[true,57],[false,64],[true,70],[false,96],[true,102]]}'),
147
+ escape: eq(escape, '{"empty":false,"map":[[false,33],[true,34],[false,46],[true,47],[false,91],[true,92],[false,97],[true,98],[false,101],[true,102],[false,109],[true,110],[false,113],[true,114],[false,115],[true,117]]}'),
148
+ character: eq(character, '{"empty":false,"map":[[false,31],[true,33],[false,34],[true,1114111]]}'),
149
+ characters: eq(characters, '{"empty":true,"map":[[false,31],[true,33],[false,34],[true,1114111]]}'),
150
+ };
151
+ };
152
+ const deterministic = () => {
153
+ // {"empty":true,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32]]}
154
+ const ws = () => ({ or: [
155
+ [],
156
+ ['\t', ws], // 9
157
+ ['\n', ws], // 10
158
+ ['\r', ws], // 13
159
+ [' ', ws], // 32
160
+ ] });
161
+ // {"empty":true,"map":[[false,42],[true,43],[false,44],[true,45]]}
162
+ const sign = { or: [
163
+ [],
164
+ '+', // 43
165
+ '-', // 45
166
+ ] };
167
+ // {"empty":false,"map":[[false,48],[true,57]]}
168
+ const onenine = [0x31, 0x39];
169
+ // {"empty":false,"map":[[false,47],[true,57]]}
170
+ const digit = { or: [
171
+ '0',
172
+ onenine,
173
+ ] };
174
+ // {"empty":true,"map":[[false,47],[true,57]]}
175
+ const digits1 = () => ({ or: [
176
+ [],
177
+ [digit, digits1]
178
+ ]
179
+ });
180
+ // {"empty":false,"map":[[false,47],[true,57]]}
181
+ const digits = [digit, digits1];
182
+ // {"empty":true,"map":[[false,68],[true,69],[false,100],[true,101]]}
183
+ const exponent = { or: [
184
+ [],
185
+ ['E', sign, digits], // 69
186
+ ['e', sign, digits], // 101
187
+ ] };
188
+ // {"empty":true,"map":[[false,45],[true,46]]}
189
+ const fraction = { or: [
190
+ [],
191
+ ['.', digits] // 46
192
+ ] };
193
+ // {"empty":false,"map":[[false,47],[true,57]]}
194
+ const integer1 = { or: [
195
+ '0', // 48
196
+ [onenine, digits1], // 49-57
197
+ ] };
198
+ // {"empty":false,"map":[[false,44],[true,45],[false,47],[true,57]]}
199
+ const integer = { or: [
200
+ integer1, // 48-57
201
+ ['-', integer1], // 45
202
+ ] };
203
+ // {"empty":false,"map":[[false,44],[true,45],[false,47],[true,57]]}
204
+ const number = [integer, fraction, exponent];
205
+ // {"empty":false,"map":[[false,47],[true,57],[false,64],[true,70],[false,96],[true,102]]}
206
+ const hex = { or: [
207
+ digit, // 48-57
208
+ [0x41, 0x46], // A..F
209
+ [0x61, 0x66], // a..f
210
+ ] };
211
+ // {"empty":false,"map":[[false,33],[true,34],[false,46],[true,47],[false,91],[true,92],[false,97],[true,98],[false,101],[true,102],[false,109],[true,110],[false,113],[true,114],[false,115],[true,117]]}
212
+ const escape = { or: [
213
+ '"', // 34
214
+ '/', // 47
215
+ '\\', // 92
216
+ 'b', // 98
217
+ 'f', // 102
218
+ 'n', // 110
219
+ 'r', // 114
220
+ 't', // 116
221
+ ['u', hex, hex, hex, hex] // 117
222
+ ] };
223
+ // {"empty":false,"map":[[false,31],[true,33],[false,34],[true,1114111]]}
224
+ const character = { or: [
225
+ [0x20, 0x21], // exclude '"' 0x22
226
+ [0x23, 0x5B], // exclude '\' 0x5C
227
+ [0x5D, 0x10FFFF], // 93-1114111
228
+ ['\\', escape], // 92
229
+ ] };
230
+ // {"empty":true,"map":[[false,31],[true,33],[false,34],[true,1114111]]}
231
+ const characters = () => ({ or: [
232
+ [],
233
+ [character, characters]
234
+ ] });
235
+ // {"empty":false,"map":[[false,33],[true,34]]}
236
+ const string = ['"', characters, '"'];
237
+ // {"empty":false,"map":[[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}
238
+ const element1 = () => [value, ws];
239
+ // {"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}
240
+ const element = [ws, element1];
241
+ // {"empty":true,"map":[[false,43],[true,44]]}
242
+ const elements2 = () => ({ or: [
243
+ [],
244
+ [',', elements] // 44
245
+ ] });
246
+ // {"empty":false,"map":[[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}
247
+ const elements1 = [element1, elements2];
248
+ // {"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}
249
+ const elements = [ws, elements1];
250
+ // {"empty":false,"map":[[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,92],[true,93],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}
251
+ const array1 = { or: [
252
+ [']'], // 93
253
+ [elements1, ']'],
254
+ ] };
255
+ // {"empty":false,"map":[[false,90],[true,91]]}
256
+ const array = ['[', ws, array1];
257
+ // {"empty":false,"map":[[false,33],[true,34]]}
258
+ const member1 = [string, ws, ':', element];
259
+ // {"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34]]}
260
+ const member = [ws, member1];
261
+ // {"empty":true,"map":[[false,43],[true,44]]}
262
+ const members2 = () => ({ or: [
263
+ [],
264
+ [',', members], // 44
265
+ ] });
266
+ // {"empty":false,"map":[[false,33],[true,34]]}
267
+ const members1 = [member1, members2];
268
+ // {"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34]]}
269
+ const members = [ws, members1];
270
+ // {"empty":false,"map":[[false,33],[true,34],[false,124],[true,125]]}
271
+ const object1 = { or: [
272
+ ['}'], // 125
273
+ [members1, '}'],
274
+ ] };
275
+ // {"empty":false,"map":[[false,122],[true,123]]}
276
+ const object = ['{', ws, object1];
277
+ // {"empty":false,"map":[[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}
278
+ const value = { or: [
279
+ object, // 123
280
+ array, // 91
281
+ string, // 34
282
+ number, // 45, 48-57
283
+ 'true', // 116
284
+ 'false', // 102
285
+ 'null', // 110
286
+ ] };
287
+ // {"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}
288
+ const json = element;
289
+ return {
290
+ ws: eq(ws, '{"empty":true,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32]]}'),
291
+ sign: eq(sign, '{"empty":true,"map":[[false,42],[true,43],[false,44],[true,45]]}'),
292
+ digits1: eq(digits1, '{"empty":true,"map":[[false,47],[true,57]]}'),
293
+ digits: eq(digits, '{"empty":false,"map":[[false,47],[true,57]]}'),
294
+ exponent: eq(exponent, '{"empty":true,"map":[[false,68],[true,69],[false,100],[true,101]]}'),
295
+ fraction: eq(fraction, '{"empty":true,"map":[[false,45],[true,46]]}'),
296
+ onenine: eq(onenine, '{"empty":false,"map":[[false,48],[true,57]]}'),
297
+ digit: eq(digit, '{"empty":false,"map":[[false,47],[true,57]]}'),
298
+ string: eq(string, '{"empty":false,"map":[[false,33],[true,34]]}'),
299
+ member1: eq(member1, '{"empty":false,"map":[[false,33],[true,34]]}'),
300
+ member: eq(member, '{"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34]]}'),
301
+ members2: eq(members2, '{"empty":true,"map":[[false,43],[true,44]]}'),
302
+ members1: eq(members1, '{"empty":false,"map":[[false,33],[true,34]]}'),
303
+ members: eq(members, '{"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34]]}'),
304
+ object1: eq(object1, '{"empty":false,"map":[[false,33],[true,34],[false,124],[true,125]]}'),
305
+ object: eq(object, '{"empty":false,"map":[[false,122],[true,123]]}'),
306
+ array1: eq(array1, '{"empty":false,"map":[[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,92],[true,93],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}'),
307
+ array: eq(array, '{"empty":false,"map":[[false,90],[true,91]]}'),
308
+ integer1: eq(integer1, '{"empty":false,"map":[[false,47],[true,57]]}'),
309
+ integer: eq(integer, '{"empty":false,"map":[[false,44],[true,45],[false,47],[true,57]]}'),
310
+ number: eq(number, '{"empty":false,"map":[[false,44],[true,45],[false,47],[true,57]]}'),
311
+ value: eq(value, '{"empty":false,"map":[[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}'),
312
+ element1: eq(element1, '{"empty":false,"map":[[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}'),
313
+ element: eq(element, '{"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}'),
314
+ elements2: eq(elements2, '{"empty":true,"map":[[false,43],[true,44]]}'),
315
+ elements1: eq(elements1, '{"empty":false,"map":[[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}'),
316
+ elements: eq(elements, '{"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}'),
317
+ json: eq(json, '{"empty":false,"map":[[false,8],[true,10],[false,12],[true,13],[false,31],[true,32],[false,33],[true,34],[false,44],[true,45],[false,47],[true,57],[false,90],[true,91],[false,101],[true,102],[false,109],[true,110],[false,115],[true,116],[false,122],[true,123]]}'),
318
+ hex: eq(hex, '{"empty":false,"map":[[false,47],[true,57],[false,64],[true,70],[false,96],[true,102]]}'),
319
+ escape: eq(escape, '{"empty":false,"map":[[false,33],[true,34],[false,46],[true,47],[false,91],[true,92],[false,97],[true,98],[false,101],[true,102],[false,109],[true,110],[false,113],[true,114],[false,115],[true,117]]}'),
320
+ character: eq(character, '{"empty":false,"map":[[false,31],[true,33],[false,34],[true,1114111]]}'),
321
+ characters: eq(characters, '{"empty":true,"map":[[false,31],[true,33],[false,34],[true,1114111]]}'),
322
+ };
323
+ };
324
+ //
325
+ export default {
326
+ example: {
327
+ module: () => {
328
+ const grammar = [
329
+ { or: [[65, 90], [97, 122], [48, 57]] }, // Matches 'A-Z', 'a-z', and '0-9'
330
+ ];
331
+ const s = firstSet(grammar);
332
+ if (s.empty) {
333
+ throw s;
334
+ }
335
+ if (setOp.get('0'.codePointAt(0))(s.map) !== true) {
336
+ throw s;
337
+ }
338
+ if (setOp.get('h'.codePointAt(0))(s.map) !== true) {
339
+ throw s;
340
+ }
341
+ if (setOp.get('$'.codePointAt(0))(s.map) !== false) {
342
+ throw s;
343
+ }
344
+ },
345
+ types: () => {
346
+ const alpha = [65, 90]; // Matches 'A-Z'
347
+ const id2 = [alpha, alpha]; // Matches two uppercase letters
348
+ const digit = [48, 57]; // Matches '0-9'
349
+ // Matches two uppercase letters or one digit
350
+ const id2OrDigit = { or: [
351
+ id2,
352
+ digit,
353
+ ] };
354
+ // Matches 'true', 'false'
355
+ const bool = { or: [
356
+ 'true',
357
+ 'false',
358
+ ] };
359
+ const id = () => [alpha, { or: [
360
+ [], // Empty
361
+ id // Recursive
362
+ ] }];
363
+ const _ = [id2OrDigit, bool, id];
364
+ }
365
+ },
366
+ classic,
367
+ deterministic,
368
+ };
@@ -1,6 +1,4 @@
1
- import type * as Operator from '../../types/function/operator/module.f.ts';
2
- type Reduce = Operator.Reduce<bigint>;
3
- type Unary = Operator.Unary<bigint, bigint>;
1
+ import type { Unary, Reduce } from '../../types/bigint/module.f.ts';
4
2
  /**
5
3
  * A type representing a prime field and its associated operations.
6
4
  */
@@ -40,4 +38,3 @@ export declare const prime_field: (p: bigint) => PrimeField;
40
38
  * ```
41
39
  */
42
40
  export declare const sqrt: ({ p, mul, pow }: PrimeField) => (a: bigint) => bigint | null;
43
- export {};
@@ -1,4 +1,4 @@
1
- import type * as Operator from '../../types/function/operator/module.f.ts';
1
+ import type { Reduce } from '../../types/function/operator/module.f.ts';
2
2
  import { type PrimeField } from '../prime_field/module.f.ts';
3
3
  /**
4
4
  * A 2D point represented as a pair of `bigint` values `[x, y]`.
@@ -27,7 +27,7 @@ type Curve = {
27
27
  readonly y2: (x: bigint) => bigint;
28
28
  readonly y: (x: bigint) => bigint | null;
29
29
  readonly neg: (a: Point) => Point;
30
- readonly add: Operator.Reduce<Point>;
30
+ readonly add: Reduce<Point>;
31
31
  readonly mul: (a: Point) => (n: bigint) => Point;
32
32
  };
33
33
  /**
@@ -23,7 +23,8 @@ export default (input) => {
23
23
  if (v.length === 0) {
24
24
  const [[s, r], delta, state0] = measure(() => tryCatch(v))(state);
25
25
  state = state0;
26
- if (s === 'error') {
26
+ // Usual tests throw on error, but if the function name is 'throw', then the test passes if it throws.
27
+ if ((s === 'error') === (v.name !== 'throw')) {
27
28
  ts = addFail(delta)(ts);
28
29
  if (isGitHub) {
29
30
  // https://docs.github.com/en/actions/learn-github-actions/workflow-commands-for-github-actions
package/fsc/module.f.js CHANGED
@@ -1,15 +1,13 @@
1
- import * as operator from "../types/function/operator/module.f.js";
1
+ import { strictEqual } from "../types/function/operator/module.f.js";
2
2
  import { merge as rangeMapMerge, fromRange, get, } from "../types/range_map/module.f.js";
3
- import * as list from "../types/list/module.f.js";
4
- const { reduce: listReduce } = list;
3
+ import { reduce as listReduce, toArray, map } from "../types/list/module.f.js";
5
4
  import { range as asciiRange } from "../text/ascii/module.f.js";
6
5
  import { fn } from "../types/function/module.f.js";
7
6
  import { one } from "../types/range/module.f.js";
8
- const { toArray, map } = list;
9
7
  const fromCharCode = String.fromCharCode;
10
8
  const unexpectedSymbol = codePoint => [[`unexpected symbol ${codePoint}`], unexpectedSymbol];
11
9
  const def = () => unexpectedSymbol;
12
- const union = a => b => {
10
+ const union = (a) => (b) => {
13
11
  if (a === def || a === b) {
14
12
  return b;
15
13
  }
@@ -22,7 +20,8 @@ const empty = [];
22
20
  const reduce = (a) => {
23
21
  const merge = rangeMapMerge({
24
22
  union,
25
- equal: operator.strictEqual,
23
+ equal: strictEqual,
24
+ def,
26
25
  });
27
26
  return toArray(listReduce(merge)(empty)(a));
28
27
  };
package/fsm/module.f.d.ts CHANGED
@@ -1,13 +1,13 @@
1
- import * as list from '../types/list/module.f.ts';
2
- import * as byteSet from '../types/byte_set/module.f.ts';
3
- import * as rangeMap from '../types/range_map/module.f.ts';
4
- type Rule = readonly [string, byteSet.ByteSet, string];
5
- export type Grammar = list.List<Rule>;
1
+ import { type List } from '../types/list/module.f.ts';
2
+ import { type ByteSet } from '../types/byte_set/module.f.ts';
3
+ import { type RangeMapArray } from '../types/range_map/module.f.ts';
4
+ type Rule = readonly [string, ByteSet, string];
5
+ export type Grammar = List<Rule>;
6
6
  type Dfa = {
7
- readonly [state in string]: rangeMap.RangeMapArray<string>;
7
+ readonly [state in string]: RangeMapArray<string>;
8
8
  };
9
- export declare const toRange: (s: string) => byteSet.ByteSet;
10
- export declare const toUnion: (s: string) => byteSet.ByteSet;
9
+ export declare const toRange: (s: string) => ByteSet;
10
+ export declare const toUnion: (s: string) => ByteSet;
11
11
  export declare const dfa: (grammar: Grammar) => Dfa;
12
- export declare const run: (dfa: Dfa) => (input: list.List<number>) => list.List<string>;
12
+ export declare const run: (dfa: Dfa) => (input: List<number>) => List<string>;
13
13
  export {};
package/fsm/module.f.js CHANGED
@@ -1,32 +1,23 @@
1
- import * as list from "../types/list/module.f.js";
2
- const { equal, isEmpty, fold, toArray, scan, foldScan, empty: emptyList } = list;
3
- import * as byteSet from "../types/byte_set/module.f.js";
4
- const { toRangeMap, union: byteSetUnion, one, empty } = byteSet;
5
- import * as sortedSet from "../types/sorted_set/module.f.js";
6
- const { intersect, union: sortedSetUnion } = sortedSet;
7
- import * as rangeMap from "../types/range_map/module.f.js";
8
- const { merge } = rangeMap;
9
- import * as cmp from "../types/function/compare/module.f.js";
10
- const { unsafeCmp } = cmp;
11
- import * as operator from "../types/function/operator/module.f.js";
12
- const { strictEqual } = operator;
13
- import * as j from "../json/module.f.js";
14
- const { stringify } = j;
15
- import * as f from "../types/function/module.f.js";
16
- const { identity } = f;
17
- import * as utf16 from "../text/utf16/module.f.js";
18
- const { stringToList } = utf16;
1
+ import { equal, isEmpty, fold, toArray, scan, foldScan, empty as emptyList } from "../types/list/module.f.js";
2
+ import { toRangeMap, union as byteSetUnion, one, empty, range } from "../types/byte_set/module.f.js";
3
+ import { intersect, union as sortedSetUnion } from "../types/sorted_set/module.f.js";
4
+ import { merge, get as rangeMapGet } from "../types/range_map/module.f.js";
5
+ import { unsafeCmp } from "../types/function/compare/module.f.js";
6
+ import { strictEqual } from "../types/function/operator/module.f.js";
7
+ import { stringify } from "../json/module.f.js";
8
+ import { identity } from "../types/function/module.f.js";
9
+ import { stringToList } from "../text/utf16/module.f.js";
19
10
  const stringifyIdentity = stringify(identity);
20
11
  export const toRange = s => {
21
12
  const [b, e] = toArray(stringToList(s));
22
- return byteSet.range([b, e]);
13
+ return range([b, e]);
23
14
  };
24
15
  const toUnionOp = i => bs => byteSetUnion(bs)(one(i));
25
16
  export const toUnion = s => {
26
17
  const codePoints = stringToList(s);
27
18
  return fold(toUnionOp)(empty)(codePoints);
28
19
  };
29
- const mergeOp = { union: sortedSetUnion(unsafeCmp), equal: equal(strictEqual) };
20
+ const mergeOp = { union: sortedSetUnion(unsafeCmp), equal: equal(strictEqual), def: [] };
30
21
  const hasState = s => set => !isEmpty(intersect(unsafeCmp)([s])(set));
31
22
  const foldOp = set => ([ruleIn, bs, ruleOut]) => rm => {
32
23
  if (hasState(ruleIn)(set)) {
@@ -54,6 +45,6 @@ const emptyStateStringify = stringifyIdentity(emptyState);
54
45
  const initialState = [''];
55
46
  const initialStateStringify = stringifyIdentity(initialState);
56
47
  export const dfa = grammar => addEntry(grammar)(initialState)({});
57
- const get = rangeMap.get(emptyStateStringify);
48
+ const get = rangeMapGet(emptyStateStringify);
58
49
  const runOp = dfa => input => s => get(input)(dfa[s]);
59
- export const run = dfa => input => foldScan(runOp(dfa))(initialStateStringify)(input);
50
+ export const run = (dfa) => (input) => foldScan(runOp(dfa))(initialStateStringify)(input);
package/html/module.f.js CHANGED
@@ -1,8 +1,7 @@
1
1
  import { map, flatMap, flat, concat as listConcat } from "../types/list/module.f.js";
2
2
  import { concat as stringConcat } from "../types/string/module.f.js";
3
3
  import { compose } from "../types/function/module.f.js";
4
- import * as utf16 from "../text/utf16/module.f.js";
5
- const { stringToList } = utf16;
4
+ import { stringToList } from "../text/utf16/module.f.js";
6
5
  const { fromCharCode } = String;
7
6
  const { entries } = Object;
8
7
  /**
@@ -0,0 +1 @@
1
+ type TerminalRange = readonly [number, number];