functionalscript 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/dev/module.mjs +1 -1
  2. package/jsr.json +59 -59
  3. package/out/com/cpp/module.f.mjs +123 -0
  4. package/out/com/cpp/test.f.mjs +40 -0
  5. package/out/com/cpp/testlib.f.mjs +7 -0
  6. package/out/com/cs/module.f.mjs +95 -0
  7. package/out/com/cs/test.f.mjs +43 -0
  8. package/out/com/cs/testlib.f.mjs +7 -0
  9. package/out/com/rust/module.f.mjs +213 -0
  10. package/out/com/rust/test.f.mjs +123 -0
  11. package/out/com/rust/testlib.f.mjs +7 -0
  12. package/out/com/test/build.f.mjs +98 -0
  13. package/out/com/test/build.mjs +40 -0
  14. package/out/com/types/module.f.mjs +51 -0
  15. package/out/com/types/testlib.f.mjs +30 -0
  16. package/out/commonjs/build/module.f.mjs +107 -0
  17. package/out/commonjs/build/test.f.mjs +102 -0
  18. package/out/commonjs/module/function/module.f.mjs +15 -0
  19. package/out/commonjs/module/module.f.mjs +48 -0
  20. package/out/commonjs/module.f.mjs +10 -0
  21. package/out/commonjs/module.mjs +26 -0
  22. package/out/commonjs/package/dependencies/module.f.mjs +21 -0
  23. package/out/commonjs/package/dependencies/test.f.mjs +15 -0
  24. package/out/commonjs/package/module.f.mjs +40 -0
  25. package/out/commonjs/package/test.f.mjs +27 -0
  26. package/out/commonjs/path/module.f.mjs +171 -0
  27. package/out/commonjs/path/test.f.mjs +231 -0
  28. package/out/commonjs/test.mjs +87 -0
  29. package/out/dev/index.mjs +2 -0
  30. package/out/dev/module.f.mjs +2 -0
  31. package/out/dev/module.mjs +167 -0
  32. package/out/dev/test/module.f.mjs +134 -0
  33. package/out/dev/test.f.mjs +58 -0
  34. package/out/dev/test.mjs +52 -0
  35. package/out/djs/module.f.mjs +75 -0
  36. package/out/djs/parser/module.f.mjs +432 -0
  37. package/out/djs/parser/test.f.mjs +535 -0
  38. package/out/djs/test.f.mjs +84 -0
  39. package/out/djs/tokenizer/module.f.mjs +87 -0
  40. package/out/djs/tokenizer/test.f.mjs +480 -0
  41. package/out/fsc/module.f.mjs +105 -0
  42. package/out/fsc/test.f.mjs +19 -0
  43. package/out/fsm/module.f.mjs +80 -0
  44. package/out/fsm/test.f.mjs +138 -0
  45. package/out/html/module.f.mjs +94 -0
  46. package/out/html/test.f.mjs +45 -0
  47. package/out/issues/test.f.mjs +66 -0
  48. package/out/js/tokenizer/module.f.mjs +686 -0
  49. package/out/js/tokenizer/test.f.mjs +844 -0
  50. package/out/json/module.f.mjs +89 -0
  51. package/out/json/parser/module.f.mjs +224 -0
  52. package/out/json/parser/test.f.mjs +321 -0
  53. package/out/json/serializer/module.f.mjs +67 -0
  54. package/out/json/serializer/test.f.mjs +87 -0
  55. package/out/json/test.f.mjs +61 -0
  56. package/out/json/tokenizer/module.f.mjs +78 -0
  57. package/out/json/tokenizer/test.f.mjs +420 -0
  58. package/out/nanvm-lib/tests/test.f.mjs +87 -0
  59. package/out/nodejs/version/main.mjs +3 -0
  60. package/out/nodejs/version/module.f.mjs +34 -0
  61. package/out/nodejs/version/test.f.mjs +97 -0
  62. package/out/prime_field/module.f.mjs +87 -0
  63. package/out/prime_field/test.f.mjs +145 -0
  64. package/out/secp/module.f.mjs +113 -0
  65. package/out/secp/test.f.mjs +63 -0
  66. package/out/sha2/module.f.mjs +172 -0
  67. package/out/sha2/test.f.mjs +86 -0
  68. package/out/text/ascii/module.f.mjs +154 -0
  69. package/out/text/ascii/test.f.mjs +14 -0
  70. package/out/text/module.f.mjs +19 -0
  71. package/out/text/sgr/module.f.mjs +17 -0
  72. package/out/text/test.f.mjs +19 -0
  73. package/out/text/utf16/module.f.mjs +86 -0
  74. package/out/text/utf16/test.f.mjs +145 -0
  75. package/out/text/utf8/module.f.mjs +126 -0
  76. package/out/text/utf8/test.f.mjs +175 -0
  77. package/out/types/array/module.f.mjs +95 -0
  78. package/out/types/array/test.f.mjs +116 -0
  79. package/out/types/bigfloat/module.f.mjs +77 -0
  80. package/out/types/bigfloat/test.f.mjs +349 -0
  81. package/out/types/bigint/module.f.mjs +114 -0
  82. package/out/types/bigint/test.f.mjs +192 -0
  83. package/out/types/btree/find/module.f.mjs +137 -0
  84. package/out/types/btree/find/test.f.mjs +156 -0
  85. package/out/types/btree/module.f.mjs +34 -0
  86. package/out/types/btree/remove/module.f.mjs +209 -0
  87. package/out/types/btree/remove/test.f.mjs +638 -0
  88. package/out/types/btree/set/module.f.mjs +114 -0
  89. package/out/types/btree/set/test.f.mjs +390 -0
  90. package/out/types/btree/test.f.mjs +83 -0
  91. package/out/types/btree/types/module.f.mjs +50 -0
  92. package/out/types/byte_set/module.f.mjs +42 -0
  93. package/out/types/byte_set/test.f.mjs +123 -0
  94. package/out/types/function/compare/module.f.mjs +22 -0
  95. package/out/types/function/compare/test.f.mjs +8 -0
  96. package/out/types/function/module.f.mjs +44 -0
  97. package/out/types/function/operator/module.f.mjs +60 -0
  98. package/out/types/function/test.f.mjs +15 -0
  99. package/out/types/list/module.f.mjs +269 -0
  100. package/out/types/list/test.f.mjs +401 -0
  101. package/out/types/map/module.f.mjs +54 -0
  102. package/out/types/map/test.f.mjs +115 -0
  103. package/out/types/nibble_set/module.f.mjs +19 -0
  104. package/out/types/nibble_set/test.f.mjs +90 -0
  105. package/out/types/nullable/module.f.mjs +9 -0
  106. package/out/types/nullable/test.f.mjs +12 -0
  107. package/out/types/number/module.f.mjs +12 -0
  108. package/out/types/number/test.f.mjs +126 -0
  109. package/out/types/object/module.f.mjs +27 -0
  110. package/out/types/object/test.f.mjs +17 -0
  111. package/out/types/range/module.f.mjs +6 -0
  112. package/out/types/range/test.f.mjs +18 -0
  113. package/out/types/range_map/module.f.mjs +84 -0
  114. package/out/types/range_map/test.f.mjs +201 -0
  115. package/out/types/result/module.f.mjs +25 -0
  116. package/out/types/result/module.mjs +16 -0
  117. package/out/types/sorted_list/module.f.mjs +102 -0
  118. package/out/types/sorted_list/test.f.mjs +66 -0
  119. package/out/types/sorted_set/module.f.mjs +29 -0
  120. package/out/types/sorted_set/test.f.mjs +80 -0
  121. package/out/types/string/module.f.mjs +17 -0
  122. package/out/types/string/test.f.mjs +58 -0
  123. package/out/types/string_set/module.f.mjs +29 -0
  124. package/out/types/string_set/test.f.mjs +65 -0
  125. package/package.json +5 -4
  126. package/tsconfig.json +2 -2
  127. /package/{com → out/com}/cpp/module.f.d.mts +0 -0
  128. /package/{com → out/com}/cpp/test.f.d.mts +0 -0
  129. /package/{com → out/com}/cpp/testlib.f.d.mts +0 -0
  130. /package/{com → out/com}/cs/module.f.d.mts +0 -0
  131. /package/{com → out/com}/cs/test.f.d.mts +0 -0
  132. /package/{com → out/com}/cs/testlib.f.d.mts +0 -0
  133. /package/{com → out/com}/rust/module.f.d.mts +0 -0
  134. /package/{com → out/com}/rust/test.f.d.mts +0 -0
  135. /package/{com → out/com}/rust/testlib.f.d.mts +0 -0
  136. /package/{com → out/com}/test/build.d.mts +0 -0
  137. /package/{com → out/com}/test/build.f.d.mts +0 -0
  138. /package/{com → out/com}/types/module.f.d.mts +0 -0
  139. /package/{com → out/com}/types/testlib.f.d.mts +0 -0
  140. /package/{commonjs → out/commonjs}/build/module.f.d.mts +0 -0
  141. /package/{commonjs → out/commonjs}/build/test.f.d.mts +0 -0
  142. /package/{commonjs → out/commonjs}/module/function/module.f.d.mts +0 -0
  143. /package/{commonjs → out/commonjs}/module/module.f.d.mts +0 -0
  144. /package/{commonjs → out/commonjs}/module.d.mts +0 -0
  145. /package/{commonjs → out/commonjs}/module.f.d.mts +0 -0
  146. /package/{commonjs → out/commonjs}/package/dependencies/module.f.d.mts +0 -0
  147. /package/{commonjs → out/commonjs}/package/dependencies/test.f.d.mts +0 -0
  148. /package/{commonjs → out/commonjs}/package/module.f.d.mts +0 -0
  149. /package/{commonjs → out/commonjs}/package/test.f.d.mts +0 -0
  150. /package/{commonjs → out/commonjs}/path/module.f.d.mts +0 -0
  151. /package/{commonjs → out/commonjs}/path/test.f.d.mts +0 -0
  152. /package/{commonjs → out/commonjs}/test.d.mts +0 -0
  153. /package/{dev → out/dev}/index.d.mts +0 -0
  154. /package/{dev → out/dev}/module.d.mts +0 -0
  155. /package/{dev → out/dev}/module.f.d.mts +0 -0
  156. /package/{dev → out/dev}/test/module.f.d.mts +0 -0
  157. /package/{dev → out/dev}/test.d.mts +0 -0
  158. /package/{dev → out/dev}/test.f.d.mts +0 -0
  159. /package/{djs → out/djs}/module.f.d.mts +0 -0
  160. /package/{djs → out/djs}/parser/module.f.d.mts +0 -0
  161. /package/{djs → out/djs}/parser/test.f.d.mts +0 -0
  162. /package/{djs → out/djs}/test.f.d.mts +0 -0
  163. /package/{djs → out/djs}/tokenizer/module.f.d.mts +0 -0
  164. /package/{djs → out/djs}/tokenizer/test.f.d.mts +0 -0
  165. /package/{fsc → out/fsc}/module.f.d.mts +0 -0
  166. /package/{fsc → out/fsc}/test.f.d.mts +0 -0
  167. /package/{fsm → out/fsm}/module.f.d.mts +0 -0
  168. /package/{fsm → out/fsm}/test.f.d.mts +0 -0
  169. /package/{html → out/html}/module.f.d.mts +0 -0
  170. /package/{html → out/html}/test.f.d.mts +0 -0
  171. /package/{issues → out/issues}/test.f.d.mts +0 -0
  172. /package/{js → out/js}/tokenizer/module.f.d.mts +0 -0
  173. /package/{js → out/js}/tokenizer/test.f.d.mts +0 -0
  174. /package/{json → out/json}/module.f.d.mts +0 -0
  175. /package/{json → out/json}/parser/module.f.d.mts +0 -0
  176. /package/{json → out/json}/parser/test.f.d.mts +0 -0
  177. /package/{json → out/json}/serializer/module.f.d.mts +0 -0
  178. /package/{json → out/json}/serializer/test.f.d.mts +0 -0
  179. /package/{json → out/json}/test.f.d.mts +0 -0
  180. /package/{json → out/json}/tokenizer/module.f.d.mts +0 -0
  181. /package/{json → out/json}/tokenizer/test.f.d.mts +0 -0
  182. /package/{nanvm-lib → out/nanvm-lib}/tests/test.f.d.mts +0 -0
  183. /package/{nodejs → out/nodejs}/version/main.d.mts +0 -0
  184. /package/{nodejs → out/nodejs}/version/module.f.d.mts +0 -0
  185. /package/{nodejs → out/nodejs}/version/test.f.d.mts +0 -0
  186. /package/{prime_field → out/prime_field}/module.f.d.mts +0 -0
  187. /package/{prime_field → out/prime_field}/test.f.d.mts +0 -0
  188. /package/{secp → out/secp}/module.f.d.mts +0 -0
  189. /package/{secp → out/secp}/test.f.d.mts +0 -0
  190. /package/{sha2 → out/sha2}/module.f.d.mts +0 -0
  191. /package/{sha2 → out/sha2}/test.f.d.mts +0 -0
  192. /package/{text → out/text}/ascii/module.f.d.mts +0 -0
  193. /package/{text → out/text}/ascii/test.f.d.mts +0 -0
  194. /package/{text → out/text}/module.f.d.mts +0 -0
  195. /package/{text → out/text}/sgr/module.f.d.mts +0 -0
  196. /package/{text → out/text}/test.f.d.mts +0 -0
  197. /package/{text → out/text}/utf16/module.f.d.mts +0 -0
  198. /package/{text → out/text}/utf16/test.f.d.mts +0 -0
  199. /package/{text → out/text}/utf8/module.f.d.mts +0 -0
  200. /package/{text → out/text}/utf8/test.f.d.mts +0 -0
  201. /package/{types → out/types}/array/module.f.d.mts +0 -0
  202. /package/{types → out/types}/array/test.f.d.mts +0 -0
  203. /package/{types → out/types}/bigfloat/module.f.d.mts +0 -0
  204. /package/{types → out/types}/bigfloat/test.f.d.mts +0 -0
  205. /package/{types → out/types}/bigint/module.f.d.mts +0 -0
  206. /package/{types → out/types}/bigint/test.f.d.mts +0 -0
  207. /package/{types → out/types}/btree/find/module.f.d.mts +0 -0
  208. /package/{types → out/types}/btree/find/test.f.d.mts +0 -0
  209. /package/{types → out/types}/btree/module.f.d.mts +0 -0
  210. /package/{types → out/types}/btree/remove/module.f.d.mts +0 -0
  211. /package/{types → out/types}/btree/remove/test.f.d.mts +0 -0
  212. /package/{types → out/types}/btree/set/module.f.d.mts +0 -0
  213. /package/{types → out/types}/btree/set/test.f.d.mts +0 -0
  214. /package/{types → out/types}/btree/test.f.d.mts +0 -0
  215. /package/{types → out/types}/btree/types/module.f.d.mts +0 -0
  216. /package/{types → out/types}/byte_set/module.f.d.mts +0 -0
  217. /package/{types → out/types}/byte_set/test.f.d.mts +0 -0
  218. /package/{types → out/types}/function/compare/module.f.d.mts +0 -0
  219. /package/{types → out/types}/function/compare/test.f.d.mts +0 -0
  220. /package/{types → out/types}/function/module.f.d.mts +0 -0
  221. /package/{types → out/types}/function/operator/module.f.d.mts +0 -0
  222. /package/{types → out/types}/function/test.f.d.mts +0 -0
  223. /package/{types → out/types}/list/module.f.d.mts +0 -0
  224. /package/{types → out/types}/list/test.f.d.mts +0 -0
  225. /package/{types → out/types}/map/module.f.d.mts +0 -0
  226. /package/{types → out/types}/map/test.f.d.mts +0 -0
  227. /package/{types → out/types}/nibble_set/module.f.d.mts +0 -0
  228. /package/{types → out/types}/nibble_set/test.f.d.mts +0 -0
  229. /package/{types → out/types}/nullable/module.f.d.mts +0 -0
  230. /package/{types → out/types}/nullable/test.f.d.mts +0 -0
  231. /package/{types → out/types}/number/module.f.d.mts +0 -0
  232. /package/{types → out/types}/number/test.f.d.mts +0 -0
  233. /package/{types → out/types}/object/module.f.d.mts +0 -0
  234. /package/{types → out/types}/object/test.f.d.mts +0 -0
  235. /package/{types → out/types}/range/module.f.d.mts +0 -0
  236. /package/{types → out/types}/range/test.f.d.mts +0 -0
  237. /package/{types → out/types}/range_map/module.f.d.mts +0 -0
  238. /package/{types → out/types}/range_map/test.f.d.mts +0 -0
  239. /package/{types → out/types}/result/module.d.mts +0 -0
  240. /package/{types → out/types}/result/module.f.d.mts +0 -0
  241. /package/{types → out/types}/sorted_list/module.f.d.mts +0 -0
  242. /package/{types → out/types}/sorted_list/test.f.d.mts +0 -0
  243. /package/{types → out/types}/sorted_set/module.f.d.mts +0 -0
  244. /package/{types → out/types}/sorted_set/test.f.d.mts +0 -0
  245. /package/{types → out/types}/string/module.f.d.mts +0 -0
  246. /package/{types → out/types}/string/test.f.d.mts +0 -0
  247. /package/{types → out/types}/string_set/module.f.d.mts +0 -0
  248. /package/{types → out/types}/string_set/test.f.d.mts +0 -0
