functionalscript 0.44.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/README.md +5 -3
  2. package/fjs/asn.1/module.f.mjs +8 -1
  3. package/fjs/asn.1/proof.f.d.mts +15 -0
  4. package/fjs/asn.1/proof.f.mjs +31 -3
  5. package/fjs/asserts/module.f.d.mts +14 -0
  6. package/fjs/asserts/module.f.mjs +20 -0
  7. package/fjs/asserts/proof.f.d.mts +3 -0
  8. package/fjs/asserts/proof.f.mjs +15 -1
  9. package/fjs/basen/base128/module.f.mjs +22 -5
  10. package/fjs/basen/base128/proof.f.d.mts +3 -1
  11. package/fjs/basen/base128/proof.f.mjs +3 -1
  12. package/fjs/basen/base64/module.f.mjs +7 -3
  13. package/fjs/basen/base64/proof.f.d.mts +3 -1
  14. package/fjs/basen/base64/proof.f.mjs +7 -4
  15. package/fjs/basen/cbase32/proof.f.d.mts +3 -1
  16. package/fjs/basen/cbase32/proof.f.mjs +3 -1
  17. package/fjs/bnf/data/module.f.d.mts +32 -6
  18. package/fjs/bnf/data/module.f.mjs +112 -7
  19. package/fjs/bnf/data/proof.f.d.mts +2 -0
  20. package/fjs/bnf/data/proof.f.mjs +74 -4
  21. package/fjs/bnf/data/types.d.ts +20 -2
  22. package/fjs/bnf/descent/module.f.d.mts +34 -5
  23. package/fjs/bnf/descent/module.f.mjs +176 -54
  24. package/fjs/bnf/descent/proof.f.d.mts +3 -0
  25. package/fjs/bnf/descent/proof.f.mjs +189 -27
  26. package/fjs/bnf/descent/types.d.ts +24 -18
  27. package/fjs/bnf/ll1/module.f.d.mts +74 -6
  28. package/fjs/bnf/ll1/module.f.mjs +297 -95
  29. package/fjs/bnf/ll1/proof.f.d.mts +17 -2
  30. package/fjs/bnf/ll1/proof.f.mjs +372 -137
  31. package/fjs/bnf/ll1/types.d.ts +25 -27
  32. package/fjs/bnf/matcher/module.f.d.mts +66 -0
  33. package/fjs/bnf/matcher/module.f.mjs +81 -0
  34. package/fjs/bnf/matcher/proof.f.d.mts +10 -0
  35. package/fjs/bnf/matcher/proof.f.mjs +79 -0
  36. package/fjs/bnf/matcher/types.d.ts +54 -0
  37. package/fjs/bnf/module.f.d.mts +15 -6
  38. package/fjs/bnf/module.f.mjs +52 -11
  39. package/fjs/bnf/proof.f.d.mts +2 -0
  40. package/fjs/bnf/proof.f.mjs +79 -3
  41. package/fjs/bnf/testlib.f.d.mts +31 -0
  42. package/fjs/bnf/testlib.f.mjs +80 -0
  43. package/fjs/bnf/token_symbol/module.f.d.mts +4 -3
  44. package/fjs/bnf/token_symbol/module.f.mjs +7 -6
  45. package/fjs/bnf/token_symbol/proof.f.mjs +5 -2
  46. package/fjs/bnf/token_symbol/types.d.ts +2 -2
  47. package/fjs/bnf/types.d.ts +10 -3
  48. package/fjs/cas/cli/module.f.d.mts +1 -1
  49. package/fjs/cas/cli/module.f.mjs +14 -20
  50. package/fjs/cas/cli/proof.f.d.mts +4 -4
  51. package/fjs/cas/cli/proof.f.mjs +47 -34
  52. package/fjs/cas/evo/module.f.d.mts +71 -31
  53. package/fjs/cas/evo/module.f.mjs +223 -138
  54. package/fjs/cas/evo/proof.f.d.mts +10 -1
  55. package/fjs/cas/evo/proof.f.mjs +311 -226
  56. package/fjs/cas/evo/types.d.ts +45 -9
  57. package/fjs/cas/module.f.d.mts +18 -32
  58. package/fjs/cas/module.f.mjs +164 -176
  59. package/fjs/cas/proof.f.d.mts +11 -8
  60. package/fjs/cas/proof.f.mjs +259 -147
  61. package/fjs/cas/types.d.ts +24 -10
  62. package/fjs/ci/common/module.f.d.mts +1 -1
  63. package/fjs/ci/common/module.f.mjs +1 -0
  64. package/fjs/ci/config/module.f.d.mts +3 -3
  65. package/fjs/ci/config/module.f.mjs +3 -3
  66. package/fjs/ci/module.f.d.mts +5 -5
  67. package/fjs/ci/module.f.mjs +8 -7
  68. package/fjs/ci/nix/module.f.d.mts +7 -5
  69. package/fjs/ci/nix/module.f.mjs +13 -12
  70. package/fjs/ci/nix/proof.f.d.mts +2 -0
  71. package/fjs/ci/nix/proof.f.mjs +4 -4
  72. package/fjs/ci/proof.f.d.mts +4 -2
  73. package/fjs/ci/proof.f.mjs +13 -8
  74. package/fjs/cli/module.f.d.mts +4 -6
  75. package/fjs/cli/module.f.mjs +4 -8
  76. package/fjs/cli/proof.f.d.mts +4 -2
  77. package/fjs/cli/proof.f.mjs +21 -18
  78. package/fjs/cli/types.d.ts +2 -3
  79. package/fjs/common/monoid/module.f.d.mts +70 -12
  80. package/fjs/common/monoid/module.f.mjs +177 -14
  81. package/fjs/common/monoid/proof.f.d.mts +12 -1
  82. package/fjs/common/monoid/proof.f.mjs +88 -4
  83. package/fjs/common/monoid/types.d.ts +23 -0
  84. package/fjs/crypto/hmac/module.f.mjs +2 -2
  85. package/fjs/crypto/secp/proof.f.d.mts +3 -1
  86. package/fjs/crypto/secp/proof.f.mjs +3 -1
  87. package/fjs/crypto/sha2/module.f.mjs +3 -1
  88. package/fjs/crypto/sha2/proof.f.d.mts +4 -1
  89. package/fjs/crypto/sha2/proof.f.mjs +27 -1
  90. package/fjs/crypto/sha2/types.d.ts +11 -0
  91. package/fjs/crypto/sign/module.f.mjs +2 -2
  92. package/fjs/crypto/vdf/module.f.d.mts +23 -4
  93. package/fjs/crypto/vdf/module.f.mjs +6 -4
  94. package/fjs/dev/module.f.d.mts +17 -5
  95. package/fjs/dev/module.f.mjs +60 -30
  96. package/fjs/dev/update/module.f.d.mts +11 -3
  97. package/fjs/dev/update/module.f.mjs +16 -11
  98. package/fjs/dev/update/proof.f.d.mts +4 -3
  99. package/fjs/dev/update/proof.f.mjs +11 -7
  100. package/fjs/djs/module.f.d.mts +13 -5
  101. package/fjs/djs/module.f.mjs +31 -16
  102. package/fjs/djs/parser/module.f.d.mts +16 -3
  103. package/fjs/djs/parser/module.f.mjs +135 -16
  104. package/fjs/djs/parser/proof.f.d.mts +8 -1
  105. package/fjs/djs/parser/proof.f.mjs +287 -13
  106. package/fjs/djs/parser/types.d.ts +7 -1
  107. package/fjs/djs/proof.f.d.mts +20 -1
  108. package/fjs/djs/proof.f.mjs +190 -12
  109. package/fjs/djs/serializer/module.f.d.mts +25 -8
  110. package/fjs/djs/serializer/module.f.mjs +66 -19
  111. package/fjs/djs/serializer/proof.f.d.mts +5 -0
  112. package/fjs/djs/serializer/proof.f.mjs +23 -1
  113. package/fjs/djs/tokenizer/module.f.d.mts +17 -5
  114. package/fjs/djs/tokenizer/module.f.mjs +120 -73
  115. package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
  116. package/fjs/djs/tokenizer/proof.f.mjs +86 -67
  117. package/fjs/djs/transpiler/module.f.d.mts +13 -19
  118. package/fjs/djs/transpiler/module.f.mjs +79 -72
  119. package/fjs/djs/transpiler/types.d.ts +29 -0
  120. package/fjs/djs/types.d.ts +7 -1
  121. package/fjs/effects/list/module.f.d.mts +23 -12
  122. package/fjs/effects/list/module.f.mjs +16 -12
  123. package/fjs/effects/list/types.d.ts +27 -7
  124. package/fjs/effects/memory/module.f.d.mts +6 -3
  125. package/fjs/effects/memory/module.f.mjs +7 -7
  126. package/fjs/effects/memory/proof.f.d.mts +4 -0
  127. package/fjs/effects/memory/proof.f.mjs +18 -9
  128. package/fjs/effects/memory/types.d.ts +4 -3
  129. package/fjs/effects/mock/module.f.d.mts +28 -4
  130. package/fjs/effects/mock/module.f.mjs +39 -5
  131. package/fjs/effects/mock/types.d.ts +10 -1
  132. package/fjs/effects/module.d.mts +12 -2
  133. package/fjs/effects/module.f.d.mts +469 -281
  134. package/fjs/effects/module.f.mjs +538 -299
  135. package/fjs/effects/module.mjs +11 -2
  136. package/fjs/effects/node/memory/module.d.mts +7 -2
  137. package/fjs/effects/node/memory/module.mjs +9 -5
  138. package/fjs/effects/node/memory/proof.d.mts +2 -0
  139. package/fjs/effects/node/memory/proof.mjs +12 -5
  140. package/fjs/effects/node/module.d.mts +8 -2
  141. package/fjs/effects/node/module.f.d.mts +183 -43
  142. package/fjs/effects/node/module.f.mjs +260 -62
  143. package/fjs/effects/node/module.mjs +61 -50
  144. package/fjs/effects/node/proof.f.d.mts +28 -2
  145. package/fjs/effects/node/proof.f.mjs +161 -42
  146. package/fjs/effects/node/types.d.ts +106 -18
  147. package/fjs/effects/node/virtual/module.f.d.mts +21 -4
  148. package/fjs/effects/node/virtual/module.f.mjs +113 -70
  149. package/fjs/effects/node/virtual/proof.f.d.mts +31 -2
  150. package/fjs/effects/node/virtual/proof.f.mjs +201 -8
  151. package/fjs/effects/proof.f.d.mts +69 -34
  152. package/fjs/effects/proof.f.mjs +413 -130
  153. package/fjs/effects/types.d.ts +161 -33
  154. package/fjs/emergent_testing/all.test.d.mts +8 -0
  155. package/fjs/emergent_testing/all.test.mjs +14 -0
  156. package/fjs/emergent_testing/module.f.d.mts +22 -10
  157. package/fjs/emergent_testing/module.f.mjs +119 -85
  158. package/fjs/emergent_testing/proof.f.d.mts +21 -7
  159. package/fjs/emergent_testing/proof.f.mjs +169 -35
  160. package/fjs/emergent_testing/types.d.ts +22 -4
  161. package/fjs/fsc/bnf.f.d.mts +3 -0
  162. package/fjs/fsc/bnf.f.mjs +4 -1
  163. package/fjs/fsc/json.f.d.mts +3 -0
  164. package/fjs/fsc/json.f.mjs +4 -1
  165. package/fjs/fsc/module.f.d.mts +9 -0
  166. package/fjs/fsc/module.f.mjs +5 -3
  167. package/fjs/fsm/module.f.d.mts +14 -4
  168. package/fjs/fsm/module.f.mjs +54 -37
  169. package/fjs/fsm/proof.f.d.mts +5 -0
  170. package/fjs/fsm/proof.f.mjs +87 -115
  171. package/fjs/js/keywords/module.f.d.mts +52 -0
  172. package/fjs/js/keywords/module.f.mjs +72 -0
  173. package/fjs/{emergent_testing/scenarios/return-value.pass.d.ts → js/keywords/proof.f.d.mts} +1 -1
  174. package/fjs/js/keywords/proof.f.mjs +13 -0
  175. package/fjs/js/tokenizer/module.f.d.mts +30 -3
  176. package/fjs/js/tokenizer/module.f.mjs +161 -211
  177. package/fjs/js/tokenizer/proof.f.d.mts +1 -0
  178. package/fjs/js/tokenizer/proof.f.mjs +54 -24
  179. package/fjs/js/tokenizer/types.d.ts +33 -24
  180. package/fjs/mcp/cas/module.f.d.mts +1 -6
  181. package/fjs/mcp/cas/module.f.mjs +55 -51
  182. package/fjs/mcp/cas/proof.f.d.mts +15 -0
  183. package/fjs/mcp/cas/proof.f.mjs +174 -0
  184. package/fjs/mcp/evo/module.f.d.mts +19 -10
  185. package/fjs/mcp/evo/module.f.mjs +48 -27
  186. package/fjs/mcp/evo/proof.f.d.mts +6 -1
  187. package/fjs/mcp/evo/proof.f.mjs +115 -31
  188. package/fjs/mcp/module.f.d.mts +39 -4
  189. package/fjs/mcp/module.f.mjs +14 -12
  190. package/fjs/mcp/proof.f.d.mts +13 -1
  191. package/fjs/mcp/proof.f.mjs +120 -61
  192. package/fjs/media/html/module.f.d.mts +12 -0
  193. package/fjs/media/html/module.f.mjs +7 -5
  194. package/fjs/media/html/proof.f.d.mts +3 -0
  195. package/fjs/media/html/proof.f.mjs +4 -1
  196. package/fjs/media/json/extended/module.f.d.mts +82 -0
  197. package/fjs/media/json/extended/module.f.mjs +153 -0
  198. package/fjs/media/json/extended/proof.f.d.mts +42 -0
  199. package/fjs/media/json/extended/proof.f.mjs +127 -0
  200. package/fjs/media/json/extended/types.d.ts +23 -0
  201. package/fjs/media/json/module.f.d.mts +8 -2
  202. package/fjs/media/json/module.f.mjs +43 -41
  203. package/fjs/media/json/number/module.f.d.mts +59 -0
  204. package/fjs/media/json/number/module.f.mjs +136 -0
  205. package/fjs/media/json/number/proof.f.d.mts +24 -0
  206. package/fjs/media/json/number/proof.f.mjs +86 -0
  207. package/fjs/media/json/number/types.d.ts +28 -0
  208. package/fjs/media/json/parser/module.f.d.mts +25 -13
  209. package/fjs/media/json/parser/module.f.mjs +133 -72
  210. package/fjs/media/json/parser/proof.f.d.mts +5 -0
  211. package/fjs/media/json/parser/proof.f.mjs +31 -1
  212. package/fjs/media/json/parser/types.d.ts +38 -14
  213. package/fjs/media/json/rtti/module.f.d.mts +1 -1
  214. package/fjs/media/json/rtti/module.f.mjs +1 -1
  215. package/fjs/media/json/rtti/proof.f.d.mts +3 -0
  216. package/fjs/media/json/rtti/proof.f.mjs +12 -12
  217. package/fjs/media/json/schema/module.f.d.mts +61 -27
  218. package/fjs/media/json/schema/module.f.mjs +218 -63
  219. package/fjs/media/json/schema/proof.f.d.mts +41 -1
  220. package/fjs/media/json/schema/proof.f.mjs +220 -9
  221. package/fjs/media/json/serializer/module.f.d.mts +44 -0
  222. package/fjs/media/json/serializer/module.f.mjs +71 -9
  223. package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
  224. package/fjs/media/json/tokenizer/module.f.mjs +31 -8
  225. package/fjs/media/json/tokenizer/proof.f.d.mts +6 -0
  226. package/fjs/media/json/tokenizer/proof.f.mjs +62 -21
  227. package/fjs/media/json/types.d.ts +36 -10
  228. package/fjs/media/lock/module.f.d.mts +100 -0
  229. package/fjs/media/lock/module.f.mjs +125 -0
  230. package/fjs/media/lock/proof.f.d.mts +33 -0
  231. package/fjs/media/lock/proof.f.mjs +196 -0
  232. package/fjs/media/lock/types.d.ts +15 -0
  233. package/fjs/media/module.f.d.mts +6 -5
  234. package/fjs/media/module.f.mjs +8 -7
  235. package/fjs/media/nix/module.f.d.mts +13 -0
  236. package/fjs/media/nix/module.f.mjs +4 -2
  237. package/fjs/media/nix/proof.f.d.mts +3 -0
  238. package/fjs/media/nix/proof.f.mjs +4 -1
  239. package/fjs/media/note/module.f.d.mts +121 -0
  240. package/fjs/media/note/module.f.mjs +131 -0
  241. package/fjs/media/note/proof.f.d.mts +29 -0
  242. package/fjs/media/note/proof.f.mjs +150 -0
  243. package/fjs/media/note/types.d.ts +10 -0
  244. package/fjs/media/proof.f.d.mts +4 -1
  245. package/fjs/media/proof.f.mjs +40 -21
  246. package/fjs/media/revision/module.f.d.mts +83 -7
  247. package/fjs/media/revision/module.f.mjs +127 -23
  248. package/fjs/media/revision/proof.f.d.mts +14 -0
  249. package/fjs/media/revision/proof.f.mjs +93 -2
  250. package/fjs/media/revision/types.d.ts +34 -5
  251. package/fjs/media/type/module.f.d.mts +53 -18
  252. package/fjs/media/type/module.f.mjs +87 -97
  253. package/fjs/media/type/proof.f.d.mts +17 -0
  254. package/fjs/media/type/proof.f.mjs +73 -13
  255. package/fjs/module.d.mts +5 -0
  256. package/fjs/module.f.d.mts +8 -0
  257. package/fjs/module.f.mjs +33 -10
  258. package/fjs/module.mjs +6 -0
  259. package/fjs/nanvm/proof.f.mjs +3 -3
  260. package/fjs/nanvm/rust/module.f.mjs +1 -1
  261. package/fjs/nanvm/update/module.f.d.mts +4 -4
  262. package/fjs/nanvm/update/module.f.mjs +8 -9
  263. package/fjs/nanvm/update/proof.f.mjs +4 -3
  264. package/fjs/path/module.f.d.mts +8 -0
  265. package/fjs/path/module.f.mjs +4 -2
  266. package/fjs/proof.f.d.mts +7 -3
  267. package/fjs/proof.f.mjs +41 -12
  268. package/fjs/protocol/json_rpc/module.f.d.mts +3 -3
  269. package/fjs/protocol/json_rpc/module.f.mjs +10 -7
  270. package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
  271. package/fjs/protocol/json_rpc/proof.f.mjs +26 -5
  272. package/fjs/protocol/mcp/module.f.d.mts +10 -13
  273. package/fjs/protocol/mcp/module.f.mjs +74 -58
  274. package/fjs/protocol/mcp/proof.f.d.mts +16 -3
  275. package/fjs/protocol/mcp/proof.f.mjs +224 -69
  276. package/fjs/protocol/mcp/stdio/module.f.d.mts +17 -11
  277. package/fjs/protocol/mcp/stdio/module.f.mjs +39 -33
  278. package/fjs/protocol/mcp/stdio/proof.f.d.mts +5 -3
  279. package/fjs/protocol/mcp/stdio/proof.f.mjs +46 -13
  280. package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
  281. package/fjs/protocol/mcp/types.d.ts +17 -6
  282. package/fjs/sul/id/module.f.d.mts +4 -0
  283. package/fjs/sul/id/module.f.mjs +6 -6
  284. package/fjs/sul/level/hash/module.f.d.mts +4 -1
  285. package/fjs/sul/level/hash/module.f.mjs +6 -4
  286. package/fjs/sul/level/hash/proof.f.d.mts +4 -0
  287. package/fjs/sul/level/hash/proof.f.mjs +7 -4
  288. package/fjs/sul/level/literal/module.f.d.mts +4 -1
  289. package/fjs/sul/level/literal/module.f.mjs +4 -3
  290. package/fjs/sul/level/literal/proof.f.d.mts +3 -0
  291. package/fjs/sul/level/literal/proof.f.mjs +4 -1
  292. package/fjs/sul/module.f.d.mts +5 -3
  293. package/fjs/sul/module.f.mjs +23 -17
  294. package/fjs/sul/proof.f.d.mts +4 -0
  295. package/fjs/sul/proof.f.mjs +5 -2
  296. package/fjs/text/ascii/module.f.d.mts +26 -0
  297. package/fjs/text/ascii/module.f.mjs +49 -1
  298. package/fjs/text/ascii/proof.f.d.mts +10 -0
  299. package/fjs/text/ascii/proof.f.mjs +33 -1
  300. package/fjs/text/code_point/module.f.d.mts +29 -3
  301. package/fjs/text/code_point/module.f.mjs +32 -9
  302. package/fjs/text/code_point/proof.f.d.mts +2 -0
  303. package/fjs/text/code_point/proof.f.mjs +39 -0
  304. package/fjs/text/module.f.d.mts +4 -2
  305. package/fjs/text/module.f.mjs +4 -3
  306. package/fjs/text/proof.f.d.mts +3 -0
  307. package/fjs/text/proof.f.mjs +4 -1
  308. package/fjs/text/sgr/module.f.d.mts +6 -5
  309. package/fjs/text/sgr/module.f.mjs +8 -8
  310. package/fjs/text/sgr/proof.f.d.mts +3 -0
  311. package/fjs/text/sgr/proof.f.mjs +4 -1
  312. package/fjs/text/utf16/module.f.d.mts +5 -1
  313. package/fjs/text/utf16/module.f.mjs +38 -35
  314. package/fjs/text/utf16/proof.f.d.mts +3 -1
  315. package/fjs/text/utf16/proof.f.mjs +19 -2
  316. package/fjs/text/utf8/module.f.d.mts +9 -5
  317. package/fjs/text/utf8/module.f.mjs +20 -20
  318. package/fjs/types/array/module.f.d.mts +2 -1
  319. package/fjs/types/array/module.f.mjs +16 -4
  320. package/fjs/types/bigfloat/module.f.d.mts +21 -1
  321. package/fjs/types/bigfloat/module.f.mjs +33 -7
  322. package/fjs/types/bigfloat/proof.f.d.mts +1 -0
  323. package/fjs/types/bigfloat/proof.f.mjs +46 -0
  324. package/fjs/types/bigint/module.f.d.mts +4 -0
  325. package/fjs/types/bigint/module.f.mjs +4 -3
  326. package/fjs/types/bit_vec/module.f.d.mts +10 -16
  327. package/fjs/types/bit_vec/module.f.mjs +99 -95
  328. package/fjs/types/bit_vec/proof.f.d.mts +6 -0
  329. package/fjs/types/bit_vec/proof.f.mjs +31 -5
  330. package/fjs/types/btree/find/module.f.d.mts +5 -1
  331. package/fjs/types/btree/find/module.f.mjs +5 -5
  332. package/fjs/types/btree/find/proof.f.d.mts +5 -1
  333. package/fjs/types/btree/find/proof.f.mjs +5 -3
  334. package/fjs/types/btree/module.f.d.mts +3 -0
  335. package/fjs/types/btree/module.f.mjs +3 -2
  336. package/fjs/types/btree/proof.f.d.mts +5 -1
  337. package/fjs/types/btree/proof.f.mjs +5 -3
  338. package/fjs/types/btree/remove/module.f.d.mts +11 -0
  339. package/fjs/types/btree/remove/module.f.mjs +10 -10
  340. package/fjs/types/btree/remove/proof.f.d.mts +3 -0
  341. package/fjs/types/btree/remove/proof.f.mjs +4 -1
  342. package/fjs/types/btree/set/module.f.d.mts +9 -0
  343. package/fjs/types/btree/set/module.f.mjs +14 -17
  344. package/fjs/types/btree/set/proof.f.d.mts +3 -0
  345. package/fjs/types/btree/set/proof.f.mjs +16 -1
  346. package/fjs/types/btree/types/module.f.d.mts +2 -1
  347. package/fjs/types/btree/types/module.f.mjs +2 -1
  348. package/fjs/types/byte_set/module.f.d.mts +20 -4
  349. package/fjs/types/byte_set/module.f.mjs +18 -8
  350. package/fjs/types/byte_set/proof.f.d.mts +3 -1
  351. package/fjs/types/byte_set/proof.f.mjs +10 -8
  352. package/fjs/types/function/compare/module.f.d.mts +3 -2
  353. package/fjs/types/function/compare/module.f.mjs +13 -5
  354. package/fjs/types/function/module.f.d.mts +8 -1
  355. package/fjs/types/function/module.f.mjs +8 -1
  356. package/fjs/types/function/operator/module.f.d.mts +2 -1
  357. package/fjs/types/function/operator/module.f.mjs +2 -2
  358. package/fjs/types/list/module.f.d.mts +10 -3
  359. package/fjs/types/list/module.f.mjs +6 -4
  360. package/fjs/types/list/proof.f.d.mts +4 -1
  361. package/fjs/types/list/proof.f.mjs +4 -2
  362. package/fjs/types/nibble_set/module.f.d.mts +2 -1
  363. package/fjs/types/nibble_set/module.f.mjs +2 -2
  364. package/fjs/types/nominal/module.f.d.mts +2 -1
  365. package/fjs/types/nominal/module.f.mjs +2 -1
  366. package/fjs/types/nullable/module.f.d.mts +26 -6
  367. package/fjs/types/nullable/module.f.mjs +25 -6
  368. package/fjs/types/nullable/proof.f.d.mts +4 -0
  369. package/fjs/types/nullable/proof.f.mjs +15 -0
  370. package/fjs/types/number/module.f.d.mts +4 -0
  371. package/fjs/types/number/module.f.mjs +4 -3
  372. package/fjs/types/object/module.f.d.mts +26 -4
  373. package/fjs/types/object/module.f.mjs +26 -7
  374. package/fjs/types/object/proof.f.d.mts +5 -2
  375. package/fjs/types/object/proof.f.mjs +6 -3
  376. package/fjs/types/object/structurally_same/module.f.d.mts +39 -0
  377. package/fjs/types/object/structurally_same/module.f.mjs +59 -0
  378. package/fjs/types/object/structurally_same/proof.f.d.mts +6 -0
  379. package/fjs/types/object/structurally_same/proof.f.mjs +73 -0
  380. package/fjs/types/ordered_map/module.f.d.mts +5 -0
  381. package/fjs/types/ordered_map/module.f.mjs +5 -4
  382. package/fjs/types/ordered_map/proof.f.d.mts +3 -0
  383. package/fjs/types/ordered_map/proof.f.mjs +4 -1
  384. package/fjs/types/patricia_trie/module.f.d.mts +2 -1
  385. package/fjs/types/patricia_trie/module.f.mjs +27 -12
  386. package/fjs/types/patricia_trie/proof.f.d.mts +3 -0
  387. package/fjs/types/patricia_trie/proof.f.mjs +4 -1
  388. package/fjs/types/prime_field/module.f.d.mts +3 -1
  389. package/fjs/types/prime_field/module.f.mjs +3 -2
  390. package/fjs/types/range/module.f.d.mts +2 -1
  391. package/fjs/types/range/module.f.mjs +2 -2
  392. package/fjs/types/range_map/module.f.d.mts +6 -0
  393. package/fjs/types/range_map/module.f.mjs +6 -9
  394. package/fjs/types/range_map/proof.f.d.mts +5 -1
  395. package/fjs/types/range_map/proof.f.mjs +5 -3
  396. package/fjs/types/range_set/module.f.d.mts +5 -0
  397. package/fjs/types/range_set/module.f.mjs +1 -0
  398. package/fjs/types/range_set/proof.f.d.mts +3 -0
  399. package/fjs/types/range_set/proof.f.mjs +4 -1
  400. package/fjs/types/result/module.d.mts +8 -0
  401. package/fjs/types/result/module.f.d.mts +37 -7
  402. package/fjs/types/result/module.f.mjs +38 -8
  403. package/fjs/types/result/module.mjs +9 -1
  404. package/fjs/types/result/proof.f.d.mts +5 -0
  405. package/fjs/types/result/proof.f.mjs +22 -2
  406. package/fjs/types/rtti/common/module.f.d.mts +44 -14
  407. package/fjs/types/rtti/common/module.f.mjs +42 -36
  408. package/fjs/types/rtti/common/proof.f.d.mts +4 -0
  409. package/fjs/types/rtti/common/proof.f.mjs +10 -7
  410. package/fjs/types/rtti/data/module.f.d.mts +134 -0
  411. package/fjs/types/rtti/data/module.f.mjs +1053 -0
  412. package/fjs/types/rtti/data/proof.f.d.mts +76 -0
  413. package/fjs/types/rtti/data/proof.f.mjs +589 -0
  414. package/fjs/types/rtti/data/types.d.ts +83 -0
  415. package/fjs/types/rtti/module.f.d.mts +12 -5
  416. package/fjs/types/rtti/module.f.mjs +7 -5
  417. package/fjs/types/rtti/parse/module.f.d.mts +48 -0
  418. package/fjs/types/rtti/parse/module.f.mjs +45 -34
  419. package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
  420. package/fjs/types/rtti/parse/proof.f.mjs +51 -52
  421. package/fjs/types/rtti/proof.f.d.mts +3 -1
  422. package/fjs/types/rtti/proof.f.mjs +6 -2
  423. package/fjs/types/rtti/ts/module.f.d.mts +68 -9
  424. package/fjs/types/rtti/ts/module.f.mjs +258 -30
  425. package/fjs/types/rtti/ts/proof.f.d.mts +44 -0
  426. package/fjs/types/rtti/ts/proof.f.mjs +152 -4
  427. package/fjs/types/rtti/ts/types.d.ts +25 -1
  428. package/fjs/types/rtti/types.d.ts +40 -0
  429. package/fjs/types/sorted_list/module.f.d.mts +4 -1
  430. package/fjs/types/sorted_list/module.f.mjs +21 -12
  431. package/fjs/types/sorted_list/proof.f.d.mts +3 -1
  432. package/fjs/types/sorted_list/proof.f.mjs +3 -1
  433. package/fjs/types/sorted_set/module.f.d.mts +49 -1
  434. package/fjs/types/sorted_set/module.f.mjs +26 -2
  435. package/fjs/types/sorted_set/proof.f.d.mts +4 -1
  436. package/fjs/types/sorted_set/proof.f.mjs +19 -2
  437. package/fjs/types/string/module.f.d.mts +4 -0
  438. package/fjs/types/string/module.f.mjs +4 -3
  439. package/fjs/types/string_set/module.f.d.mts +3 -1
  440. package/fjs/types/string_set/module.f.mjs +3 -2
  441. package/fjs/types/ts/module.f.d.mts +2 -0
  442. package/fjs/types/ts/module.f.mjs +3 -3
  443. package/fjs/types/ts/proof.f.d.mts +1 -0
  444. package/fjs/types/ts/proof.f.mjs +5 -0
  445. package/fjs/types/ts/types.d.ts +6 -1
  446. package/fjs/types/uint8array/module.f.d.mts +13 -2
  447. package/fjs/types/uint8array/module.f.mjs +20 -15
  448. package/fjs/website/module.f.d.mts +5 -2
  449. package/fjs/website/module.f.mjs +6 -8
  450. package/fjs/website/proof.f.mjs +2 -1
  451. package/package.json +3 -3
  452. package/fjs/asn.1/types.js +0 -6
  453. package/fjs/asserts/types.js +0 -6
  454. package/fjs/basen/types.js +0 -6
  455. package/fjs/bnf/data/types.js +0 -6
  456. package/fjs/bnf/descent/types.js +0 -6
  457. package/fjs/bnf/ll1/types.js +0 -6
  458. package/fjs/bnf/token_symbol/types.js +0 -6
  459. package/fjs/bnf/types.js +0 -6
  460. package/fjs/cas/evo/types.js +0 -7
  461. package/fjs/cas/types.js +0 -6
  462. package/fjs/ci/common/types.js +0 -1
  463. package/fjs/ci/nix/types.js +0 -6
  464. package/fjs/ci/types.js +0 -6
  465. package/fjs/cli/types.js +0 -6
  466. package/fjs/common/monoid/types.js +0 -6
  467. package/fjs/crypto/pow/types.js +0 -6
  468. package/fjs/crypto/secp/types.js +0 -6
  469. package/fjs/crypto/sha2/types.js +0 -6
  470. package/fjs/crypto/sign/types.js +0 -6
  471. package/fjs/crypto/vdf/types.js +0 -6
  472. package/fjs/dev/package_json/module.f.d.mts +0 -32
  473. package/fjs/dev/package_json/module.f.mjs +0 -37
  474. package/fjs/dev/package_json/proof.f.d.mts +0 -6
  475. package/fjs/dev/package_json/proof.f.mjs +0 -32
  476. package/fjs/dev/types.js +0 -6
  477. package/fjs/djs/ast/types.js +0 -8
  478. package/fjs/djs/parser/types.js +0 -7
  479. package/fjs/djs/tokenizer/types.js +0 -7
  480. package/fjs/djs/types.js +0 -7
  481. package/fjs/effects/eff/module.f.d.mts +0 -10
  482. package/fjs/effects/eff/module.f.mjs +0 -68
  483. package/fjs/effects/eff/proof.f.d.mts +0 -12
  484. package/fjs/effects/eff/proof.f.mjs +0 -66
  485. package/fjs/effects/eff/types.d.ts +0 -71
  486. package/fjs/effects/eff/types.js +0 -6
  487. package/fjs/effects/list/types.js +0 -6
  488. package/fjs/effects/memory/types.js +0 -6
  489. package/fjs/effects/mock/types.js +0 -6
  490. package/fjs/effects/node/types.js +0 -6
  491. package/fjs/effects/node/virtual/types.js +0 -7
  492. package/fjs/effects/types.js +0 -6
  493. package/fjs/emergent_testing/all.test.d.ts +0 -1
  494. package/fjs/emergent_testing/all.test.js +0 -5
  495. package/fjs/emergent_testing/scenarios/all.d.ts +0 -1
  496. package/fjs/emergent_testing/scenarios/all.js +0 -1
  497. package/fjs/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -6
  498. package/fjs/emergent_testing/scenarios/async-subtests.fail.js +0 -9
  499. package/fjs/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -6
  500. package/fjs/emergent_testing/scenarios/async-subtests.pass.js +0 -9
  501. package/fjs/emergent_testing/scenarios/async.fail.d.ts +0 -3
  502. package/fjs/emergent_testing/scenarios/async.fail.js +0 -6
  503. package/fjs/emergent_testing/scenarios/async.pass.d.ts +0 -3
  504. package/fjs/emergent_testing/scenarios/async.pass.js +0 -5
  505. package/fjs/emergent_testing/scenarios/fail.fail.d.ts +0 -3
  506. package/fjs/emergent_testing/scenarios/fail.fail.js +0 -3
  507. package/fjs/emergent_testing/scenarios/return-value.pass.js +0 -4
  508. package/fjs/emergent_testing/scenarios/thenable.pass.d.ts +0 -5
  509. package/fjs/emergent_testing/scenarios/thenable.pass.js +0 -11
  510. package/fjs/emergent_testing/scenarios/thenable2.pass.d.ts +0 -5
  511. package/fjs/emergent_testing/scenarios/thenable2.pass.js +0 -3
  512. package/fjs/emergent_testing/scenarios/throw.pass.d.ts +0 -5
  513. package/fjs/emergent_testing/scenarios/throw.pass.js +0 -3
  514. package/fjs/emergent_testing/types.js +0 -6
  515. package/fjs/js/tokenizer/types.js +0 -6
  516. package/fjs/media/html/types.js +0 -6
  517. package/fjs/media/json/parser/types.js +0 -6
  518. package/fjs/media/json/tokenizer/types.js +0 -6
  519. package/fjs/media/json/types.js +0 -13
  520. package/fjs/media/nix/types.js +0 -6
  521. package/fjs/media/revision/types.js +0 -8
  522. package/fjs/media/type/types.js +0 -6
  523. package/fjs/media/types.js +0 -7
  524. package/fjs/nanvm/types.js +0 -11
  525. package/fjs/protocol/json_rpc/types.js +0 -8
  526. package/fjs/protocol/mcp/types.js +0 -8
  527. package/fjs/sul/id/types.js +0 -6
  528. package/fjs/sul/level/hash/types.js +0 -6
  529. package/fjs/sul/level/literal/types.js +0 -6
  530. package/fjs/sul/types.js +0 -6
  531. package/fjs/text/sgr/types.js +0 -6
  532. package/fjs/text/types.js +0 -6
  533. package/fjs/text/utf16/types.js +0 -6
  534. package/fjs/text/utf8/types.js +0 -6
  535. package/fjs/types/array/types.js +0 -6
  536. package/fjs/types/bigfloat/types.js +0 -6
  537. package/fjs/types/bigint/types.js +0 -6
  538. package/fjs/types/bit_vec/types.js +0 -6
  539. package/fjs/types/btree/find/types.js +0 -6
  540. package/fjs/types/btree/types/types.js +0 -6
  541. package/fjs/types/byte_set/types.js +0 -6
  542. package/fjs/types/function/compare/types.js +0 -6
  543. package/fjs/types/function/operator/types.js +0 -6
  544. package/fjs/types/function/types.js +0 -6
  545. package/fjs/types/list/types.js +0 -6
  546. package/fjs/types/nibble_set/types.js +0 -6
  547. package/fjs/types/nominal/types.js +0 -6
  548. package/fjs/types/nullable/types.js +0 -6
  549. package/fjs/types/object/types.js +0 -8
  550. package/fjs/types/option/types.js +0 -6
  551. package/fjs/types/ordered_map/types.js +0 -6
  552. package/fjs/types/patricia_trie/types.js +0 -6
  553. package/fjs/types/phantom/types.js +0 -11
  554. package/fjs/types/prime_field/types.js +0 -6
  555. package/fjs/types/range/types.js +0 -6
  556. package/fjs/types/range_map/types.js +0 -6
  557. package/fjs/types/result/types.js +0 -6
  558. package/fjs/types/rtti/common/types.js +0 -1
  559. package/fjs/types/rtti/parse/types.js +0 -1
  560. package/fjs/types/rtti/ts/types.js +0 -1
  561. package/fjs/types/rtti/types.js +0 -1
  562. package/fjs/types/rtti/validate/module.f.d.mts +0 -6
  563. package/fjs/types/rtti/validate/module.f.mjs +0 -169
  564. package/fjs/types/rtti/validate/proof.f.d.mts +0 -125
  565. package/fjs/types/rtti/validate/proof.f.mjs +0 -437
  566. package/fjs/types/rtti/validate/types.d.ts +0 -6
  567. package/fjs/types/rtti/validate/types.js +0 -1
  568. package/fjs/types/sorted_list/types.js +0 -6
  569. package/fjs/types/sorted_set/types.js +0 -6
  570. package/fjs/types/string_set/types.js +0 -6
  571. package/fjs/types/ts/types.js +0 -8
