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
@@ -2,16 +2,17 @@
2
2
  * @module
3
3
  *
4
4
  * @import { CodePoint } from '../../text/utf16/types.ts'
5
+ * @import { RuleSet } from '../data/types.ts'
5
6
  * @import { DescentMatch, CodePointMeta, DescentMatchResult } from './types.ts'
6
7
  */
7
8
 
8
9
  import { stringToCodePointList } from '../../text/utf16/module.f.mjs'
9
10
  import { map, toArray } from '../../types/list/module.f.mjs'
10
- import { commaJoin0Plus, option, range, repeat0Plus, set } from '../module.f.mjs'
11
+ import { commaJoin0Plus, eof, option, range, repeat0Plus, set } from '../module.f.mjs'
11
12
  import { emptyTagMap, toData } from '../data/module.f.mjs'
12
- import { descentParser } from './module.f.mjs'
13
+ import { descentParser, descentParserRuleSet } from './module.f.mjs'
13
14
  import { assertEq, assertNotNullish } from '../../asserts/module.f.mjs'
14
- import { deterministic } from '../testlib.f.mjs'
15
+ import { deterministic, showAst } from '../testlib.f.mjs'
15
16
 
16
17
  /** @type {(cp: CodePoint) => CodePointMeta<unknown>} */
17
18
  const mapCodePoint = cp => [cp, undefined]
@@ -77,11 +78,14 @@ export const proof = {
77
78
  if (result !== '{"0":"none","3":true,"":true,"r":"none"}') { throw result }
78
79
  },
79
80
  () => {
81
+ // The whole repetition is one `repeat` rule, and a repetition always
82
+ // matches empty — with no tag, because it is a list of items rather
83
+ // than a choice between branches.
80
84
  const repeatRule = repeat0Plus(set(' \n\r\t'))
81
85
  const data = toData(repeatRule)
82
86
  const emptyTags = emptyTagMap(data[0])
83
87
  const result = JSON.stringify(emptyTags)
84
- if (result !== '{"5":true,"r":"none"}') { throw result }
88
+ assertEq(result, '{"r":true}')
85
89
  }
86
90
  ],