@@ -0,0 +1,686 @@
1
+ // @ts-self-types="./module.f.d.mts"
2
+ import * as operator from '../../types/function/operator/module.f.mjs';
3
+ import * as range_map from '../../types/range_map/module.f.mjs';
4
+ const { merge, fromRange, get } = range_map;
5
+ import * as list from '../../types/list/module.f.mjs';
6
+ import * as map from '../../types/map/module.f.mjs';
7
+ const { at } = map;
8
+ import * as _range from '../../types/range/module.f.mjs';
9
+ const { one } = _range;
10
+ const { empty, stateScan, flat, toArray, reduce: listReduce, scan } = list;
11
+ import * as bigfloatT from '../../types/bigfloat/module.f.mjs';
12
+ const { fromCharCode } = String;
13
+ import * as ascii from '../../text/ascii/module.f.mjs';
14
+ const { range } = ascii;
15
+ const {
16
+ //
17
+ backspace, ht, lf, ff, cr,
18
+ //
19
+ exclamationMark, percentSign, ampersand, asterisk, lessThanSign, equalsSign, greaterThanSign, questionMark, circumflexAccent, verticalLine, tilde,
20
+ //
21
+ space, quotationMark, leftParenthesis, rightParenthesis, plusSign, comma, hyphenMinus, fullStop, solidus,
22
+ //
23
+ digitRange, digit0, colon,
24
+ //
25
+ latinCapitalLetterRange, latinCapitalLetterA, latinCapitalLetterE,
26
+ //
27
+ leftSquareBracket, reverseSolidus, rightSquareBracket, lowLine,
28
+ //
29
+ latinSmallLetterRange, latinSmallLetterA, latinSmallLetterB, latinSmallLetterE, latinSmallLetterF, latinSmallLetterN, latinSmallLetterR, latinSmallLetterT, latinSmallLetterU,
30
+ //
31
+ leftCurlyBracket, rightCurlyBracket, dollarSign } = ascii.ascii;
32
+ /**
33
+ * @typedef {{
34
+ * readonly kind: 'string'
35
+ * readonly value: string
36
+ * }} StringToken
37
+ * */
38
+ /**
39
+ * @typedef {{
40
+ * readonly kind: 'number'
41
+ * readonly value: string
42
+ * readonly bf: bigfloatT.BigFloat
43
+ * }} NumberToken
44
+ * */
45
+ /**
46
+ * @typedef {{
47
+ * readonly kind: 'bigint'
48
+ * readonly value: bigint
49
+ * }} BigIntToken
50
+ * */
51
+ /** @typedef {{readonly kind: 'error', message: ErrorMessage}} ErrorToken */
52
+ /** @typedef {{readonly kind: 'ws'}} WhitespaceToken */
53
+ /** @typedef {{readonly kind: 'nl'}} NewLineToken */
54
+ /** @typedef {{readonly kind: 'true'}} TrueToken */
55
+ /** @typedef {{readonly kind: 'false'}} FalseToken */
56
+ /** @typedef {{readonly kind: 'null'}} NullToken */
57
+ /**
58
+ * @typedef {|
59
+ * {readonly kind: 'arguments' | 'await' | 'break' | 'case' | 'catch' | 'class' | 'const' | 'continue' } |
60
+ * {readonly kind: 'debugger' | 'default' | 'delete' | 'do' | 'else' | 'enum' | 'eval' | 'export' } |
61
+ * {readonly kind: 'extends' | 'finally' | 'for' | 'function' | 'if' | 'implements' | 'import' | 'in' } |
62
+ * {readonly kind: 'instanceof' | 'interface' | 'let' | 'new' | 'package' | 'private' | 'protected' | 'public' } |
63
+ * {readonly kind: 'return' | 'static' | 'super' | 'switch' | 'this' | 'throw' | 'try' | 'typeof' } |
64
+ * {readonly kind: 'var' | 'void' | 'while' | 'with' | 'yield' }
65
+ * } KeywordToken
66
+ */
67
+ /**
68
+ * @typedef {{
69
+ * readonly kind: 'id'
70
+ * readonly value: string
71
+ * }} IdToken
72
+ * */
73
+ /**
74
+ * @typedef {|
75
+ * {readonly kind: '{' | '}' | ':' | ',' | '[' | ']' } |
76
+ * {readonly kind: '.' | '=' } |
77
+ * {readonly kind: '(' | ')' } |
78
+ * {readonly kind: '==' | '!=' | '===' | '!==' | '>' | '>=' | '<' | '<=' } |
79
+ * {readonly kind: '+' | '-' | '*' | '/' | '%' | '++' | '--' | '**' } |
80
+ * {readonly kind: '+=' | '-=' | '*=' | '/=' | '%=' | '**='} |
81
+ * {readonly kind: '&' | '|' | '^' | '~' | '<<' | '>>' | '>>>' } |
82
+ * {readonly kind: '&=' | '|=' | '^=' | '<<=' | '>>=' | '>>>='} |
83
+ * {readonly kind: '&&' | '||' | '!' | '??' } |
84
+ * {readonly kind: '&&=' | '||=' | '??=' } |
85
+ * {readonly kind: '?' | '?.' | '=>'}
86
+ * } OperatorToken
87
+ */
88
+ /**
89
+ * @typedef {|
90
+ * KeywordToken |
91
+ * TrueToken |
92
+ * FalseToken |
93
+ * NullToken |
94
+ * WhitespaceToken |
95
+ * NewLineToken |
96
+ * StringToken |
97
+ * NumberToken |
98
+ * ErrorToken |
99
+ * IdToken |
100
+ * BigIntToken |
101
+ * OperatorToken
102
+ * } JsToken
103
+ */
104
+ const rangeOneNine = range('19');
105
+ const rangeSetNewLine = [
106
+ one(lf),
107
+ one(cr)
108
+ ];
109
+ const rangeSetWhiteSpace = [
110
+ one(ht),
111
+ one(space)
112
+ ];
113
+ const rangeSetTerminalForNumber = [
114
+ ...rangeSetWhiteSpace,
115
+ ...rangeSetNewLine,
116
+ one(exclamationMark),
117
+ one(percentSign),
118
+ one(ampersand),
119
+ one(leftParenthesis),
120
+ one(rightParenthesis),
121
+ one(asterisk),
122
+ one(comma),
123
+ one(solidus),
124
+ one(colon),
125
+ one(lessThanSign),
126
+ one(equalsSign),
127
+ one(greaterThanSign),
128
+ one(questionMark),
129
+ one(circumflexAccent),
130
+ one(leftSquareBracket),
131
+ one(rightSquareBracket),
132
+ one(leftCurlyBracket),
133
+ one(verticalLine),
134
+ one(rightCurlyBracket),
135
+ one(tilde),
136
+ ];
137
+ const rangeSmallAF = range('af');
138
+ const rangeCapitalAF = range('AF');
139
+ const rangeIdStart = [
140
+ latinSmallLetterRange,
141
+ latinCapitalLetterRange,
142
+ one(lowLine),
143
+ one(dollarSign)
144
+ ];
145
+ const rangeOpStart = [
146
+ one(exclamationMark),
147
+ one(percentSign),
148
+ one(ampersand),
149
+ one(leftParenthesis),
150
+ one(rightParenthesis),
151
+ one(asterisk),
152
+ one(plusSign),
153
+ one(comma),
154
+ one(hyphenMinus),
155
+ one(fullStop),
156
+ one(solidus),
157
+ one(colon),
158
+ one(lessThanSign),
159
+ one(equalsSign),
160
+ one(greaterThanSign),
161
+ one(questionMark),
162
+ one(circumflexAccent),
163
+ one(leftSquareBracket),
164
+ one(rightSquareBracket),
165
+ one(leftCurlyBracket),
166
+ one(verticalLine),
167
+ one(rightCurlyBracket),
168
+ one(tilde)
169
+ ];
170
+ const rangeId = [digitRange, ...rangeIdStart];
171
+ /**
172
+ * @typedef {|
173
+ * InitialState |
174
+ * ParseIdState |
175
+ * ParseStringState |
176
+ * ParseEscapeCharState |
177
+ * ParseUnicodeCharState |
178
+ * ParseNumberState |
179
+ * InvalidNumberState |
180
+ * ParseOperatorState |
181
+ * ParseMinusState |
182
+ * ParseWhitespaceState |
183
+ * ParseNewLineState |
184
+ * EofState
185
+ * } TokenizerState
186
+ */
187
+ /**
188
+ * @typedef {|
189
+ * '" are missing' |
190
+ * 'unescaped character' |
191
+ * 'invalid hex value' |
192
+ * 'unexpected character' |
193
+ * 'invalid number' |
194
+ * 'invalid token' |
195
+ * 'eof'
196
+ * } ErrorMessage
197
+ */
198
+ /** @typedef {{ readonly kind: 'initial'}} InitialState */
199
+ /** @typedef {{ readonly kind: 'id', readonly value: string}} ParseIdState */
200
+ /** @typedef {{ readonly kind: 'ws'}} ParseWhitespaceState */
201
+ /** @typedef {{ readonly kind: 'nl'}} ParseNewLineState */
202
+ /** @typedef {{ readonly kind: 'string', readonly value: string}} ParseStringState */
203
+ /** @typedef {{ readonly kind: 'escapeChar', readonly value: string}} ParseEscapeCharState */
204
+ /** @typedef {{ readonly kind: 'op', readonly value: string}} ParseOperatorState */
205
+ /** @typedef {{ readonly kind: '-'}} ParseMinusState */
206
+ /**
207
+ * @typedef {{
208
+ * readonly kind: 'unicodeChar'
209
+ * readonly value: string
210
+ * readonly unicode: number
211
+ * readonly hexIndex: number
212
+ * }} ParseUnicodeCharState
213
+ */
214
+ /**
215
+ * @typedef {{
216
+ * readonly kind: 'number',
217
+ * readonly numberKind: '0' | 'int' | '.' | 'fractional' | 'e' | 'e+' | 'e-' | 'expDigits' | 'bigint'
218
+ * readonly value: string
219
+ * readonly b: ParseNumberBuffer
220
+ * }} ParseNumberState
221
+ */
222
+ /**
223
+ * @typedef {{
224
+ * readonly s: -1n | 1n
225
+ * readonly m: bigint
226
+ * readonly f: number
227
+ * readonly es: -1 | 1
228
+ * readonly e: number
229
+ * }} ParseNumberBuffer
230
+ */
231
+ /** @typedef {{ readonly kind: 'invalidNumber'}} InvalidNumberState */
232
+ /** @typedef {{ readonly kind: 'eof'}} EofState */
233
+ /** @typedef {number|null} CharCodeOrEof */
234
+ /** @typedef {(input: number) => readonly[list.List<JsToken>, TokenizerState]} ToToken */
235
+ /**
236
+ * @template T
237
+ * @typedef {(state: T) => ToToken} CreateToToken<T>
238
+ */
239
+ /** @typedef {list.List<_range.Range>} RangeSet */
240
+ /**
241
+ * @template T
242
+ * @typedef {(def: CreateToToken<T>) => (RangeMapToToken<T>)} RangeFunc<T>
243
+ */
244
+ /**
245
+ * @template T
246
+ * @typedef {range_map.RangeMapArray<CreateToToken<T>>} RangeMapToToken<T>
247
+ */
248
+ /** @type {(old: string) => (input: number) => string} */
249
+ const appendChar = old => input => `${old}${fromCharCode(input)}`;
250
+ /** @type {<T>(def: CreateToToken<T>) => (a: CreateToToken<T>) => (b: CreateToToken<T>) => CreateToToken<T>} */
251
+ const union = def => a => b => {
252
+ if (a === def || a === b) {
253
+ return b;
254
+ }
255
+ if (b === def) {
256
+ return a;
257
+ }
258
+ throw [a, b];
259
+ };
260
+ /** @type {<T>(def: CreateToToken<T>) => range_map.RangeMerge<CreateToToken<T>>} */
261
+ const rangeMapMerge = def => merge({
262
+ union: union(def),
263
+ equal: operator.strictEqual,
264
+ });
265
+ /** @type {<T>(r: _range.Range) => (f: CreateToToken<T>) => RangeFunc<T>} */
266
+ const rangeFunc = r => f => def => fromRange(def)(r)(f);
267
+ /** @type {<T>(def: CreateToToken<T>) => (operator.Scan<RangeFunc<T>, RangeMapToToken<T>>)} */
268
+ const scanRangeOp = def => f => [f(def), scanRangeOp(def)];
269
+ /** @type {<T>(def: CreateToToken<T>) => (a: list.List<RangeFunc<T>>) => RangeMapToToken<T>} */
270
+ const reduceRangeMap = def => a => {
271
+ const rm = scan(scanRangeOp(def))(a);
272
+ return toArray(listReduce(rangeMapMerge(def))(empty)(rm));
273
+ };
274
+ /** @type {<T>(def: CreateToToken<T>) => (f: CreateToToken<T>) => (operator.Scan<_range.Range, RangeMapToToken<T>>)} */
275
+ const scanRangeSetOp = def => f => r => [fromRange(def)(r)(f), scanRangeSetOp(def)(f)];
276
+ /** @type {<T>(rs: list.List<_range.Range>) => (f: CreateToToken<T>) => RangeFunc<T>} */
277
+ const rangeSetFunc = rs => f => def => {
278
+ const rm = scan(scanRangeSetOp(def)(f))(rs);
279
+ return toArray(listReduce(rangeMapMerge(def))(empty)(rm));
280
+ };
281
+ /** @type {<T>(def: CreateToToken<T>) => (a: list.List<RangeFunc<T>>) => CreateToToken<T>} */
282
+ const create = def => a => {
283
+ /** @typedef {typeof def extends CreateToToken<infer T> ? T : never} T */
284
+ const i = reduceRangeMap(def)(a);
285
+ /** @type {(v: number) => (i: RangeMapToToken<T>) => (v: T) => ToToken} */
286
+ const x = get(def);
287
+ return v => c => x(c)(i)(v)(c);
288
+ };
289
+ /** @type {(digit: number) => bigint} */
290
+ const digitToBigInt = d => BigInt(d - digit0);
291
+ /** @type {(digit: number) => ParseNumberBuffer} */
292
+ const startNumber = digit => ({ s: 1n, m: digitToBigInt(digit), f: 0, es: 1, e: 0 });
293
+ /** @type {ParseNumberBuffer} */
294
+ const startNegativeNumber = { s: -1n, m: 0n, f: 0, es: 1, e: 0 };
295
+ /** @type {(digit: number) => (b: ParseNumberBuffer) => ParseNumberBuffer} */
296
+ const addIntDigit = digit => b => ({ ...b, m: b.m * 10n + digitToBigInt(digit) });
297
+ /** @type {(digit: number) => (b: ParseNumberBuffer) => ParseNumberBuffer} */
298
+ const addFracDigit = digit => b => ({ ...b, m: b.m * 10n + digitToBigInt(digit), f: b.f - 1 });
299
+ /** @type {(digit: number) => (b: ParseNumberBuffer) => ParseNumberBuffer} */
300
+ const addExpDigit = digit => b => ({ ...b, e: b.e * 10 + digit - digit0 });
301
+ /** @type {(s: ParseNumberState) => JsToken} */
302
+ const bufferToNumberToken = ({ numberKind, value, b }) => {
303
+ if (numberKind === 'bigint')
304
+ return { kind: 'bigint', value: b.s * b.m };
305
+ return { kind: 'number', value: value, bf: [b.s * b.m, b.f + b.es * b.e] };
306
+ };
307
+ /**
308
+ * @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#keywords
309
+ * @type {list.List<map.Entry<JsToken>>}
310
+ */
311
+ const keywordEntries = [
312
+ ['arguments', { kind: 'arguments' }],
313
+ ['await', { kind: 'await' }],
314
+ ['break', { kind: 'break' }],
315
+ ['case', { kind: 'case' }],
316
+ ['catch', { kind: 'catch' }],
317
+ ['class', { kind: 'class' }],
318
+ ['const', { kind: 'const' }],
319
+ ['continue', { kind: 'continue' }],
320
+ ['debugger', { kind: 'debugger' }],
321
+ ['default', { kind: 'default' }],
322
+ ['delete', { kind: 'delete' }],
323
+ ['do', { kind: 'do' }],
324
+ ['else', { kind: 'else' }],
325
+ ['enum', { kind: 'enum' }],
326
+ ['eval', { kind: 'eval' }],
327
+ ['export', { kind: 'export' }],
328
+ ['extends', { kind: 'extends' }],
329
+ ['false', { kind: 'false' }],
330
+ ['finally', { kind: 'finally' }],
331
+ ['for', { kind: 'for' }],
332
+ ['function', { kind: 'function' }],
333
+ ['if', { kind: 'if' }],
334
+ ['implements', { kind: 'implements' }],
335
+ ['import', { kind: 'import' }],
336
+ ['in', { kind: 'in' }],
337
+ ['instanceof', { kind: 'instanceof' }],
338
+ ['interface', { kind: 'interface' }],
339
+ ['let', { kind: 'let' }],
340
+ ['new', { kind: 'new' }],
341
+ ['null', { kind: 'null' }],
342
+ ['package', { kind: 'package' }],
343
+ ['private', { kind: 'private' }],
344
+ ['protected', { kind: 'protected' }],
345
+ ['public', { kind: 'public' }],
346
+ ['return', { kind: 'return' }],
347
+ ['static', { kind: 'static' }],
348
+ ['super', { kind: 'super' }],
349
+ ['switch', { kind: 'switch' }],
350
+ ['this', { kind: 'this' }],
351
+ ['throw', { kind: 'throw' }],
352
+ ['true', { kind: 'true' }],
353
+ ['try', { kind: 'try' }],
354
+ ['typeof', { kind: 'typeof' }],
355
+ ['var', { kind: 'var' }],
356
+ ['void', { kind: 'void' }],
357
+ ['while', { kind: 'while' }],
358
+ ['with', { kind: 'with' }],
359
+ ['yield', { kind: 'yield' }],
360
+ ];
361
+ const keywordMap = map.fromEntries(keywordEntries);
362
+ /** @type {(token: JsToken) => Boolean} */
363
+ export const isKeywordToken = token => at(token.kind)(keywordMap) !== null;
364
+ /**
365
+ * @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators
366
+ * @type {list.List<map.Entry<JsToken>>}
367
+ */
368
+ const operatorEntries = [
369
+ ['!', { kind: '!' }],
370
+ ['!=', { kind: '!=' }],
371
+ ['!==', { kind: '!==' }],
372
+ ['%', { kind: '%' }],
373
+ ['%=', { kind: '%=' }],
374
+ ['&', { kind: '&' }],
375
+ ['&&', { kind: '&&' }],
376
+ ['&&=', { kind: '&&=' }],
377
+ ['&=', { kind: '&=' }],
378
+ ['(', { kind: '(' }],
379
+ [')', { kind: ')' }],
380
+ ['*', { kind: '*' }],
381
+ ['**', { kind: '**' }],
382
+ ['**=', { kind: '**=' }],
383
+ ['*=', { kind: '*=' }],
384
+ ['+', { kind: '+' }],
385
+ ['++', { kind: '++' }],
386
+ ['+=', { kind: '+=' }],
387
+ [',', { kind: ',' }],
388
+ ['-', { kind: '-' }],
389
+ ['--', { kind: '--' }],
390
+ ['-=', { kind: '-=' }],
391
+ ['.', { kind: '.' }],
392
+ ['/', { kind: '/' }],
393
+ ['/=', { kind: '/=' }],
394
+ [':', { kind: ':' }],
395
+ ['<', { kind: '<' }],
396
+ ['<<', { kind: '<<' }],
397
+ ['<<=', { kind: '<<=' }],
398
+ ['<=', { kind: '<=' }],
399
+ ['=', { kind: '=' }],
400
+ ['==', { kind: '==' }],
401
+ ['===', { kind: '===' }],
402
+ ['=>', { kind: '=>' }],
403
+ ['>', { kind: '>' }],
404
+ ['>=', { kind: '>=' }],
405
+ ['>>', { kind: '>>' }],
406
+ ['>>=', { kind: '>>=' }],
407
+ ['>>>', { kind: '>>>' }],
408
+ ['>>>=', { kind: '>>>=' }],
409
+ ['?', { kind: '?' }],
410
+ ['?.', { kind: '?.' }],
411
+ ['??', { kind: '??' }],
412
+ ['??=', { kind: '??=' }],
413
+ ['^', { kind: '^' }],
414
+ ['^=', { kind: '^=' }],
415
+ ['[', { kind: '[' }],
416
+ [']', { kind: ']' }],
417
+ ['{', { kind: '{' }],
418
+ ['|', { kind: '|' }],
419
+ ['|=', { kind: '|=' }],
420
+ ['||', { kind: '||' }],
421
+ ['||=', { kind: '||=' }],
422
+ ['}', { kind: '}' }],
423
+ ['~', { kind: '~' }]
424
+ ];
425
+ const operatorMap = map.fromEntries(operatorEntries);
426
+ /** @type {(op: string) => JsToken} */
427
+ const getOperatorToken = op => at(op)(operatorMap) ?? { kind: 'error', message: 'invalid token' };
428
+ /** @type {(op: string) => Boolean} */
429
+ const hasOperatorToken = op => at(op)(operatorMap) !== null;
430
+ /** @type {(state: InitialState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
431
+ const initialStateOp = create(state => () => [[{ kind: 'error', message: 'unexpected character' }], state])([
432
+ rangeFunc(rangeOneNine)(() => input => [empty, { kind: 'number', value: fromCharCode(input), b: startNumber(input), numberKind: 'int' }]),
433
+ rangeSetFunc(rangeIdStart)(() => input => [empty, { kind: 'id', value: fromCharCode(input) }]),
434
+ rangeSetFunc(rangeSetWhiteSpace)(state => () => [empty, { kind: 'ws' }]),
435
+ rangeSetFunc(rangeSetNewLine)(state => () => [empty, { kind: 'nl' }]),
436
+ rangeFunc(one(quotationMark))(() => () => [empty, { kind: 'string', value: '' }]),
437
+ rangeFunc(one(digit0))(() => input => [empty, { kind: 'number', value: fromCharCode(input), b: startNumber(input), numberKind: '0' }]),
438
+ rangeSetFunc(rangeOpStart)(() => input => [empty, { kind: 'op', value: fromCharCode(input) }])
439
+ ]);
440
+ /** @type {(state: ParseNumberState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
441
+ const invalidNumberToToken = () => input => {
442
+ const next = tokenizeOp({ kind: 'initial' })(input);
443
+ return [{ first: { kind: 'error', message: 'invalid number' }, tail: next[0] }, next[1]];
444
+ };
445
+ /** @type {(state: ParseNumberState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
446
+ const fullStopToToken = state => input => {
447
+ switch (state.numberKind) {
448
+ case '0':
449
+ case 'int': return [empty, { kind: 'number', value: appendChar(state.value)(input), b: state.b, numberKind: '.' }];
450
+ default: return tokenizeOp({ kind: 'invalidNumber' })(input);
451
+ }
452
+ };
453
+ /** @type {(state: ParseNumberState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
454
+ const digit0ToToken = state => input => {
455
+ switch (state.numberKind) {
456
+ case '0': return tokenizeOp({ kind: 'invalidNumber' })(input);
457
+ case '.':
458
+ case 'fractional': return [empty, { kind: 'number', value: appendChar(state.value)(input), b: addFracDigit(input)(state.b), numberKind: 'fractional' }];
459
+ case 'e':
460
+ case 'e+':
461
+ case 'e-':
462
+ case 'expDigits': return [empty, { kind: 'number', value: appendChar(state.value)(input), b: addExpDigit(input)(state.b), numberKind: 'expDigits' }];
463
+ default: return [empty, { kind: 'number', value: appendChar(state.value)(input), b: addIntDigit(input)(state.b), numberKind: state.numberKind }];
464
+ }
465
+ };
466
+ /** @type {(state: ParseNumberState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
467
+ const digit19ToToken = state => input => {
468
+ switch (state.numberKind) {
469
+ case '0': return tokenizeOp({ kind: 'invalidNumber' })(input);
470
+ case '.':
471
+ case 'fractional': return [empty, { kind: 'number', value: appendChar(state.value)(input), b: addFracDigit(input)(state.b), numberKind: 'fractional' }];
472
+ case 'e':
473
+ case 'e+':
474
+ case 'e-':
475
+ case 'expDigits': return [empty, { kind: 'number', value: appendChar(state.value)(input), b: addExpDigit(input)(state.b), numberKind: 'expDigits' }];
476
+ default: return [empty, { kind: 'number', value: appendChar(state.value)(input), b: addIntDigit(input)(state.b), numberKind: 'int' }];
477
+ }
478
+ };
479
+ /** @type {(state: ParseNumberState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
480
+ const expToToken = state => input => {
481
+ switch (state.numberKind) {
482
+ case '0':
483
+ case 'int':
484
+ case 'fractional': return [empty, { kind: 'number', value: appendChar(state.value)(input), b: state.b, numberKind: 'e' }];
485
+ default: return tokenizeOp({ kind: 'invalidNumber' })(input);
486
+ }
487
+ };
488
+ /** @type {(state: ParseNumberState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
489
+ const hyphenMinusToToken = state => input => {
490
+ switch (state.numberKind) {
491
+ case 'e': return [empty, { kind: 'number', value: appendChar(state.value)(input), b: { ...state.b, es: -1 }, numberKind: 'e-' }];
492
+ default: return terminalToToken(state)(input);
493
+ }
494
+ };
495
+ /** @type {(state: ParseNumberState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
496
+ const plusSignToToken = state => input => {
497
+ switch (state.numberKind) {
498
+ case 'e': return [empty, { kind: 'number', value: appendChar(state.value)(input), b: state.b, numberKind: 'e+' }];
499
+ default: return tokenizeOp({ kind: 'invalidNumber' })(input);
500
+ }
501
+ };
502
+ /** @type {(state: ParseNumberState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
503
+ const terminalToToken = state => input => {
504
+ switch (state.numberKind) {
505
+ case '.':
506
+ case 'e':
507
+ case 'e+':
508
+ case 'e-':
509
+ {
510
+ const next = tokenizeOp({ kind: 'initial' })(input);
511
+ return [{ first: { kind: 'error', message: 'invalid number' }, tail: next[0] }, next[1]];
512
+ }
513
+ default:
514
+ {
515
+ const next = tokenizeOp({ kind: 'initial' })(input);
516
+ return [{ first: bufferToNumberToken(state), tail: next[0] }, next[1]];
517
+ }
518
+ }
519
+ };
520
+ /** @type {(state: ParseNumberState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
521
+ const bigintToToken = state => input => {
522
+ switch (state.numberKind) {
523
+ case '0':
524
+ case 'int':
525
+ {
526
+ return [empty, { kind: 'number', value: state.value, b: state.b, numberKind: 'bigint' }];
527
+ }
528
+ default:
529
+ {
530
+ const next = tokenizeOp({ kind: 'initial' })(input);
531
+ return [{ first: { kind: 'error', message: 'invalid number' }, tail: next[0] }, next[1]];
532
+ }
533
+ }
534
+ };
535
+ /** @type {(state: ParseNumberState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
536
+ const parseNumberStateOp = create(invalidNumberToToken)([
537
+ rangeFunc(one(fullStop))(fullStopToToken),
538
+ rangeFunc(one(digit0))(digit0ToToken),
539
+ rangeFunc(rangeOneNine)(digit19ToToken),
540
+ rangeSetFunc([one(latinSmallLetterE), one(latinCapitalLetterE)])(expToToken),
541
+ rangeFunc(one(hyphenMinus))(hyphenMinusToToken),
542
+ rangeFunc(one(plusSign))(plusSignToToken),
543
+ rangeSetFunc(rangeSetTerminalForNumber)(terminalToToken),
544
+ rangeFunc(one(latinSmallLetterN))(bigintToToken),
545
+ ]);
546
+ /** @type {(state: InvalidNumberState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
547
+ const invalidNumberStateOp = create(() => () => [empty, { kind: 'invalidNumber' }])([
548
+ rangeSetFunc(rangeSetTerminalForNumber)(() => input => {
549
+ const next = tokenizeOp({ kind: 'initial' })(input);
550
+ return [{ first: { kind: 'error', message: 'invalid number' }, tail: next[0] }, next[1]];
551
+ })
552
+ ]);
553
+ /** @type {(state: ParseMinusState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
554
+ const parseMinusStateOp = create(() => input => tokenizeOp({ kind: 'op', value: '-' })(input))([
555
+ rangeFunc(one(fullStop))(() => input => tokenizeOp({ kind: 'invalidNumber' })(input)),
556
+ rangeFunc(one(digit0))(() => () => [empty, { kind: 'number', value: '-0', b: startNegativeNumber, numberKind: '0' }]),
557
+ rangeFunc(rangeOneNine)(() => input => [empty, { kind: 'number', value: appendChar('-')(input), b: addIntDigit(input)(startNegativeNumber), numberKind: 'int' }]),
558
+ ]);
559
+ /** @type {(state: ParseStringState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
560
+ const parseStringStateOp = create(state => input => [empty, { kind: 'string', value: appendChar(state.value)(input) }])([
561
+ rangeFunc(one(quotationMark))(state => () => [[{ kind: 'string', value: state.value }], { kind: 'initial' }]),
562
+ rangeFunc(one(reverseSolidus))(state => () => [empty, { kind: 'escapeChar', value: state.value }])
563
+ ]);
564
+ /** @type {(state: ParseEscapeCharState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
565
+ const parseEscapeDefault = state => input => {
566
+ const next = tokenizeOp({ kind: 'string', value: state.value })(input);
567
+ return [{ first: { kind: 'error', message: 'unescaped character' }, tail: next[0] }, next[1]];
568
+ };
569
+ /** @type {(state: ParseEscapeCharState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
570
+ const parseEscapeCharStateOp = create(parseEscapeDefault)([
571
+ rangeSetFunc([one(quotationMark), one(reverseSolidus), one(solidus)])(state => input => [empty, { kind: 'string', value: appendChar(state.value)(input) }]),
572
+ rangeFunc(one(latinSmallLetterB))(state => () => [empty, { kind: 'string', value: appendChar(state.value)(backspace) }]),
573
+ rangeFunc(one(latinSmallLetterF))(state => () => [empty, { kind: 'string', value: appendChar(state.value)(ff) }]),
574
+ rangeFunc(one(latinSmallLetterN))(state => () => [empty, { kind: 'string', value: appendChar(state.value)(lf) }]),
575
+ rangeFunc(one(latinSmallLetterR))(state => () => [empty, { kind: 'string', value: appendChar(state.value)(cr) }]),
576
+ rangeFunc(one(latinSmallLetterT))(state => () => [empty, { kind: 'string', value: appendChar(state.value)(ht) }]),
577
+ rangeFunc(one(latinSmallLetterU))(state => () => [empty, { kind: 'unicodeChar', value: state.value, unicode: 0, hexIndex: 0 }]),
578
+ ]);
579
+ /** @type {(state: ParseUnicodeCharState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
580
+ const parseUnicodeCharDefault = state => input => {
581
+ const next = tokenizeOp({ kind: 'string', value: state.value })(input);
582
+ return [{ first: { kind: 'error', message: 'invalid hex value' }, tail: next[0] }, next[1]];
583
+ };
584
+ /** @type {(offser: number) => (state: ParseUnicodeCharState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
585
+ const parseUnicodeCharHex = offset => state => input => {
586
+ const hexValue = input - offset;
587
+ const newUnicode = state.unicode | (hexValue << (3 - state.hexIndex) * 4);
588
+ return [empty, state.hexIndex === 3 ?
589
+ { kind: 'string', value: appendChar(state.value)(newUnicode) } :
590
+ { kind: 'unicodeChar', value: state.value, unicode: newUnicode, hexIndex: state.hexIndex + 1 }];
591
+ };
592
+ /** @type {(state: ParseUnicodeCharState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
593
+ const parseUnicodeCharStateOp = create(parseUnicodeCharDefault)([
594
+ rangeFunc(digitRange)(parseUnicodeCharHex(digit0)),
595
+ rangeFunc(rangeSmallAF)(parseUnicodeCharHex(latinSmallLetterA - 10)),
596
+ rangeFunc(rangeCapitalAF)(parseUnicodeCharHex(latinCapitalLetterA - 10))
597
+ ]);
598
+ /** @type {(s: string) => JsToken} */
599
+ const idToToken = s => at(s)(keywordMap) ?? { kind: 'id', value: s };
600
+ /** @type {(state: ParseIdState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
601
+ const parseIdDefault = state => input => {
602
+ const keyWordToken = idToToken(state.value);
603
+ const next = tokenizeOp({ kind: 'initial' })(input);
604
+ return [{ first: keyWordToken, tail: next[0] }, next[1]];
605
+ };
606
+ /** @type {(state: ParseIdState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
607
+ const parseIdStateOp = create(parseIdDefault)([
608
+ rangeSetFunc(rangeId)(state => input => [empty, { kind: 'id', value: appendChar(state.value)(input) }])
609
+ ]);
610
+ /** @type {(state: ParseOperatorState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
611
+ const parseOperatorStateOp = state => input => {
612
+ const nextStateValue = appendChar(state.value)(input);
613
+ if (hasOperatorToken(nextStateValue))
614
+ return [empty, { kind: 'op', value: nextStateValue }];
615
+ const next = tokenizeOp({ kind: 'initial' })(input);
616
+ return [{ first: getOperatorToken(state.value), tail: next[0] }, next[1]];
617
+ };
618
+ /** @type {(state: ParseWhitespaceState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
619
+ const parseWhitespaceDefault = state => input => {
620
+ const next = tokenizeOp({ kind: 'initial' })(input);
621
+ return [{ first: { kind: 'ws' }, tail: next[0] }, next[1]];
622
+ };
623
+ /** @type {(state: ParseWhitespaceState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
624
+ const parseWhitespaceStateOp = create(parseWhitespaceDefault)([
625
+ rangeSetFunc(rangeSetWhiteSpace)(state => () => [empty, state]),
626
+ rangeSetFunc(rangeSetNewLine)(state => () => [empty, { kind: 'nl' }])
627
+ ]);
628
+ /** @type {(state: ParseNewLineState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
629
+ const parseNewLineDefault = state => input => {
630
+ const next = tokenizeOp({ kind: 'initial' })(input);
631
+ return [{ first: { kind: 'nl' }, tail: next[0] }, next[1]];
632
+ };
633
+ /** @type {(state: ParseNewLineState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
634
+ const parseNewLineStateOp = create(parseNewLineDefault)([
635
+ rangeSetFunc(rangeSetWhiteSpace)(state => () => [empty, state]),
636
+ rangeSetFunc(rangeSetNewLine)(state => () => [empty, state])
637
+ ]);
638
+ /** @type {(state: EofState) => (input: number) => readonly[list.List<JsToken>, TokenizerState]} */
639
+ const eofStateOp = create(state => () => [[{ kind: 'error', message: 'eof' }], state])([]);
640
+ /** @type {operator.StateScan<number, TokenizerState, list.List<JsToken>>} */
641
+ const tokenizeCharCodeOp = state => {
642
+ switch (state.kind) {
643
+ case 'initial': return initialStateOp(state);
644
+ case 'id': return parseIdStateOp(state);
645
+ case 'string': return parseStringStateOp(state);
646
+ case 'escapeChar': return parseEscapeCharStateOp(state);
647
+ case 'unicodeChar': return parseUnicodeCharStateOp(state);
648
+ case 'invalidNumber': return invalidNumberStateOp(state);
649
+ case 'number': return parseNumberStateOp(state);
650
+ case 'op': return parseOperatorStateOp(state);
651
+ case '-': return parseMinusStateOp(state);
652
+ case 'ws': return parseWhitespaceStateOp(state);
653
+ case 'nl': return parseNewLineStateOp(state);
654
+ case 'eof': return eofStateOp(state);
655
+ }
656
+ };
657
+ /** @type {(state: TokenizerState) => readonly[list.List<JsToken>, TokenizerState]} */
658
+ const tokenizeEofOp = state => {
659
+ switch (state.kind) {
660
+ case 'initial': return [empty, { kind: 'eof' }];
661
+ case 'id': return [[idToToken(state.value)], { kind: 'eof' }];
662
+ case 'string':
663
+ case 'escapeChar':
664
+ case 'unicodeChar': return [[{ kind: 'error', message: '" are missing' }], { kind: 'eof' }];
665
+ case 'invalidNumber': return [[{ kind: 'error', message: 'invalid number' }], { kind: 'eof' }];
666
+ case 'number':
667
+ switch (state.numberKind) {
668
+ case '.':
669
+ case 'e':
670
+ case 'e+':
671
+ case 'e-': return [[{ kind: 'error', message: 'invalid number' }], { kind: 'invalidNumber', }];
672
+ default: return [[bufferToNumberToken(state)], { kind: 'eof' }];
673
+ }
674
+ case 'op': return [[getOperatorToken(state.value)], { kind: 'eof' }];
675
+ case '-': return [[{ kind: '-' }], { kind: 'eof' }];
676
+ case 'ws': return [[{ kind: 'ws' }], { kind: 'eof' }];
677
+ case 'nl': return [[{ kind: 'nl' }], { kind: 'eof' }];
678
+ case 'eof': return [[{ kind: 'error', message: 'eof' }], state];
679
+ }
680
+ };
681
+ /** @type {operator.StateScan<CharCodeOrEof, TokenizerState, list.List<JsToken>>} */
682
+ const tokenizeOp = state => input => input === null ? tokenizeEofOp(state) : tokenizeCharCodeOp(state)(input);
683
+ const scanTokenize = stateScan(tokenizeOp);
684
+ const initial = scanTokenize({ kind: 'initial' });
685
+ /** @type {(input: list.List<number>) => list.List<JsToken>} */
686
+ export const tokenize = input => flat(initial(flat([/** @type {list.List<CharCodeOrEof>} */ (input), [null]])));