functionalscript 0.3.11 → 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.
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
+ };
@@ -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
@@ -21,6 +21,7 @@ const reduce = (a) => {
21
21
  const merge = rangeMapMerge({
22
22
  union,
23
23
  equal: strictEqual,
24
+ def,
24
25
  });
25
26
  return toArray(listReduce(merge)(empty)(a));
26
27
  };
package/fsm/module.f.js CHANGED
@@ -17,7 +17,7 @@ export const toUnion = s => {
17
17
  const codePoints = stringToList(s);
18
18
  return fold(toUnionOp)(empty)(codePoints);
19
19
  };
20
- const mergeOp = { union: sortedSetUnion(unsafeCmp), equal: equal(strictEqual) };
20
+ const mergeOp = { union: sortedSetUnion(unsafeCmp), equal: equal(strictEqual), def: [] };
21
21
  const hasState = s => set => !isEmpty(intersect(unsafeCmp)([s])(set));
22
22
  const foldOp = set => ([ruleIn, bs, ruleOut]) => rm => {
23
23
  if (hasState(ruleIn)(set)) {
@@ -0,0 +1 @@
1
+ type TerminalRange = readonly [number, number];
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+ // JSON: https://www.json.org/json-en.html
3
+ {
4
+ // null, [0x09, 0x0A], 0x0D, 0x20
5
+ const ws = () => ({ or: [
6
+ [],
7
+ ['\t', ws], // 0x09
8
+ ['\n', ws], // 0x0A
9
+ ['\r', ws], // 0x0D
10
+ [' ', ws], // 0x20
11
+ ] });
12
+ // null, 0x2B, 0x2D
13
+ const sign = { or: [
14
+ [],
15
+ '+', // 0x2B
16
+ '-', // 0x2D
17
+ ] };
18
+ // null, [0x30, 0x39]
19
+ const digits1 = () => ({ or: [
20
+ [],
21
+ digits // [0x30, 0x39]
22
+ ] });
23
+ // [0x30, 0x39]
24
+ const digits = () => [digit, digits1];
25
+ // null, 0x45, 0x65
26
+ const exponent = { or: [
27
+ [],
28
+ ['E', sign, digits], // 0x45
29
+ ['e', sign, digits], // 0x65
30
+ ] };
31
+ // null, 0x2E
32
+ const fraction = { or: [
33
+ [],
34
+ ['.', digits] // 0x2E
35
+ ] };
36
+ // [0x31, 0x39]
37
+ const onenine = [0x31, 0x39];
38
+ // [0x30, 0x39]
39
+ const digit = { or: [
40
+ '0', // 0x30
41
+ onenine, // [0x31, 0x39]
42
+ ] };
43
+ // null, 0x2C
44
+ const members2 = () => ({ or: [
45
+ [],
46
+ [',', ws, members1], // 0x2C
47
+ ] });
48
+ // 0x22
49
+ const members1 = () => [member1, members2];
50
+ // 0x22, 0x7D
51
+ const object1 = { or: [
52
+ [members1, '}'], // 0x22
53
+ '}', // 0x7D
54
+ ] };
55
+ // 0x7B
56
+ const object = ['{', ws, object1];
57
+ // 0x22, 0x2D, [0x30, 0x39], 0x5B, 0x5D, 0x66, 0x6E, 0x74, 0x7B
58
+ const array1 = () => ({ or: [
59
+ [element1, ']'], // 0x22, 0x2D, [0x30, 0x39], 0x5B, 0x66, 0x6E, 0x74, 0x7B
60
+ ']', // 0x5D
61
+ ] });
62
+ // 0x5B
63
+ const array = ['[', ws, array1];
64
+ // [0x30, 0x39], [0x41, 0x46], [0x61, 0x66]
65
+ const hex = { or: [
66
+ digit, // [0x30, 0x39]
67
+ [0x41, 0x46], // A..F
68
+ [0x61, 0x66], // a..f
69
+ ] };
70
+ // 0x22, 0x2F, 0x5C, 0x62, 0x66, 0x6E, 0x72, [0x74, 0x75]
71
+ const escape = { or: [
72
+ '"', // 0x22
73
+ '/', // 0x2F
74
+ '\\', // 0x5C
75
+ 'b', // 0x62
76
+ 'f', // 0x66
77
+ 'n', // 0x6E
78
+ 'r', // 0x72
79
+ 't', // 0x74
80
+ ['u', hex, hex, hex, hex] // 0x75
81
+ ] };
82
+ // [0x20, 0x21], [0x23, 0x10FFFF]
83
+ const character = { or: [
84
+ [0x20, 0x21], // exclude '"' 0x22
85
+ [0x23, 0x5B], // exclude '\' 0x5C
86
+ [0x5D, 0x10FFFF], //
87
+ ['\\', escape], // 0x5C
88
+ ] };
89
+ // null, [0x20, 0x21], [0x23, 0x10FFFF]
90
+ const characters = () => ({ or: [
91
+ [],
92
+ [character, characters]
93
+ ] });
94
+ // 0x22
95
+ const string = ['"', characters, '"'];
96
+ // [0x30, 0x39]
97
+ const integer1 = { or: [
98
+ '0',
99
+ [onenine, digits1],
100
+ ] };
101
+ // 0x2D, [0x30, 0x39]
102
+ const integer = { or: [
103
+ ['-', integer1], // 0x2D
104
+ '0', // 0x30
105
+ [onenine, digits1], // [0x31, 0x39]
106
+ ] };
107
+ // 0x2D, [0x30, 0x39]
108
+ const number = [integer, fraction, exponent];
109
+ // 0x22, 0x2D, [0x30, 0x39], 0x5B, 0x66, 0x6E, 0x74, 0x7B
110
+ const value = { or: [
111
+ string, // 0x22
112
+ number, // 0x2D, [0x30, 0x39]
113
+ array, // 0x5B
114
+ 'false', // 0x66
115
+ 'null', // 0x6E
116
+ 'true', // 0x74
117
+ object, // 0x7B
118
+ ] };
119
+ // 0x22, 0x2D, [0x30, 0x39], 0x5B, 0x66, 0x6E, 0x74, 0x7B
120
+ const element1 = [value, ws];
121
+ // [0x09, 0x0A], 0x0D, 0x20, 0x22, 0x2D, [0x30, 0x39], 0x5B, 0x66, 0x6E, 0x74, 0x7B
122
+ const element = [ws, element1];
123
+ // 0x22
124
+ const member1 = [string, ws, ':', element];
125
+ const json = element;
126
+ }
127
+ // serializable
128
+ {
129
+ //
130
+ const element = { id: 'element' };
131
+ const ws = { id: 'ws' };
132
+ const value = { id: 'value' };
133
+ const object = { id: 'object' };
134
+ const array = { id: 'array' };
135
+ const string = { id: 'string' };
136
+ const number = { id: 'number' };
137
+ const members = { id: 'members' };
138
+ const characters = { id: 'characters' };
139
+ const integer = { id: 'integer' };
140
+ const fraction = { id: 'fraction' };
141
+ const exponent = { id: 'exponent' };
142
+ const member = { id: 'member' };
143
+ const character = { id: 'character' };
144
+ const digit = { id: 'digit' };
145
+ const onenine = { id: 'onenine' };
146
+ const digits = { id: 'digits' };
147
+ const sign = { id: 'sign' };
148
+ const escape = { id: 'escape' };
149
+ const hex = { id: 'hex' };
150
+ const map = {
151
+ json: element,
152
+ element: [ws, value, ws],
153
+ ws: { or: [
154
+ [],
155
+ [' ', ws],
156
+ ['\t', ws],
157
+ ['\n', ws],
158
+ ['\r', ws],
159
+ ] },
160
+ value: { or: [
161
+ object,
162
+ array,
163
+ string,
164
+ number,
165
+ 'true',
166
+ 'false',
167
+ 'null'
168
+ ] },
169
+ object: { or: [
170
+ ['{', ws, '}'],
171
+ ['{', members, '}'],
172
+ ] },
173
+ array: { or: [
174
+ ['[', ws, ']'],
175
+ ['[', element, ']'],
176
+ ] },
177
+ string: ['"', characters, '"'],
178
+ number: [integer, fraction, exponent],
179
+ members: { or: [
180
+ member,
181
+ [member, ',', members],
182
+ ] },
183
+ characters: { or: [
184
+ [],
185
+ [character, characters]
186
+ ] },
187
+ integer: { or: [
188
+ digit,
189
+ [onenine, digits],
190
+ ['-', digit],
191
+ ['-', onenine, digits],
192
+ ] },
193
+ fraction: { or: [
194
+ [],
195
+ ['.', digits]
196
+ ] },
197
+ exponent: { or: [
198
+ [],
199
+ ['E', sign, digits],
200
+ ['e', sign, digits],
201
+ ] },
202
+ member: [ws, string, ws, ':', element],
203
+ character: { or: [
204
+ [0x20, 0x21], // exclude '"' 0x22
205
+ [0x23, 0x5B], // exclude '\' 0x5C
206
+ [0x5D, 0x10FFFF],
207
+ ['\\', escape],
208
+ ] },
209
+ digit: { or: [
210
+ '0',
211
+ onenine,
212
+ ] },
213
+ onenine: [0x31, 0x39],
214
+ digits: { or: [
215
+ digit,
216
+ [digit, digits]
217
+ ] },
218
+ sign: { or: [
219
+ [],
220
+ '+',
221
+ '-',
222
+ ] },
223
+ escape: { or: [
224
+ '"',
225
+ '\\',
226
+ '/',
227
+ 'b',
228
+ 'f',
229
+ 'n',
230
+ 'r',
231
+ 't',
232
+ ['u', hex, hex, hex, hex]
233
+ ] },
234
+ hex: { or: [
235
+ digit,
236
+ [0x41, 0x46], // A..F
237
+ [0x61, 0x66], // a..f
238
+ ] },
239
+ };
240
+ const _map = map;
241
+ }
@@ -107,6 +107,7 @@ const union = def => a => b => {
107
107
  const rangeMapMerge = def => merge({
108
108
  union: union(def),
109
109
  equal: operator.strictEqual,
110
+ def,
110
111
  });
111
112
  const rangeFunc = r => f => def => fromRange(def)(r)(f);
112
113
  const scanRangeOp = def => f => [f(def), scanRangeOp(def)];
@@ -126,7 +127,11 @@ const create = (def) => (a) => {
126
127
  };
127
128
  const digitToBigInt = d => BigInt(d - digit0);
128
129
  const startNumber = digit => ({ s: 1n, m: digitToBigInt(digit), f: 0, es: 1, e: 0 });
129
- const startNegativeNumber = { s: -1n, m: 0n, f: 0, es: 1, e: 0 };
130
+ /*
131
+ const startNegativeNumber
132
+ : ParseNumberBuffer
133
+ = { s: -1n, m: 0n, f: 0, es: 1, e: 0 }
134
+ */
130
135
  const addIntDigit = digit => b => ({ ...b, m: b.m * 10n + digitToBigInt(digit) });
131
136
  const addFracDigit = digit => b => ({ ...b, m: b.m * 10n + digitToBigInt(digit), f: b.f - 1 });
132
137
  const addExpDigit = digit => b => ({ ...b, e: b.e * 10 + digit - digit0 });