@@ -4,28 +4,48 @@
4
4
  * Built from the serializable IR in `fjs/bnf/data`, this is one member of the
5
5
  * family of automaton builders that consume a {@link RuleSet}: it compiles the
6
6
  * grammar into a predictive {@link dispatchMap} and matches input into an AST
7
- * ({@link MatchResult}). It throws at build time (`can not merge …`) when the
8
- * grammar is not LL(1) a first/first conflict. Nullability is looked up from
9
- * {@link emptyTagMap} in `fjs/bnf/data` rather than re-derived here.
7
+ * ({@link MatchResult}). It throws at build time when the grammar is not
8
+ * LL(1): `can not merge …` for a first/first conflict, `left recursion …` for
9
+ * a rule reachable from itself in first position. Nullability is looked up
10
+ * from {@link emptyTagMap} in `fjs/bnf/data` rather than re-derived here.
11
+ *
12
+ * A rule is entered *before* its first symbol is consumed: the dispatch map
13
+ * only selects — a variant's branch, a repetition's next round — and every
14
+ * rule invocation builds a node of its own, so the AST is the one
15
+ * `fjs/bnf/descent` builds for the same grammar (see ./README.md). A `Repeat`
16
+ * rule is matched iteratively and produces one node holding a flat sequence
17
+ * of the items it matched.
18
+ *
19
+ * The caller passes physical symbols only; the matcher synthesizes the one
20
+ * logical EOF after them, so a grammar can dispatch on the end of input with
21
+ * the `eof` terminal. The position it does that at, the AST it builds, and the
22
+ * constructors that pair them are the shared layer in `fjs/bnf/matcher`.
10
23
  *