87
91
  descentParser: [
@@ -254,33 +258,62 @@ export const proof = {
254
258
  () => {
255
259
  const m = descentParser(deterministic())
256
260
 
257
- const expect = (/** @type {string} */s, /** @type {boolean} */expected) => {
261
+ // A match is pinned by the AST it built, not just by the fact that it
262
+ // matched: the shape is what a repetition changes, and asserting it
263
+ // subsumes success — only a full match produces one. `showAst` writes
264
+ // a node as `tag(children)` with the code points it consumed as one
265
+ // quoted string, `*` for the tagless empty match.
266
+ //
267
+ // The leading three spaces are the `repeat` to read first: they are
268
+ // three siblings of one node here, and three levels of nesting in the
269
+ // LL(1) backend's copy of these expectations.
270
+ /** @type {(s: string, expected: string) => void} */
271
+ const expectAst = (s, expected) => {
258
272
  const cp = toArray(stringToCodePointList(s))
259
273
  const mr = descentParserCpOnly(m, '', cp)
260
- const success = mr.success && mr.idx === cp.length
261
- assertEq(success, expected, mr)
274
+ assertEq(mr.success, true, s)
275
+ assertEq(mr.idx, cp.length, s)
276
+ assertEq(showAst(mr.ast), expected, s)
277
+ }
278
+
279
+ /** @type {(s: string) => void} */
280
+ const expectNoMatch = s => {
281
+ const cp = toArray(stringToCodePointList(s))
282
+ const mr = descentParserCpOnly(m, '', cp)
283
+ assertEq(mr.success && mr.idx === cp.length, false, s)
262
284
  }
263
285
 
264
- expect(' true ', true)
265
- expect(' tr2ue ', false)
266
- expect(' true" ', false)
267
- expect(' "Hello" ', true)
268
- expect(' "Hello ', false)
269
- expect(' "Hello\\n\\r\\"" ', true)
270
- expect(' -56.7e+5 ', true)
271
- expect(' h-56.7e+5 ', false)
272
- expect(' -56.7e+5 3', false)
273
- expect(' [] ', true)
274
- expect(' {} ', true)
275
- expect(' [[[]]] ', true)
276
- expect(' [1] ', true)
277
- expect(' [ 12, false, "a"] ', true)
278
- expect(' [ 12, false2, "a"] ', false)
279
- expect(' { "q": [ 12, false, [{"b" : "c"}], "a"] } ', true)
280
- expect(' { "q": [ 12, false, [{}], "a"] } ', true)
281
- expect(' { "q": [ 12, false, [}], "a"] } ', false)
282
- expect(' [{ "q": [ 12, false, [{}], "a"] }] ', true)
283
- expect(' [{ "q": [ 12, false, [}], "a"] }] ', false)
286
+ expectAst(' true ', '((" "(" ") " "(" ") " "(" ")) "true"(("t") ("r") ("u") ("e")) (" "(" ") " "(" ") " "(" ")))')
287
+ expectAst(' "Hello" ', '((" "(" ") " "(" ") " "(" ")) "string"((("\\"")) ("0x2300005b"("H") "0x5d10ffff"("e") "0x5d10ffff"("l") "0x5d10ffff"("l") "0x5d10ffff"("o")) (("\\""))) (" "(" ") " "(" ") " "(" ")))')
288
+ expectAst(' "Hello\\n\\r\\"" ', '((" "(" ") " "(" ") " "(" ")) "string"((("\\"")) ("0x2300005b"("H") "0x5d10ffff"("e") "0x5d10ffff"("l") "0x5d10ffff"("l") "0x5d10ffff"("o") "escape"((("\\\\")) "n"("n")) "escape"((("\\\\")) "r"("r")) "escape"((("\\\\")) "\\""("\\""))) (("\\""))) (" "(" ") " "(" ") " "(" ")))')
289
+ expectAst(' -56.7e+5 ', '((" "(" ") " "(" ") " "(" ")) "number"("some"(("-")) "onenine"(("5") (("6"))) "some"(((".")) (("7") ())) "some"("e"("e") "+"("+") (("5") ()))) (" "(" ") " "(" ")))')
290
+ expectAst(' [] ', '((" "(" ") " "(" ") " "(" ")) "array"((("[")) () "none"() (("]"))) (" "(" ")))')
291
+ expectAst(' {} ', '((" "(" ") " "(" ") " "(" ")) "object"((("{")) () "none"() (("}"))) (" "(" ")))')
292
+ expectAst(' [[[]]] ', '((" "(" ") " "(" ") " "(" ")) "array"((("[")) () "some"(("array"((("[")) () "some"(("array"((("[")) () "none"() (("]"))) ()) "none"()) (("]"))) ()) "none"()) (("]"))) (" "(" ")))')
293
+ expectAst(' [1] ', '((" "(" ") " "(" ") " "(" ")) "array"((("[")) () "some"(("number"("none"() "onenine"(("1") ()) "none"() "none"()) ()) "none"()) (("]"))) (" "(" ")))')
294
+ expectAst(' [ 12, false, "a"] ', '((" "(" ") " "(" ") " "(" ")) "array"((("[")) (" "(" ")) "some"(("number"("none"() "onenine"(("1") (("2"))) "none"() "none"()) ()) "some"(((((",")) (" "(" "))) ("false"(("f") ("a") ("l") ("s") ("e")) ())) "some"(((((",")) (" "(" "))) ("string"((("\\"")) ("0x5d10ffff"("a")) (("\\""))) ())) "none"()))) (("]"))) (" "(" ") " "(" ")))')
295
+ expectAst(' { "q": [ 12, false, [{"b" : "c"}], "a"] } ', '((" "(" ") " "(" ") " "(" ")) "object"((("{")) (" "(" ")) "some"(((((("\\"")) ("0x5d10ffff"("q")) (("\\""))) () ((":")) (" "(" ")) "array"((("[")) (" "(" ")) "some"(("number"("none"() "onenine"(("1") (("2"))) "none"() "none"()) ()) "some"(((((",")) (" "(" "))) ("false"(("f") ("a") ("l") ("s") ("e")) ())) "some"(((((",")) (" "(" "))) ("array"((("[")) () "some"(("object"((("{")) () "some"(((((("\\"")) ("0x5d10ffff"("b")) (("\\""))) (" "(" ")) ((":")) (" "(" ")) "string"((("\\"")) ("0x5d10ffff"("c")) (("\\"")))) ()) "none"()) (("}"))) ()) "none"()) (("]"))) ())) "some"(((((",")) (" "(" "))) ("string"((("\\"")) ("0x5d10ffff"("a")) (("\\""))) ())) "none"())))) (("]")))) (" "(" "))) "none"()) (("}"))) (" "(" ") " "(" ")))')
296
+ expectAst(' { "q": [ 12, false, [{}], "a"] } ', '((" "(" ") " "(" ") " "(" ")) "object"((("{")) (" "(" ")) "some"(((((("\\"")) ("0x5d10ffff"("q")) (("\\""))) () ((":")) (" "(" ")) "array"((("[")) (" "(" ")) "some"(("number"("none"() "onenine"(("1") (("2"))) "none"() "none"()) ()) "some"(((((",")) (" "(" "))) ("false"(("f") ("a") ("l") ("s") ("e")) ())) "some"(((((",")) (" "(" "))) ("array"((("[")) () "some"(("object"((("{")) () "none"() (("}"))) ()) "none"()) (("]"))) ())) "some"(((((",")) (" "(" "))) ("string"((("\\"")) ("0x5d10ffff"("a")) (("\\""))) ())) "none"())))) (("]")))) (" "(" "))) "none"()) (("}"))) (" "(" ") " "(" ")))')
297
+ expectAst(' [{ "q": [ 12, false, [{}], "a"] }] ', '((" "(" ") " "(" ") " "(" ")) "array"((("[")) () "some"(("object"((("{")) (" "(" ")) "some"(((((("\\"")) ("0x5d10ffff"("q")) (("\\""))) () ((":")) (" "(" ")) "array"((("[")) (" "(" ")) "some"(("number"("none"() "onenine"(("1") (("2"))) "none"() "none"()) ()) "some"(((((",")) (" "(" "))) ("false"(("f") ("a") ("l") ("s") ("e")) ())) "some"(((((",")) (" "(" "))) ("array"((("[")) () "some"(("object"((("{")) () "none"() (("}"))) ()) "none"()) (("]"))) ())) "some"(((((",")) (" "(" "))) ("string"((("\\"")) ("0x5d10ffff"("a")) (("\\""))) ())) "none"())))) (("]")))) (" "(" "))) "none"()) (("}"))) ()) "none"()) (("]"))) (" "(" ") " "(" ")))')
298
+
299
+ expectNoMatch(' tr2ue ')
300
+ expectNoMatch(' true" ')
301
+ expectNoMatch(' "Hello ')
302
+ expectNoMatch(' h-56.7e+5 ')
303
+ expectNoMatch(' -56.7e+5 3')
304
+ expectNoMatch(' [ 12, false2, "a"] ')
305
+ expectNoMatch(' { "q": [ 12, false, [}], "a"] } ')
306
+
307
+ // The invalid input in detail. A failed match's own index rewound to
308
+ // the start and locates nothing; the furthest failure is the
309
+ // high-water mark, and it lands on the `}` that closes nothing.
310
+ const bad = ' [{ "q": [ 12, false, [}], "a"] }] '
311
+ const badMr = descentParserCpOnly(m, '', toArray(stringToCodePointList(bad)))
312
+ assertEq(badMr.success, false, bad)
313
+ assertEq(badMr.idx, 0, bad)
314
+ const failure = assertNotNullish(badMr.failure)
315
+ assertEq(failure.idx, 25, bad)
316
+ assertEq(bad[failure.idx], '}', bad)
284
317
  }
285
318
  ],
286
319
  // Regression for the stack-recursive matcher bug: the matcher used to recurse
@@ -323,6 +356,135 @@ export const proof = {
323
356
  if (result !== `{"ast":{"sequence":[{"tag":"minus","sequence":[[${cp1('-')},"minus"]]},{"sequence":[[${cp1('2')},"two"]]}]},"success":true,"idx":2}`) { throw result }
324
357
  },
325
358
  ],
359
+ logicalEof: [
360
+ () => {
361
+ // The matcher synthesizes one EOF after the physical input, so the
362
+ // `eof` terminal matches empty input. It contributes no AST leaf,
363
+ // and the public index stays physical.
364
+ const m = descentParser(eof)
365
+ const mr = m('', [])
366
+ assertEq(JSON.stringify(mr), '{"ast":{"sequence":[]},"success":true,"idx":0}')
367
+ },
368
+ () => {
369
+ // Callers pass physical symbols only, so EOF is not available
370
+ // before the end of the input.
371
+ const m = descentParser(eof)
372
+ const mr = descentParserCpOnly(m, '', toArray(stringToCodePointList('A')))
373
+ assertEq(mr.success, false)
374
+ const f = assertNotNullish(mr.failure)
375
+ assertEq(f.idx, 0)
376
+ assertEq(f.expected.length, 1)
377
+ assertEq(f.expected[0], eof)
378
+ },
379
+ () => {
380
+ // Non-empty input: the terminal consumes the synthesized EOF after
381
+ // the last code point, and `idx` still reports `input.length`.
382
+ const m = descentParser([range('AA'), eof])
383
+ const cp = toArray(stringToCodePointList('A'))
384
+ const mr = descentParserCpOnly(m, '', cp)
385
+ assertEq(mr.success, true)
386
+ assertEq(mr.idx, cp.length)
387
+ assertEq(JSON.stringify(mr.ast), `{"sequence":[{"sequence":[[${cp1('A')},null]]},{"sequence":[]}]}`)
388
+ },
389
+ () => {
390
+ // Exactly one EOF is synthesized: a second `eof` terminal has
391
+ // nothing left to consume, and its failure points at `input.length`.
392
+ const m = descentParser([eof, eof])
393
+ const mr = m('', [])
394
+ assertEq(mr.success, false)
395
+ const f = assertNotNullish(mr.failure)
396
+ assertEq(f.idx, 0)
397
+ assertEq(f.expected.length, 1)
398
+ assertEq(f.expected[0], eof)
399
+ },
400
+ () => {
401
+ // EOF as one alternative among ordinary terminals.
402
+ const m = descentParser({ a: range('AA'), e: eof })
403
+ assertEq(JSON.stringify(m('', [])), '{"ast":{"tag":"e","sequence":[]},"success":true,"idx":0}')
404
+ const mr = descentParserCpOnly(m, '', toArray(stringToCodePointList('A')))
405
+ assertEq(mr.success, true)
406
+ assertEq(mr.idx, 1)
407
+ },
408
+ () => {
409
+ // Repetition terminates on EOF: consuming it moves the complete
410
+ // cursor, so the repeat makes exactly one round and then stops —
411
+ // with `idx` alone this would never stop.
412
+ const rule = repeat0Plus(eof)
413
+ const m = descentParser(rule)
414
+ const mr = m(toData(rule)[1], [])
415
+ assertEq(JSON.stringify(mr), '{"ast":{"sequence":[{"sequence":[]}]},"success":true,"idx":0}')
416
+ },
417
+ () => {
418
+ // Backtracking restores the complete cursor: `x` consumes EOF and
419
+ // then fails, so `y` must still find EOF available.
420
+ const m = descentParser({ x: [eof, range('AA')], y: eof })
421
+ assertEq(JSON.stringify(m('', [])), '{"ast":{"tag":"y","sequence":[]},"success":true,"idx":0}')
422
+ },
423
+ () => {
424
+ // Diagnostic ordering by the complete cursor: `y` got further than
425
+ // `x` — the same physical index, but past the EOF it consumed — so
426
+ // only its expectation is reported, and at the physical end.
427
+ const m = descentParser({ x: range('AA'), y: [eof, range('BB')] })
428
+ const mr = m('', [])
429
+ assertEq(mr.success, false)
430
+ const f = assertNotNullish(mr.failure)
431
+ assertEq(f.idx, 0)
432
+ assertEq(f.expected.length, 1)
433
+ assertEq(f.expected[0], range('BB'))
434
+ },
435
+ ],
436
+ repeat: [
437
+ () => {
438
+ // The whole repetition is one node holding a flat sequence of the
439
+ // items it matched — not the right-recursive chain of `some`/`none`
440
+ // nodes its functional spelling builds.
441
+ const rule = repeat0Plus(set(' \n\r\t'))
442
+ const m = descentParser(rule)
443
+ const name = toData(rule)[1]
444
+ const mr = descentParserCpOnly(m, name, toArray(stringToCodePointList(' ')))
445
+ assertEq(
446
+ JSON.stringify(mr),
447
+ `{"ast":{"sequence":[{"tag":" ","sequence":[[${cp1(' ')},null]]},{"tag":" ","sequence":[[${cp1(' ')},null]]}]},"success":true,"idx":2}`)
448
+ },
449
+ () => {
450
+ // Zero items is a match, and the node is empty rather than tagged.
451
+ const rule = repeat0Plus(set(' \n\r\t'))
452
+ const m = descentParser(rule)
453
+ const mr = m(toData(rule)[1], [])
454
+ assertEq(JSON.stringify(mr), '{"ast":{"sequence":[]},"success":true,"idx":0}')
455
+ },
456
+ () => {
457
+ // A round that fails ends the repetition rather than failing it: the
458
+ // rounds before it stand and the match stops where the failed one
459
+ // began.
460
+ const rule = repeat0Plus(set(' \n\r\t'))
461
+ const m = descentParser(rule)
462
+ const name = toData(rule)[1]
463
+ const mr = descentParserCpOnly(m, name, toArray(stringToCodePointList(' x')))
464
+ assertEq(
465
+ JSON.stringify(mr),
466
+ `{"ast":{"sequence":[{"tag":" ","sequence":[[${cp1(' ')},null]]}]},"success":true,"idx":1}`)
467
+ },
468
+ () => {
469
+ // `toData` never folds a nullable item into a `repeat`, but a
470
+ // hand-written rule set can hold one. A round that consumes nothing
471
+ // would repeat forever, so it is kept once and ends the repetition.
472
+ /** @type {RuleSet} */
473
+ const ruleSet = {
474
+ repeated: 'optionalA',
475
+ optionalA: { some: 'a', none: 'e' },
476
+ a: range('aa'),
477
+ e: [],
478
+ }
479
+ const m = descentParserRuleSet(ruleSet)
480
+ assertEq(
481
+ JSON.stringify(m('repeated', [])),
482
+ '{"ast":{"sequence":[{"tag":"none","sequence":[]}]},"success":true,"idx":0}')
483
+ assertEq(
484
+ JSON.stringify(m('repeated', [[cp1('a'), null]])),
485
+ `{"ast":{"sequence":[{"tag":"some","sequence":[[${cp1('a')},null]]},{"tag":"none","sequence":[]}]},"success":true,"idx":1}`)
486
+ },
487
+ ],
326
488
  furthestFailure: [
327
489
  () => {
328
490
  // A branch rejected *before* the high-water mark must not pull it back:
@@ -1,15 +1,22 @@
1
1
  /**
2
2
  * Types for the recursive descent matcher backend.
3
3
  *
4
+ * The AST it builds is the shared one, over leaves that carry metadata:
5
+ * `Ast<CodePointMeta<T>>` from [`../matcher`](../matcher). What is declared
6
+ * here is what belongs to *this* backend — the metadata-carrying leaf, the
7
+ * diagnostics a backtracking matcher can report, and its public result.
8
+ *
4
9
  * @module
5
10
  */
6
11
  import type { CodePoint } from '../../text/utf16/types.ts';
12
+ import type { Ast, AstTag } from '../matcher/types.ts';
7
13
  import type { TerminalRange } from '../types.ts';
8
- export type AstTag = string | true | undefined;
9
14
  /**
10
- * Recursive descent matcher for a single named rule.
15
+ * Recursive descent matcher for a single named rule, starting from `startPos` —
16
+ * a position that counts the synthesized end-of-input symbol, unlike the public
17
+ * `idx` of the result.
11
18
  */
12
- export type DescentMatchRule<T> = (name: string, tag: AstTag, s: readonly CodePointMeta<T>[], idx: number) => DescentMatchResult<T>;
19
+ export type DescentMatchRule<T> = (name: string, tag: AstTag, s: readonly CodePointMeta<T>[], startPos: number) => DescentMatchResult<T>;
13
20
  /**
14
21
  * Where a match ran out of road, for diagnostics.
15
22
  *
@@ -24,6 +31,11 @@ export type DescentMatchRule<T> = (name: string, tag: AstTag, s: readonly CodePo
24
31
  *
25
32
  * `idx` is `0` with an empty `expected` when the match failed without ever
26
33
  * rejecting a terminal, as an empty variant does.
34
+ *
35
+ * `idx` is physical, so a terminal rejected at — or past — the synthesized
36
+ * end-of-input symbol reports `input.length`. The high-water mark itself is
37
+ * kept on the complete cursor, so those two are still ordered against each
38
+ * other and their expected terminals do not merge.
27
39
  */
28
40
  export type DescentFailure = {
29
41
  readonly idx: number;
@@ -41,11 +53,12 @@ export type DescentFailure = {
41
53
  * On failure `idx` has rewound to the start of the enclosing sequence and
42
54
  * locates nothing; read `failure.idx` instead.
43
55
  *
44
- * The same type describes a match in progress, where `failure` is likewise
45
- * absent until the match ends.
56
+ * `idx` is physical `0 <= idx <= input.length` so a match that consumed the
57
+ * synthesized end-of-input symbol reports `input.length`, the same as one that
58
+ * stopped just before it.
46
59
  */
47
60
  export type DescentMatchResult<T> = {
48
- readonly ast: AstRuleMeta<T>;
61
+ readonly ast: Ast<CodePointMeta<T>>;
49
62
  readonly success: boolean;
50
63
  readonly idx: number;
51
64
  readonly failure?: DescentFailure;
@@ -55,17 +68,10 @@ export type DescentMatchResult<T> = {
55
68
  */
56
69
  export type DescentMatch<T> = (name: string, s: readonly CodePointMeta<T>[]) => DescentMatchResult<T>;
57
70
  /**
58
- * Code point value paired with metadata.
71
+ * Code point value paired with metadata: this backend's AST leaf.
72
+ *
73
+ * Preserving metadata per consumed code point is what distinguishes this
74
+ * backend, so the leaf type stays here rather than moving to the shared layer,
75
+ * which is parameterized by it.
59
76
  */
60
77
  export type CodePointMeta<T> = readonly [CodePoint, T];
61
- /**
62
- * AST sequence for the metadata-aware parser.
63
- */
64
- export type AstSequenceMeta<T> = readonly (AstRuleMeta<T> | CodePointMeta<T>)[];
65
- /**
66
- * Metadata-aware AST node.
67
- */
68
- export type AstRuleMeta<T> = {
69
- readonly tag: AstTag;
70
- readonly sequence: AstSequenceMeta<T>;
71
- };
@@ -4,26 +4,59 @@
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
- import type { RuleSet } from '../data/types.ts';
37
+ import type { CodePoint } from '../../text/utf16/types.ts';
38
+ import type { List } from '../../types/list/types.ts';
39
+ import type { RuleSet, Sequence } from '../data/types.ts';
40
+ import type { Ast, AstResult, AstSequence, AstTag, Cursor } from '../matcher/types.ts';
22
41
  import type { Rule as FRule } from '../types.ts';
23
42
  import type { Match, _DispatchMap } from './types.ts';
24
43
  /**
25
44
  * Builds a dispatch map for a {@link RuleSet} to enable predictive parsing.
26
45
  *
46
+ * Each rule's entry holds the rule's first set as a range map. Only a variant
47
+ * reads the value under a symbol — the branch that lookahead selects; every
48
+ * other reader asks whether a symbol is in the set at all, which is how a
49
+ * repetition decides to start another round. `empty` is the branch a variant
50
+ * takes when no entry matches the lookahead — its nullable branch, absent
51
+ * when the variant cannot match empty.
52
+ *
53
+ * A rule referenced in first position while its own first set is still being
54
+ * computed is left recursion — a grammar no lookahead can decide, whose match
55
+ * would loop at the same position forever — so building throws
56
+ * (`left recursion …`) rather than letting the matcher diverge. The one
57
+ * self-reference with a sound reading is a repetition of itself: zero rounds
58
+ * match whatever the item does, so it dispatches on nothing and matches empty.
59
+ *
27
60
  * @type {(ruleSet: RuleSet) => _DispatchMap}
28
61
  */
29
62
  export declare const dispatchMap: (ruleSet: RuleSet) => _DispatchMap;
@@ -33,6 +66,41 @@ export declare const dispatchMap: (ruleSet: RuleSet) => _DispatchMap;
33
66
  * @type {(fr: FRule) => Match}
34
67
  */
35
68
  export declare const parser: (fr: FRule) => Match;
69
+ export type _Position = Cursor | null;
70
+ export type _Result = AstResult<CodePoint, _Position>;
71
+ export type _SeqFrame = {
72
+ readonly kind: 'seq';
73
+ readonly tag: AstTag;
74
+ readonly items: Sequence;
75
+ readonly itemIndex: number;
76
+ readonly seq: AstSequence<CodePoint>;
77
+ };
78
+ export type _RepeatFrame = {
79
+ readonly kind: 'repeat';
80
+ readonly tag: AstTag;
81
+ readonly item: string;
82
+ readonly items: _Items;
83
+ };
84
+ export type _Items = List<Ast<CodePoint>>;
85
+ export type _Frame = _SeqFrame | _RepeatFrame;
86
+ export type _Stack = null | {
87
+ readonly top: _Frame;
88
+ readonly rest: _Stack;
89
+ };
90
+ export type _RuleTask = {
91
+ readonly kind: 'rule';
92
+ readonly name: string;
93
+ readonly tag: AstTag;
94
+ readonly pos: Cursor;
95
+ };
96
+ export type _RepeatTask = {
97
+ readonly kind: 'repeat';
98
+ readonly tag: AstTag;
99
+ readonly item: string;
100
+ readonly items: _Items;
101
+ readonly pos: Cursor;
102
+ };
103
+ export type _Task = _RuleTask | _RepeatTask;
36
104
  /**
37
105
  * Creates an LL(1) parser from an already materialized {@link RuleSet}.
38
106
  *