11
24
  * See `./types.ts` for the type-level API.
12
25
  *
13
26
  * @module
14
27
  *
28
+ * @import { CodePoint } from '../../text/utf16/types.ts'
15
29
  * @import { Properties } from '../../types/range_map/types.ts'
16
30
  * @import { StringSet } from '../../types/string_set/types.ts'
17
- * @import { EmptyTag, RuleSet } from '../data/types.ts'
31
+ * @import { List } from '../../types/list/types.ts'
32
+ * @import { RuleSet, Sequence } from '../data/types.ts'
33
+ * @import { Ast, AstResult, AstSequence, AstTag, Cursor } from '../matcher/types.ts'
18
34
  * @import { Rule as FRule } from '../types.ts'
19
- * @import { AstSequence, AstTag, Match, MatchResult, MatchRule, Remainder, _Dispatch, _DispatchMap, _DispatchResult, _DispatchRule } from './types.ts'
35
+ * @import { Match, MatchResult, Remainder, _Dispatch, _DispatchBranch, _DispatchMap, _DispatchResult, _DispatchRule } from './types.ts'
20
36
  */
21
37
 
22
38
  import { strictEqual } from '../../types/function/operator/module.f.mjs'
23
- import { toArray } from '../../types/list/module.f.mjs'
39
+ import { assertNotNullish } from '../../asserts/module.f.mjs'
40
+ import { identity } from '../../types/function/module.f.mjs'
41
+ import { concat, toArray } from '../../types/list/module.f.mjs'
24
42
  import { rangeMap } from '../../types/range_map/module.f.mjs'
43
+ import { contains as rangeContains } from '../../types/range/module.f.mjs'
25
44
  import { contains, set } from '../../types/string_set/module.f.mjs'
26
45
  import { rangeDecode } from '../module.f.mjs'
27
46
  import { definedEntries } from '../../types/object/module.f.mjs'
28
- import { emptyTagMap, toData } from '../data/module.f.mjs'
47
+ import { emptyTagMap, isRepeat, toData } from '../data/module.f.mjs'
48
+ import { leafAt, mrFail, mrSuccess, physicalIdx, symbolAt } from '../matcher/module.f.mjs'
29
49
 
30
50
  /** @type {Properties<_DispatchResult>} */
31
51
  const dispatchProps = {
@@ -47,83 +67,81 @@ const dispatchOp = rangeMap(dispatchProps)
47
67
  /**
48
68
  * Builds a dispatch map for a {@link RuleSet} to enable predictive parsing.
49
69
  *
70
+ * Each rule's entry holds the rule's first set as a range map. Only a variant
71
+ * reads the value under a symbol — the branch that lookahead selects; every
72
+ * other reader asks whether a symbol is in the set at all, which is how a
73
+ * repetition decides to start another round. `empty` is the branch a variant
74
+ * takes when no entry matches the lookahead — its nullable branch, absent
75
+ * when the variant cannot match empty.
76
+ *
77
+ * A rule referenced in first position while its own first set is still being
78
+ * computed is left recursion — a grammar no lookahead can decide, whose match
79
+ * would loop at the same position forever — so building throws
80
+ * (`left recursion …`) rather than letting the matcher diverge. The one
81
+ * self-reference with a sound reading is a repetition of itself: zero rounds
82
+ * match whatever the item does, so it dispatches on nothing and matches empty.
83
+ *
50
84
  * @type {(ruleSet: RuleSet) => _DispatchMap}
51
85
  */
52
86
  export const dispatchMap = ruleSet => {
53
87
 
54
88
  const nullMap = emptyTagMap(ruleSet)
55
89
 
56
- /** @type {(dr: _DispatchResult, name: string) => _DispatchResult} */
57
- const addRuleToDispatch = (dr, name) => {
58
- if (dr === null)
59
- return null
60
-
61
- return { tag: dr.tag, rules: [...dr.rules, name]}
62
- }
63
-
64
- /** @type {(dr: _DispatchResult, tag: string) => _DispatchResult} */
65
- const addTagToDispatch = (dr, tag) => {
66
- if (dr === null)
67
- return null
68
-
69
- return { tag, rules: dr.rules}
70
- }
71
-
72
90
  /** @type {(dm: _DispatchMap, name: string, current: StringSet) => _DispatchMap} */
73
91
  const dispatchRule = (dm, name, current) => {
74
92
  if (name in dm) { return dm }
75
93
  const newCurrent = set(name)(current)
76
94
  const rule = ruleSet[name]
95
+ /** @type {_DispatchRule} */
96
+ let dr
77
97
  if (typeof rule === 'number') {
78
- const range = rangeDecode(rule)
79
- const dispatch = dispatchOp.fromRange({tag: undefined, rules: []})(range)
80
- /** @type {_DispatchRule} */
81
- const dr = {emptyTag: undefined, rangeMap: dispatch}
82
- return { ...dm, [name]: dr }
98
+ dr = {
99
+ empty: undefined,
100
+ rangeMap: dispatchOp.fromRange({ tag: undefined, name })(rangeDecode(rule)),
101
+ }
83
102
  } else if (rule instanceof Array) {
84
- /** @type {EmptyTag} */
85
- let emptyTag = true
103
+ // A sequence's first set is the union of its items' first sets up
104
+ // to and including the first item that cannot match empty.
86
105
  /** @type {_Dispatch} */
87
- let result = []
106
+ let first = []
88
107
  for (const item of rule) {
89
108
  if (contains(item)(newCurrent)) {
90
- result = result.map(x => [addRuleToDispatch(x[0], item), x[1]])
91
- } else {
92
- dm = dispatchRule(dm, item, newCurrent)
93
- const dr = /** @type {_DispatchRule} */ (dm[item])
94
- if (emptyTag === true) {
95
- result = result.map(x => [addRuleToDispatch(x[0], item), x[1]])
96
- result = toArray(dispatchOp.merge(result)(dr.rangeMap))
97
- emptyTag = nullMap[item] !== undefined ? true : undefined
98
- } else {
99
- result = result.map(x => [addRuleToDispatch(x[0], item), x[1]])
100
- }
109
+ throw ['left recursion [', name, '][', item, ']']
101
110
  }
111
+ dm = dispatchRule(dm, item, newCurrent)
112
+ first = toArray(dispatchOp.merge(first)(assertNotNullish(dm[item]).rangeMap))
113
+ if (nullMap[item] === undefined) { break }
102
114
  }
103
- /** @type {_DispatchRule} */
104
- const dr = {emptyTag, rangeMap: result}
105
- return { ...dm, [name]: dr}
115
+ dr = { empty: undefined, rangeMap: first }
116
+ } else if (isRepeat(rule)) {
117
+ // Zero rounds always match, so a repetition needs no `empty`
118
+ // branch; its first set is its item's. A repetition of itself has
119
+ // no first set to dispatch on, so it can only match zero rounds —
120
+ // `toData` never derives one, but a hand-written rule set can.
121
+ dm = contains(rule)(newCurrent) ? dm : dispatchRule(dm, rule, newCurrent)
122
+ const itemDr = dm[rule]
123
+ dr = { empty: undefined, rangeMap: itemDr === undefined ? [] : itemDr.rangeMap }
106
124
  } else {
107
- const entries = definedEntries(rule)
108
125
  /** @type {_Dispatch} */
109
- let result = []
110
- /** @type {EmptyTag} */
111
- let emptyTag = undefined
112
- for (const [tag, item] of entries) {
126
+ let first = []
127
+ /** @type {_DispatchBranch | undefined} */
128
+ let empty = undefined
129
+ for (const [tag, item] of definedEntries(rule)) {
130
+ if (contains(item)(newCurrent)) {
131
+ throw ['left recursion [', name, '][', item, ']']
132
+ }
113
133
  dm = dispatchRule(dm, item, newCurrent)
114
- const dr = /** @type {_DispatchRule} */ (dm[item])
134
+ /** @type {_Dispatch} */
135
+ const d = assertNotNullish(dm[item]).rangeMap
136
+ .map(x => [x[0] === null ? null : { tag, name: item }, x[1]])
137
+ first = toArray(dispatchOp.merge(first)(d))
115
138
  if (nullMap[item] !== undefined) {
116
- emptyTag = tag
117
- } else {
118
- /** @type {_Dispatch} */
119
- const d = dr.rangeMap.map(x => [addTagToDispatch(x[0], tag), x[1]])
120
- result = toArray(dispatchOp.merge(result)(d))
139
+ empty = { tag, name: item }
121
140
  }
122
141
  }
123
- /** @type {_DispatchRule} */
124
- const dr = {emptyTag, rangeMap: result}
125
- return { ...dm, [name]: dr}
142
+ dr = { empty, rangeMap: first }
126
143
  }
144
+ return { ...dm, [name]: dr }
127
145
  }
128
146
 
129
147
  /** @type {_DispatchMap} */
@@ -145,13 +163,108 @@ export const parser = fr => {
145
163
  return parserRuleSet(data[0])
146
164
  }
147
165
 
148
- /** @type {(tag: AstTag, sequence: AstSequence, r: Remainder) => MatchResult} */
149
- const mrSuccess = (tag, sequence, r) =>
150
- [{tag, sequence}, true, r]
166
+ /**
167
+ * Where a match stopped: a {@link Cursor}, or `null` when it ran out of input —
168
+ * the `null` {@link Remainder} this backend reports for that.
169
+ *
170
+ * @typedef {Cursor|null} _Position
171
+ */
172
+
173
+ /**
174
+ * The machine's own result: a {@link MatchResult} positioned by a cursor
175
+ * instead of by a materialized remainder.
176
+ *
177
+ * @typedef {AstResult<CodePoint, _Position>} _Result
178
+ */
179
+
180
+ /**
181
+ * A suspended sequence match: `items[itemIndex]` is being matched by the
182
+ * current task, and `seq` holds the ASTs of the items already matched.
183
+ *
184
+ * @typedef {{
185
+ * readonly kind: 'seq'
186
+ * readonly tag: AstTag
187
+ * readonly items: Sequence
188
+ * readonly itemIndex: number
189
+ * readonly seq: AstSequence<CodePoint>
190
+ * }} _SeqFrame
191
+ */
192
+
193
+ /**
194
+ * A suspended repetition: the item is being matched by the current task for
195
+ * one more round, and `items` holds the ASTs of the rounds that already
196
+ * completed. They accumulate as a list rather than an array because a
197
+ * repetition is as long as its input: appending to an array per round would
198
+ * copy the whole prefix each time and make one repetition quadratic in the
199
+ * number of items it matched.
200
+ *
201
+ * @typedef {{
202
+ * readonly kind: 'repeat'
203
+ * readonly tag: AstTag
204
+ * readonly item: string
205
+ * readonly items: _Items
206
+ * }} _RepeatFrame
207
+ */
208
+
209
+ /** @typedef {List<Ast<CodePoint>>} _Items */
210
+
211
+ /** @typedef {_SeqFrame | _RepeatFrame} _Frame */
212
+
213
+ /**
214
+ * Immutable cons-cell stack: O(1) push/pop, no array copying per step.
215
+ *
216
+ * @typedef {null | {
217
+ * readonly top: _Frame
218
+ * readonly rest: _Stack
219
+ * }} _Stack
220
+ */
221
+
222
+ /**
223
+ * The rule invocation about to be evaluated, or `null` when a result is ready
224
+ * to resume the innermost frame instead.
225
+ *
226
+ * @typedef {{
227
+ * readonly kind: 'rule'
228
+ * readonly name: string
229
+ * readonly tag: AstTag
230
+ * readonly pos: Cursor
231
+ * }} _RuleTask
232
+ */
233
+
234
+ /**
235
+ * The next round of a repetition, about to be decided by lookahead. Both the
236
+ * rule that introduces a repetition and the frame that finishes one of its
237
+ * rounds go through this, so a round is set up in exactly one place.
238
+ *
239
+ * @typedef {{
240
+ * readonly kind: 'repeat'
241
+ * readonly tag: AstTag
242
+ * readonly item: string
243
+ * readonly items: _Items
244
+ * readonly pos: Cursor
245
+ * }} _RepeatTask
246
+ */
247
+
248
+ /** @typedef {_RuleTask | _RepeatTask} _Task */
249
+
250
+ /**
251
+ * A leaf here is the code point itself, so it *is* its own symbol. The
252
+ * annotation pins `identity`'s type parameter, which `symbolAt`'s own cannot
253
+ * infer from a fully generic argument.
254
+ *
255
+ * @type {(leaf: CodePoint) => number}
256
+ */
257
+ const symbolOf = identity
258
+
259
+ const symbolAtCp = symbolAt(symbolOf)
151
260
 
152
- /** @type {(tag: AstTag, sequence: AstSequence, r: Remainder) => MatchResult} */
153
- const mrFail = (tag, sequence, r) =>
154
- [{tag, sequence}, false, r]
261
+ /**
262
+ * The public remainder of a position. It stays physical, so consuming EOF
263
+ * leaves it empty; the slice is materialized once, at the end of a match.
264
+ *
265
+ * @type {(cp: readonly CodePoint[], pos: _Position) => Remainder}
266
+ */
267
+ const remainderAt = (cp, pos) => pos === null ? null : cp.slice(physicalIdx(cp.length)(pos))
155
268
 
156
269
  /**
157
270
  * Creates an LL(1) parser from an already materialized {@link RuleSet}.
@@ -161,39 +274,128 @@ const mrFail = (tag, sequence, r) =>
161
274
  export const parserRuleSet = ruleSet => {
162
275
  const map = dispatchMap(ruleSet)
163
276
 
164
- /** @type {MatchRule} */
165
- const f = ({emptyTag, rangeMap}, cp) => {
166
- if (cp.length === 0) {
167
- return mrSuccess(emptyTag, [], emptyTag === undefined ? null : cp)
168
- }
169
- const [cp0] = cp
170
- const dr = dispatchOp.get(rangeMap)(cp0)
171
- if (dr === null) {
172
- return emptyTag === undefined
173
- ? mrFail(emptyTag, [], cp)
174
- : mrSuccess(emptyTag, [], cp)
175
- }
176
- /** @type {AstSequence} */
177
- let seq = [cp0]
178
- const [, ...restCp] = cp
179
- /** @type {readonly number[]} */
180
- let r = restCp
181
- const {tag, rules} = dr
182
- for (const i of rules) {
183
- const rule = typeof i === 'string' ? /** @type {_DispatchRule} */ (map[i]) : i
184
- const res = f(rule, r)
185
- const [astRule, success, newR] = res
186
- if (success === false) {
187
- return res
277
+ /** @type {(name: string) => _DispatchRule} */
278
+ const dispatched = name => assertNotNullish(map[name])
279
+
280
+ // The matcher as an explicit-stack machine, the same shape as the sibling
281
+ // `bnf/descent` matcher's: each iteration either starts the current task
282
+ // (walking one rule of the grammar) or feeds the pending result into the
283
+ // innermost frame. The JS call stack stays O(1) however deeply the grammar
284
+ // recurses nesting depth grows with input length, so a few thousand code
285
+ // points used to overflow a recursive matcher (see the longInput proof
286
+ // group). Positions are cursors into the shared input array for the same
287
+ // reason: re-slicing the remainder per step made a match quadratic.
288
+ //
289
+ // Unlike `bnf/descent` it never backtracks: the dispatch map decides every
290
+ // choice from the lookahead symbol, so a cursor only moves forward and no
291
+ // frame needs rewind state.
292
+ /** @type {(name: string, cp: readonly CodePoint[]) => MatchResult} */
293
+ const f = (name, cp) => {
294
+ /** @type {_Stack} */
295
+ let stack = null
296
+ /** @type {_Task|null} */
297
+ let task = {kind: 'rule', name, tag: undefined, pos: 0}
298
+ /** @type {_Result} */
299
+ let result = mrFail(undefined, [], 0)
300
+
301
+ while (true) {
302
+ if (task !== null) {
303
+ // The explicit cast cuts a control-flow inference cycle
304
+ // (TS7022): `task`'s narrowed type feeds `pos`, which feeds the
305
+ // `task` assignment below that the narrowing depends on.
306
+ const current = /** @type {_Task} */ (task)
307
+ task = null
308
+ if (current.kind === 'repeat') {
309
+ const {tag, item, items, pos} = current
310
+ // One more round starts exactly while the lookahead is in
311
+ // the item's first set. Predictive selection cannot start a
312
+ // round that consumes nothing, so every round advances the
313
+ // cursor and the repetition always terminates.
314
+ if (pos <= cp.length && dispatchOp.get(dispatched(item).rangeMap)(symbolAtCp(cp, pos)) !== null) {
315
+ stack = {top: {kind: 'repeat', tag, item, items}, rest: stack}
316
+ task = {kind: 'rule', name: item, tag: undefined, pos}
317
+ } else {
318
+ result = mrSuccess(tag, toArray(items), pos)
319
+ }
320
+ continue
321
+ }
322
+ const {name, tag, pos} = current
323
+ const rule = ruleSet[name]
324
+ if (typeof rule === 'number') {
325
+ // The one logical EOF is available at the physical end, and
326
+ // only there: a terminal that matches it consumes it, once.
327
+ // Past it no symbol is left to consume.
328
+ if (pos <= cp.length && rangeContains(...rangeDecode(rule))(symbolAtCp(cp, pos))) {
329
+ result = mrSuccess(tag, leafAt(cp, pos), pos + 1)
330
+ } else if (pos >= cp.length) {
331
+ // Nothing left to reject: the match ran out of input.
332
+ result = mrSuccess(undefined, [], null)
333
+ } else {
334
+ result = mrFail(undefined, [], pos)
335
+ }
336
+ } else if (rule instanceof Array) {
337
+ if (rule.length === 0) {
338
+ result = mrSuccess(tag, [], pos)
339
+ } else {
340
+ stack = {top: {kind: 'seq', tag, items: rule, itemIndex: 0, seq: []}, rest: stack}
341
+ task = {kind: 'rule', name: rule[0], tag: undefined, pos}
342
+ }
343
+ } else if (isRepeat(rule)) {
344
+ task = {kind: 'repeat', tag, item: rule, items: null, pos}
345
+ } else {
346
+ const {empty, rangeMap} = dispatched(name)
347
+ const d = pos > cp.length ? null : dispatchOp.get(rangeMap)(symbolAtCp(cp, pos))
348
+ const branch = d ?? empty
349
+ if (branch !== undefined) {
350
+ // The selected branch's node becomes the variant's,
351
+ // carrying the branch's tag — entered before its first
352
+ // symbol is consumed, like every rule invocation.
353
+ task = {kind: 'rule', name: branch.name, tag: branch.tag, pos}
354
+ } else if (pos >= cp.length) {
355
+ result = mrSuccess(undefined, [], null)
356
+ } else {
357
+ result = mrFail(undefined, [], pos)
358
+ }
359
+ }
360
+ continue
361
+ }
362
+
363
+ if (stack === null) {
364
+ const {ast, success, pos} = result
365
+ return [ast, success, remainderAt(cp, pos)]
188
366
  }
189
- seq = [...seq, astRule]
190
- if (newR === null) {
191
- return mrSuccess(tag, seq, null)
367
+ const frame = stack.top
368
+ stack = stack.rest
369
+
370
+ const {ast, success, pos} = result
371
+ // A failing rule fails everything above it: LL(1) committed to
372
+ // every choice on the way here, so there is nothing to rewind and
373
+ // retry, and the failure propagates unchanged — its position is
374
+ // where matching stopped.
375
+ if (success === false) { continue }
376
+ if (frame.kind === 'seq') {
377
+ const seq = [...frame.seq, ast]
378
+ if (pos === null) {
379
+ result = mrSuccess(frame.tag, seq, null)
380
+ } else {
381
+ const itemIndex = frame.itemIndex + 1
382
+ if (itemIndex < frame.items.length) {
383
+ stack = {top: {...frame, itemIndex, seq}, rest: stack}
384
+ task = {kind: 'rule', name: frame.items[itemIndex], tag: undefined, pos}
385
+ } else {
386
+ result = mrSuccess(frame.tag, seq, pos)
387
+ }
388
+ }
389
+ } else {
390
+ const items = concat(frame.items)([ast])
391
+ if (pos === null) {
392
+ result = mrSuccess(frame.tag, toArray(items), null)
393
+ } else {
394
+ task = {kind: 'repeat', tag: frame.tag, item: frame.item, items, pos}
395
+ }
192
396
  }
193
- r = newR
194
397
  }
195
- return mrSuccess(tag, seq, r)
196
398
  }
197
399
 
198
- return (name, cp) => f(/** @type {_DispatchRule} */ (map[name]), cp)
400
+ return f
199
401
  }
@@ -1,16 +1,31 @@
1
1
  /**
2
- * @module
3
- *
2
+ * @import { CodePoint } from '../../text/utf16/types.ts'
4
3
  * @import { RuleSet } from '../data/types.ts'
4
+ * @import { CodePointMeta } from '../descent/types.ts'
5
+ * @import { Rule as FRule } from '../types.ts'
5
6
  * @import { MatchResult } from './types.ts'
6
7
  */
7
8
  export declare const proof: {
8
9
  dispatch: (() => void)[];
9
10
  parser: (() => void)[];
11
+ longInput: (() => void)[];
12
+ logicalEof: (() => void)[];
10
13
  repeat: (() => void)[];
11
14
  repeatParser: (() => void)[];
15
+ descentEquivalence: {
16
+ leadingItem: () => void;
17
+ variant: () => void;
18
+ skippedOption: () => void;
19
+ takenOption: () => void;
20
+ repetition: () => void;
21
+ nesting: () => void;
22
+ repetitionInNullablePrefix: () => void;
23
+ emptyRepetitionInNullablePrefix: () => void;
24
+ };
12
25
  throw: {
13
26
  ambiguousVariantDispatch: () => void;
27
+ leftRecursiveSequence: () => void;
28
+ leftRecursiveVariant: () => void;
14
29
  };
15
30
  cyclicNullability: () => void;
16
31
  };