functionalscript 0.37.0 → 0.39.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 (517) hide show
  1. package/README.md +1 -1
  2. package/{fs → fjs}/asn.1/proof.f.js +32 -94
  3. package/fjs/asserts/module.f.d.ts +36 -0
  4. package/fjs/asserts/module.f.js +39 -0
  5. package/fjs/asserts/proof.f.d.ts +11 -0
  6. package/fjs/asserts/proof.f.js +18 -0
  7. package/{fs → fjs}/base_n/proof.f.js +12 -36
  8. package/{fs → fjs}/basen/base64/proof.f.d.ts +1 -0
  9. package/{fs → fjs}/basen/base64/proof.f.js +15 -1
  10. package/{fs → fjs}/basen/cbase32/proof.f.js +15 -42
  11. package/fjs/bnf/data/module.f.d.ts +52 -0
  12. package/{fs → fjs}/bnf/data/module.f.js +53 -3
  13. package/{fs → fjs}/bnf/data/proof.f.d.ts +1 -0
  14. package/{fs → fjs}/bnf/data/proof.f.js +54 -19
  15. package/{fs → fjs}/bnf/descent/module.f.d.ts +4 -14
  16. package/fjs/bnf/descent/module.f.js +124 -0
  17. package/{fs → fjs}/bnf/descent/proof.f.d.ts +1 -0
  18. package/{fs → fjs}/bnf/descent/proof.f.js +55 -24
  19. package/{fs → fjs}/bnf/ll1/module.f.d.ts +4 -4
  20. package/{fs → fjs}/bnf/ll1/module.f.js +7 -5
  21. package/{fs → fjs}/bnf/ll1/proof.f.d.ts +1 -0
  22. package/{fs → fjs}/bnf/ll1/proof.f.js +27 -10
  23. package/{fs → fjs}/bnf/module.f.d.ts +19 -5
  24. package/{fs → fjs}/bnf/module.f.js +10 -11
  25. package/fjs/bnf/proof.f.js +69 -0
  26. package/{fs → fjs}/bnf/testlib.f.js +2 -2
  27. package/fjs/bnf/token_symbol/module.f.d.ts +38 -0
  28. package/fjs/bnf/token_symbol/module.f.js +48 -0
  29. package/fjs/bnf/token_symbol/proof.f.d.ts +10 -0
  30. package/fjs/bnf/token_symbol/proof.f.js +37 -0
  31. package/{fs → fjs}/cas/cli/module.f.js +6 -9
  32. package/{fs → fjs}/cas/cli/proof.f.d.ts +4 -1
  33. package/{fs → fjs}/cas/cli/proof.f.js +29 -66
  34. package/fjs/cas/evo/mcp/module.f.d.ts +27 -0
  35. package/fjs/cas/evo/mcp/module.f.js +94 -0
  36. package/fjs/cas/evo/mcp/proof.f.d.ts +11 -0
  37. package/fjs/cas/evo/mcp/proof.f.js +126 -0
  38. package/fjs/cas/evo/module.f.d.ts +202 -0
  39. package/fjs/cas/evo/module.f.js +421 -0
  40. package/fjs/cas/evo/proof.f.d.ts +39 -0
  41. package/fjs/cas/evo/proof.f.js +572 -0
  42. package/fjs/cas/mcp/module.f.d.ts +49 -0
  43. package/{fs → fjs}/cas/mcp/module.f.js +61 -81
  44. package/{fs → fjs}/cas/mcp/proof.f.d.ts +4 -1
  45. package/{fs → fjs}/cas/mcp/proof.f.js +45 -17
  46. package/{fs → fjs}/cas/module.f.d.ts +10 -0
  47. package/{fs → fjs}/cas/module.f.js +89 -36
  48. package/fjs/cas/proof.f.d.ts +18 -0
  49. package/fjs/cas/proof.f.js +305 -0
  50. package/{fs → fjs}/ci/bun/module.f.js +3 -3
  51. package/{fs → fjs}/ci/common/module.f.d.ts +1 -2
  52. package/{fs → fjs}/ci/common/module.f.js +1 -5
  53. package/{fs → fjs}/ci/config/module.f.d.ts +8 -8
  54. package/{fs → fjs}/ci/config/module.f.js +8 -8
  55. package/{fs → fjs}/ci/deno/module.f.js +3 -3
  56. package/{fs → fjs}/ci/module.f.js +3 -4
  57. package/{fs → fjs}/ci/node/module.f.js +11 -9
  58. package/{fs → fjs}/ci/proof.f.js +16 -9
  59. package/{fs → fjs}/ci/rust/module.f.js +9 -1
  60. package/{fs → fjs}/cli/module.f.js +2 -2
  61. package/{fs → fjs}/cli/proof.f.js +22 -63
  62. package/{fs → fjs}/common/monoid/module.f.d.ts +46 -2
  63. package/fjs/common/monoid/module.f.js +88 -0
  64. package/fjs/common/monoid/proof.f.d.ts +9 -0
  65. package/fjs/common/monoid/proof.f.js +48 -0
  66. package/{fs → fjs}/crypto/hmac/proof.f.js +4 -12
  67. package/fjs/crypto/pow/proof.f.js +111 -0
  68. package/{fs → fjs}/crypto/secp/proof.f.js +12 -33
  69. package/{fs → fjs}/crypto/sha2/proof.f.js +18 -49
  70. package/{fs → fjs}/crypto/sign/module.f.d.ts +0 -5
  71. package/{fs → fjs}/crypto/sign/module.f.js +7 -4
  72. package/{fs → fjs}/crypto/sign/proof.f.js +36 -105
  73. package/{fs → fjs}/crypto/vdf/proof.f.js +22 -63
  74. package/{fs → fjs}/dev/module.f.js +25 -25
  75. package/{fs → fjs}/dev/package_json/proof.f.js +7 -7
  76. package/{fs → fjs}/dev/proof.f.js +2 -4
  77. package/{fs → fjs}/djs/ast/proof.f.js +4 -12
  78. package/{fs → fjs}/djs/module.f.js +5 -8
  79. package/{fs → fjs}/djs/parser/module.f.d.ts +8 -0
  80. package/{fs → fjs}/djs/parser/module.f.js +37 -0
  81. package/{fs → fjs}/djs/parser/proof.f.js +138 -400
  82. package/{fs → fjs}/djs/proof.f.js +13 -36
  83. package/{fs → fjs}/djs/serializer/proof.f.js +14 -39
  84. package/fjs/djs/tokenizer/module.f.d.ts +24 -0
  85. package/fjs/djs/tokenizer/module.f.js +472 -0
  86. package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.d.ts +4 -3
  87. package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.js +446 -445
  88. package/{fs → fjs}/djs/transpiler/module.f.js +6 -6
  89. package/{fs → fjs}/djs/transpiler/proof.f.d.ts +3 -0
  90. package/{fs → fjs}/djs/transpiler/proof.f.js +29 -30
  91. package/fjs/effects/eff/module.f.d.ts +72 -0
  92. package/fjs/effects/eff/module.f.js +46 -0
  93. package/fjs/effects/eff/proof.f.d.ts +11 -0
  94. package/fjs/effects/eff/proof.f.js +58 -0
  95. package/{fs → fjs}/effects/list/module.f.d.ts +11 -5
  96. package/{fs → fjs}/effects/list/module.f.js +2 -1
  97. package/{fs → fjs}/effects/memory/proof.f.js +15 -29
  98. package/fjs/effects/module.f.d.ts +388 -0
  99. package/fjs/effects/module.f.js +288 -0
  100. package/{fs → fjs}/effects/node/memory/proof.js +7 -13
  101. package/{fs → fjs}/effects/node/module.d.ts +1 -1
  102. package/{fs → fjs}/effects/node/module.f.d.ts +2 -2
  103. package/{fs → fjs}/effects/node/module.f.js +9 -11
  104. package/{fs → fjs}/effects/node/module.js +3 -3
  105. package/{fs → fjs}/effects/node/proof.f.d.ts +1 -0
  106. package/{fs → fjs}/effects/node/proof.f.js +121 -299
  107. package/{fs → fjs}/effects/node/virtual/proof.f.d.ts +1 -0
  108. package/{fs → fjs}/effects/node/virtual/proof.f.js +36 -29
  109. package/fjs/effects/proof.f.d.ts +51 -0
  110. package/fjs/effects/proof.f.js +178 -0
  111. package/{fs → fjs}/emergent_testing/module.f.js +55 -39
  112. package/{fs → fjs}/emergent_testing/proof.f.d.ts +4 -0
  113. package/{fs → fjs}/emergent_testing/proof.f.js +60 -27
  114. package/{fs → fjs}/fsc/proof.f.js +12 -34
  115. package/{fs → fjs}/fsm/proof.f.js +5 -12
  116. package/{fs → fjs}/mcp/module.f.d.ts +7 -0
  117. package/{fs → fjs}/mcp/module.f.js +17 -10
  118. package/{fs → fjs}/mcp/proof.f.js +17 -16
  119. package/{fs → fjs}/mcp/stdio/module.f.d.ts +4 -4
  120. package/{fs → fjs}/mcp/stdio/module.f.js +14 -14
  121. package/{fs → fjs}/media/html/proof.f.js +12 -33
  122. package/{fs → fjs}/media/json/parser/module.f.d.ts +5 -0
  123. package/{fs → fjs}/media/json/parser/module.f.js +14 -0
  124. package/{fs → fjs}/media/json/parser/proof.f.js +39 -114
  125. package/{fs → fjs}/media/json/rpc/module.f.js +1 -1
  126. package/{fs → fjs}/media/json/schema/module.f.d.ts +2 -2
  127. package/{fs → fjs}/media/json/schema/module.f.js +23 -39
  128. package/{fs → fjs}/media/json/schema/proof.f.js +3 -6
  129. package/{fs → fjs}/media/json/serializer/proof.f.js +10 -27
  130. package/{fs → fjs}/media/module.f.d.ts +6 -6
  131. package/{fs → fjs}/media/module.f.js +3 -4
  132. package/{fs → fjs}/media/proof.f.js +5 -4
  133. package/{fs → fjs}/media/revision/module.f.d.ts +31 -4
  134. package/{fs → fjs}/media/revision/module.f.js +35 -23
  135. package/{fs → fjs}/media/revision/proof.f.d.ts +10 -8
  136. package/fjs/media/revision/proof.f.js +140 -0
  137. package/{fs → fjs}/media/type/module.f.js +2 -2
  138. package/{fs → fjs}/media/type/proof.f.js +8 -15
  139. package/{fs → fjs}/module.f.js +5 -9
  140. package/{fs → fjs}/path/proof.f.js +27 -78
  141. package/{fs → fjs}/proof.f.js +2 -0
  142. package/{fs → fjs}/sul/id/proof.f.js +7 -21
  143. package/{fs → fjs}/sul/level/hash/proof.f.js +5 -5
  144. package/{fs → fjs}/sul/level/literal/proof.f.js +12 -26
  145. package/fjs/text/ascii/proof.f.d.ts +6 -0
  146. package/{fs → fjs}/text/ascii/proof.f.js +4 -14
  147. package/{fs → fjs}/text/code_point/module.f.js +10 -10
  148. package/{fs → fjs}/text/proof.f.js +4 -9
  149. package/{fs → fjs}/text/sgr/proof.f.js +6 -15
  150. package/{fs → fjs}/text/utf16/module.f.js +1 -1
  151. package/{fs → fjs}/text/utf16/proof.f.js +23 -66
  152. package/{fs → fjs}/text/utf8/proof.f.js +56 -125
  153. package/{fs → fjs}/types/array/proof.f.js +18 -52
  154. package/fjs/types/bigfloat/proof.f.js +217 -0
  155. package/{fs → fjs}/types/bigint/module.f.js +4 -3
  156. package/{fs → fjs}/types/bigint/proof.f.js +49 -145
  157. package/{fs → fjs}/types/bit_vec/module.f.js +5 -15
  158. package/{fs → fjs}/types/bit_vec/proof.f.js +72 -214
  159. package/{fs → fjs}/types/btree/find/proof.f.js +23 -66
  160. package/{fs → fjs}/types/btree/proof.f.js +5 -12
  161. package/{fs → fjs}/types/btree/remove/module.f.d.ts +5 -0
  162. package/{fs → fjs}/types/btree/remove/module.f.js +12 -0
  163. package/{fs → fjs}/types/btree/remove/proof.f.d.ts +2 -0
  164. package/{fs → fjs}/types/btree/remove/proof.f.js +83 -230
  165. package/{fs → fjs}/types/btree/set/module.f.js +5 -2
  166. package/{fs → fjs}/types/btree/set/proof.f.js +35 -24
  167. package/{fs → fjs}/types/byte_set/proof.f.js +22 -63
  168. package/{fs → fjs}/types/function/compare/proof.f.js +13 -36
  169. package/{fs → fjs}/types/function/operator/proof.f.js +17 -48
  170. package/{fs → fjs}/types/function/proof.f.js +2 -3
  171. package/{fs → fjs}/types/list/module.f.d.ts +21 -0
  172. package/{fs → fjs}/types/list/module.f.js +17 -0
  173. package/{fs → fjs}/types/list/proof.f.d.ts +1 -0
  174. package/{fs → fjs}/types/list/proof.f.js +79 -164
  175. package/{fs → fjs}/types/map/proof.f.js +4 -12
  176. package/{fs → fjs}/types/nibble_set/proof.f.js +16 -45
  177. package/{fs → fjs}/types/nominal/proof.f.js +5 -10
  178. package/fjs/types/nullable/proof.f.js +29 -0
  179. package/{fs → fjs}/types/number/module.f.js +2 -1
  180. package/{fs → fjs}/types/number/proof.f.js +9 -24
  181. package/{fs → fjs}/types/object/proof.f.js +3 -6
  182. package/{fs → fjs}/types/patricia_trie/proof.f.js +21 -21
  183. package/{fs → fjs}/types/prime_field/module.f.js +2 -7
  184. package/{fs → fjs}/types/range/module.f.d.ts +1 -1
  185. package/fjs/types/range/module.f.js +2 -0
  186. package/fjs/types/range/proof.f.js +9 -0
  187. package/{fs → fjs}/types/range_map/proof.f.js +28 -81
  188. package/{fs → fjs}/types/result/proof.f.d.ts +3 -2
  189. package/fjs/types/result/proof.f.js +31 -0
  190. package/{fs → fjs}/types/rtti/common/module.f.d.ts +36 -1
  191. package/{fs → fjs}/types/rtti/common/module.f.js +44 -0
  192. package/fjs/types/rtti/common/proof.f.d.ts +8 -0
  193. package/fjs/types/rtti/common/proof.f.js +51 -0
  194. package/{fs → fjs}/types/rtti/parse/module.f.js +13 -22
  195. package/{fs → fjs}/types/rtti/parse/proof.f.js +7 -18
  196. package/{fs → fjs}/types/rtti/ts/module.f.d.ts +10 -4
  197. package/{fs → fjs}/types/rtti/validate/module.f.js +8 -29
  198. package/{fs → fjs}/types/rtti/validate/proof.f.js +4 -9
  199. package/{fs → fjs}/types/sorted_list/proof.f.js +8 -21
  200. package/{fs → fjs}/types/sorted_set/proof.f.js +14 -39
  201. package/{fs → fjs}/types/string/module.f.js +10 -2
  202. package/fjs/types/string/proof.f.js +77 -0
  203. package/fjs/types/string_set/proof.f.js +43 -0
  204. package/{fs → fjs}/types/ts/proof.f.js +15 -42
  205. package/{fs → fjs}/types/uint8array/module.f.js +7 -7
  206. package/{fs → fjs}/types/uint8array/proof.f.d.ts +4 -1
  207. package/{fs → fjs}/types/uint8array/proof.f.js +7 -7
  208. package/{fs → fjs}/website/module.f.js +2 -3
  209. package/{fs → fjs}/website/proof.f.js +3 -6
  210. package/package.json +8 -8
  211. package/fs/asserts/module.f.d.ts +0 -4
  212. package/fs/asserts/module.f.js +0 -9
  213. package/fs/asserts/proof.f.d.ts +0 -8
  214. package/fs/asserts/proof.f.js +0 -51
  215. package/fs/bnf/data/module.f.d.ts +0 -30
  216. package/fs/bnf/descent/module.f.js +0 -119
  217. package/fs/bnf/proof.f.js +0 -104
  218. package/fs/cas/mcp/module.f.d.ts +0 -36
  219. package/fs/cas/proof.f.d.ts +0 -20
  220. package/fs/cas/proof.f.js +0 -294
  221. package/fs/common/monoid/module.f.js +0 -44
  222. package/fs/common/monoid/proof.f.d.ts +0 -4
  223. package/fs/common/monoid/proof.f.js +0 -27
  224. package/fs/crypto/pow/proof.f.js +0 -161
  225. package/fs/djs/tokenizer/module.f.d.ts +0 -12
  226. package/fs/djs/tokenizer/module.f.js +0 -62
  227. package/fs/djs/tokenizer/proof.f.d.ts +0 -7
  228. package/fs/djs/tokenizer/proof.f.js +0 -543
  229. package/fs/djs/tokenizer-new/module.f.d.ts +0 -3
  230. package/fs/djs/tokenizer-new/module.f.js +0 -155
  231. package/fs/effects/module.f.d.ts +0 -106
  232. package/fs/effects/module.f.js +0 -80
  233. package/fs/effects/proof.f.d.ts +0 -25
  234. package/fs/effects/proof.f.js +0 -115
  235. package/fs/media/revision/proof.f.js +0 -119
  236. package/fs/text/ascii/proof.f.d.ts +0 -4
  237. package/fs/types/bigfloat/proof.f.js +0 -348
  238. package/fs/types/nullable/proof.f.js +0 -50
  239. package/fs/types/range/module.f.js +0 -2
  240. package/fs/types/range/proof.f.js +0 -18
  241. package/fs/types/result/proof.f.js +0 -52
  242. package/fs/types/string/proof.f.js +0 -118
  243. package/fs/types/string_set/proof.f.js +0 -82
  244. /package/{fs → fjs}/asn.1/module.f.d.ts +0 -0
  245. /package/{fs → fjs}/asn.1/module.f.js +0 -0
  246. /package/{fs → fjs}/asn.1/proof.f.d.ts +0 -0
  247. /package/{fs → fjs}/base_n/module.f.d.ts +0 -0
  248. /package/{fs → fjs}/base_n/module.f.js +0 -0
  249. /package/{fs → fjs}/base_n/proof.f.d.ts +0 -0
  250. /package/{fs → fjs}/basen/base128/module.f.d.ts +0 -0
  251. /package/{fs → fjs}/basen/base128/module.f.js +0 -0
  252. /package/{fs → fjs}/basen/base128/proof.f.d.ts +0 -0
  253. /package/{fs → fjs}/basen/base128/proof.f.js +0 -0
  254. /package/{fs → fjs}/basen/base64/module.f.d.ts +0 -0
  255. /package/{fs → fjs}/basen/base64/module.f.js +0 -0
  256. /package/{fs → fjs}/basen/cbase32/module.f.d.ts +0 -0
  257. /package/{fs → fjs}/basen/cbase32/module.f.js +0 -0
  258. /package/{fs → fjs}/basen/cbase32/proof.f.d.ts +0 -0
  259. /package/{fs → fjs}/bnf/proof.f.d.ts +0 -0
  260. /package/{fs → fjs}/bnf/testlib.f.d.ts +0 -0
  261. /package/{fs → fjs}/cas/cli/module.f.d.ts +0 -0
  262. /package/{fs → fjs}/ci/bun/module.f.d.ts +0 -0
  263. /package/{fs → fjs}/ci/deno/module.f.d.ts +0 -0
  264. /package/{fs → fjs}/ci/module.f.d.ts +0 -0
  265. /package/{fs → fjs}/ci/node/module.f.d.ts +0 -0
  266. /package/{fs → fjs}/ci/playwright/module.f.d.ts +0 -0
  267. /package/{fs → fjs}/ci/playwright/module.f.js +0 -0
  268. /package/{fs → fjs}/ci/proof.f.d.ts +0 -0
  269. /package/{fs → fjs}/ci/rust/module.f.d.ts +0 -0
  270. /package/{fs → fjs}/cli/module.f.d.ts +0 -0
  271. /package/{fs → fjs}/cli/proof.f.d.ts +0 -0
  272. /package/{fs → fjs}/crypto/hmac/module.f.d.ts +0 -0
  273. /package/{fs → fjs}/crypto/hmac/module.f.js +0 -0
  274. /package/{fs → fjs}/crypto/hmac/proof.f.d.ts +0 -0
  275. /package/{fs → fjs}/crypto/pow/module.f.d.ts +0 -0
  276. /package/{fs → fjs}/crypto/pow/module.f.js +0 -0
  277. /package/{fs → fjs}/crypto/pow/proof.f.d.ts +0 -0
  278. /package/{fs → fjs}/crypto/secp/module.f.d.ts +0 -0
  279. /package/{fs → fjs}/crypto/secp/module.f.js +0 -0
  280. /package/{fs → fjs}/crypto/secp/proof.f.d.ts +0 -0
  281. /package/{fs → fjs}/crypto/sha2/module.f.d.ts +0 -0
  282. /package/{fs → fjs}/crypto/sha2/module.f.js +0 -0
  283. /package/{fs → fjs}/crypto/sha2/proof.f.d.ts +0 -0
  284. /package/{fs → fjs}/crypto/sign/proof.f.d.ts +0 -0
  285. /package/{fs → fjs}/crypto/vdf/module.f.d.ts +0 -0
  286. /package/{fs → fjs}/crypto/vdf/module.f.js +0 -0
  287. /package/{fs → fjs}/crypto/vdf/proof.f.d.ts +0 -0
  288. /package/{fs → fjs}/dev/module.f.d.ts +0 -0
  289. /package/{fs → fjs}/dev/package_json/module.f.d.ts +0 -0
  290. /package/{fs → fjs}/dev/package_json/module.f.js +0 -0
  291. /package/{fs → fjs}/dev/package_json/proof.f.d.ts +0 -0
  292. /package/{fs → fjs}/dev/proof.f.d.ts +0 -0
  293. /package/{fs → fjs}/djs/ast/module.f.d.ts +0 -0
  294. /package/{fs → fjs}/djs/ast/module.f.js +0 -0
  295. /package/{fs → fjs}/djs/ast/proof.f.d.ts +0 -0
  296. /package/{fs → fjs}/djs/examples/input.f.d.ts +0 -0
  297. /package/{fs → fjs}/djs/examples/input.f.js +0 -0
  298. /package/{fs → fjs}/djs/examples/m.f.d.ts +0 -0
  299. /package/{fs → fjs}/djs/examples/m.f.js +0 -0
  300. /package/{fs → fjs}/djs/module.f.d.ts +0 -0
  301. /package/{fs → fjs}/djs/parser/proof.f.d.ts +0 -0
  302. /package/{fs → fjs}/djs/proof.f.d.ts +0 -0
  303. /package/{fs → fjs}/djs/serializer/module.f.d.ts +0 -0
  304. /package/{fs → fjs}/djs/serializer/module.f.js +0 -0
  305. /package/{fs → fjs}/djs/serializer/proof.f.d.ts +0 -0
  306. /package/{fs → fjs}/djs/transpiler/module.f.d.ts +0 -0
  307. /package/{fs → fjs}/effects/memory/module.f.d.ts +0 -0
  308. /package/{fs → fjs}/effects/memory/module.f.js +0 -0
  309. /package/{fs → fjs}/effects/memory/proof.f.d.ts +0 -0
  310. /package/{fs → fjs}/effects/mock/module.f.d.ts +0 -0
  311. /package/{fs → fjs}/effects/mock/module.f.js +0 -0
  312. /package/{fs → fjs}/effects/module.d.ts +0 -0
  313. /package/{fs → fjs}/effects/module.js +0 -0
  314. /package/{fs → fjs}/effects/node/memory/module.d.ts +0 -0
  315. /package/{fs → fjs}/effects/node/memory/module.js +0 -0
  316. /package/{fs → fjs}/effects/node/memory/proof.d.ts +0 -0
  317. /package/{fs → fjs}/effects/node/virtual/module.f.d.ts +0 -0
  318. /package/{fs → fjs}/effects/node/virtual/module.f.js +0 -0
  319. /package/{fs → fjs}/emergent_testing/all.test.d.ts +0 -0
  320. /package/{fs → fjs}/emergent_testing/all.test.js +0 -0
  321. /package/{fs → fjs}/emergent_testing/example.f.d.ts +0 -0
  322. /package/{fs → fjs}/emergent_testing/example.f.js +0 -0
  323. /package/{fs → fjs}/emergent_testing/module.f.d.ts +0 -0
  324. /package/{fs → fjs}/emergent_testing/scenarios/all.d.ts +0 -0
  325. /package/{fs → fjs}/emergent_testing/scenarios/all.js +0 -0
  326. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -0
  327. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.js +0 -0
  328. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -0
  329. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.js +0 -0
  330. /package/{fs → fjs}/emergent_testing/scenarios/async.fail.d.ts +0 -0
  331. /package/{fs → fjs}/emergent_testing/scenarios/async.fail.js +0 -0
  332. /package/{fs → fjs}/emergent_testing/scenarios/async.pass.d.ts +0 -0
  333. /package/{fs → fjs}/emergent_testing/scenarios/async.pass.js +0 -0
  334. /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.d.ts +0 -0
  335. /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.js +0 -0
  336. /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.d.ts +0 -0
  337. /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.js +0 -0
  338. /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.d.ts +0 -0
  339. /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.js +0 -0
  340. /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.d.ts +0 -0
  341. /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.js +0 -0
  342. /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.d.ts +0 -0
  343. /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.js +0 -0
  344. /package/{fs → fjs}/fsc/bnf.f.d.ts +0 -0
  345. /package/{fs → fjs}/fsc/bnf.f.js +0 -0
  346. /package/{fs → fjs}/fsc/json.f.d.ts +0 -0
  347. /package/{fs → fjs}/fsc/json.f.js +0 -0
  348. /package/{fs → fjs}/fsc/module.f.d.ts +0 -0
  349. /package/{fs → fjs}/fsc/module.f.js +0 -0
  350. /package/{fs → fjs}/fsc/proof.f.d.ts +0 -0
  351. /package/{fs → fjs}/fsm/module.f.d.ts +0 -0
  352. /package/{fs → fjs}/fsm/module.f.js +0 -0
  353. /package/{fs → fjs}/fsm/proof.f.d.ts +0 -0
  354. /package/{fs → fjs}/js/tokenizer/module.f.d.ts +0 -0
  355. /package/{fs → fjs}/js/tokenizer/module.f.js +0 -0
  356. /package/{fs → fjs}/js/tokenizer/proof.f.d.ts +0 -0
  357. /package/{fs → fjs}/js/tokenizer/proof.f.js +0 -0
  358. /package/{fs → fjs}/mcp/proof.f.d.ts +0 -0
  359. /package/{fs → fjs}/mcp/stdio/proof.f.d.ts +0 -0
  360. /package/{fs → fjs}/mcp/stdio/proof.f.js +0 -0
  361. /package/{fs → fjs}/media/html/module.f.d.ts +0 -0
  362. /package/{fs → fjs}/media/html/module.f.js +0 -0
  363. /package/{fs → fjs}/media/html/proof.f.d.ts +0 -0
  364. /package/{fs → fjs}/media/json/module.f.d.ts +0 -0
  365. /package/{fs → fjs}/media/json/module.f.js +0 -0
  366. /package/{fs → fjs}/media/json/parser/proof.f.d.ts +0 -0
  367. /package/{fs → fjs}/media/json/proof.f.d.ts +0 -0
  368. /package/{fs → fjs}/media/json/proof.f.js +0 -0
  369. /package/{fs → fjs}/media/json/rpc/module.f.d.ts +0 -0
  370. /package/{fs → fjs}/media/json/rpc/proof.f.d.ts +0 -0
  371. /package/{fs → fjs}/media/json/rpc/proof.f.js +0 -0
  372. /package/{fs → fjs}/media/json/schema/proof.f.d.ts +0 -0
  373. /package/{fs → fjs}/media/json/serializer/module.f.d.ts +0 -0
  374. /package/{fs → fjs}/media/json/serializer/module.f.js +0 -0
  375. /package/{fs → fjs}/media/json/serializer/proof.f.d.ts +0 -0
  376. /package/{fs → fjs}/media/json/tokenizer/module.f.d.ts +0 -0
  377. /package/{fs → fjs}/media/json/tokenizer/module.f.js +0 -0
  378. /package/{fs → fjs}/media/json/tokenizer/proof.f.d.ts +0 -0
  379. /package/{fs → fjs}/media/json/tokenizer/proof.f.js +0 -0
  380. /package/{fs → fjs}/media/proof.f.d.ts +0 -0
  381. /package/{fs → fjs}/media/type/module.f.d.ts +0 -0
  382. /package/{fs → fjs}/media/type/proof.f.d.ts +0 -0
  383. /package/{fs → fjs}/module.d.ts +0 -0
  384. /package/{fs → fjs}/module.f.d.ts +0 -0
  385. /package/{fs → fjs}/module.js +0 -0
  386. /package/{fs → fjs}/path/module.f.d.ts +0 -0
  387. /package/{fs → fjs}/path/module.f.js +0 -0
  388. /package/{fs → fjs}/path/proof.f.d.ts +0 -0
  389. /package/{fs → fjs}/proof.f.d.ts +0 -0
  390. /package/{fs → fjs}/sul/id/module.f.d.ts +0 -0
  391. /package/{fs → fjs}/sul/id/module.f.js +0 -0
  392. /package/{fs → fjs}/sul/id/proof.f.d.ts +0 -0
  393. /package/{fs → fjs}/sul/level/hash/module.f.d.ts +0 -0
  394. /package/{fs → fjs}/sul/level/hash/module.f.js +0 -0
  395. /package/{fs → fjs}/sul/level/hash/proof.f.d.ts +0 -0
  396. /package/{fs → fjs}/sul/level/literal/module.f.d.ts +0 -0
  397. /package/{fs → fjs}/sul/level/literal/module.f.js +0 -0
  398. /package/{fs → fjs}/sul/level/literal/proof.f.d.ts +0 -0
  399. /package/{fs → fjs}/sul/module.f.d.ts +0 -0
  400. /package/{fs → fjs}/sul/module.f.js +0 -0
  401. /package/{fs → fjs}/sul/proof.f.d.ts +0 -0
  402. /package/{fs → fjs}/sul/proof.f.js +0 -0
  403. /package/{fs → fjs}/text/ascii/module.f.d.ts +0 -0
  404. /package/{fs → fjs}/text/ascii/module.f.js +0 -0
  405. /package/{fs → fjs}/text/code_point/module.f.d.ts +0 -0
  406. /package/{fs → fjs}/text/code_point/proof.f.d.ts +0 -0
  407. /package/{fs → fjs}/text/code_point/proof.f.js +0 -0
  408. /package/{fs → fjs}/text/module.f.d.ts +0 -0
  409. /package/{fs → fjs}/text/module.f.js +0 -0
  410. /package/{fs → fjs}/text/proof.f.d.ts +0 -0
  411. /package/{fs → fjs}/text/sgr/module.f.d.ts +0 -0
  412. /package/{fs → fjs}/text/sgr/module.f.js +0 -0
  413. /package/{fs → fjs}/text/sgr/proof.f.d.ts +0 -0
  414. /package/{fs → fjs}/text/utf16/module.f.d.ts +0 -0
  415. /package/{fs → fjs}/text/utf16/proof.f.d.ts +0 -0
  416. /package/{fs → fjs}/text/utf8/module.f.d.ts +0 -0
  417. /package/{fs → fjs}/text/utf8/module.f.js +0 -0
  418. /package/{fs → fjs}/text/utf8/proof.f.d.ts +0 -0
  419. /package/{fs → fjs}/types/array/module.f.d.ts +0 -0
  420. /package/{fs → fjs}/types/array/module.f.js +0 -0
  421. /package/{fs → fjs}/types/array/proof.f.d.ts +0 -0
  422. /package/{fs → fjs}/types/bigfloat/module.f.d.ts +0 -0
  423. /package/{fs → fjs}/types/bigfloat/module.f.js +0 -0
  424. /package/{fs → fjs}/types/bigfloat/proof.f.d.ts +0 -0
  425. /package/{fs → fjs}/types/bigint/module.f.d.ts +0 -0
  426. /package/{fs → fjs}/types/bigint/proof.f.d.ts +0 -0
  427. /package/{fs → fjs}/types/bit_vec/module.f.d.ts +0 -0
  428. /package/{fs → fjs}/types/bit_vec/proof.f.d.ts +0 -0
  429. /package/{fs → fjs}/types/btree/find/module.f.d.ts +0 -0
  430. /package/{fs → fjs}/types/btree/find/module.f.js +0 -0
  431. /package/{fs → fjs}/types/btree/find/proof.f.d.ts +0 -0
  432. /package/{fs → fjs}/types/btree/module.f.d.ts +0 -0
  433. /package/{fs → fjs}/types/btree/module.f.js +0 -0
  434. /package/{fs → fjs}/types/btree/proof.f.d.ts +0 -0
  435. /package/{fs → fjs}/types/btree/set/module.f.d.ts +0 -0
  436. /package/{fs → fjs}/types/btree/set/proof.f.d.ts +0 -0
  437. /package/{fs → fjs}/types/btree/types/module.f.d.ts +0 -0
  438. /package/{fs → fjs}/types/btree/types/module.f.js +0 -0
  439. /package/{fs → fjs}/types/byte_set/module.f.d.ts +0 -0
  440. /package/{fs → fjs}/types/byte_set/module.f.js +0 -0
  441. /package/{fs → fjs}/types/byte_set/proof.f.d.ts +0 -0
  442. /package/{fs → fjs}/types/function/compare/module.f.d.ts +0 -0
  443. /package/{fs → fjs}/types/function/compare/module.f.js +0 -0
  444. /package/{fs → fjs}/types/function/compare/proof.f.d.ts +0 -0
  445. /package/{fs → fjs}/types/function/module.f.d.ts +0 -0
  446. /package/{fs → fjs}/types/function/module.f.js +0 -0
  447. /package/{fs → fjs}/types/function/operator/module.f.d.ts +0 -0
  448. /package/{fs → fjs}/types/function/operator/module.f.js +0 -0
  449. /package/{fs → fjs}/types/function/operator/proof.f.d.ts +0 -0
  450. /package/{fs → fjs}/types/function/proof.f.d.ts +0 -0
  451. /package/{fs → fjs}/types/map/module.f.d.ts +0 -0
  452. /package/{fs → fjs}/types/map/module.f.js +0 -0
  453. /package/{fs → fjs}/types/map/proof.f.d.ts +0 -0
  454. /package/{fs → fjs}/types/nibble_set/module.f.d.ts +0 -0
  455. /package/{fs → fjs}/types/nibble_set/module.f.js +0 -0
  456. /package/{fs → fjs}/types/nibble_set/proof.f.d.ts +0 -0
  457. /package/{fs → fjs}/types/nominal/module.f.d.ts +0 -0
  458. /package/{fs → fjs}/types/nominal/module.f.js +0 -0
  459. /package/{fs → fjs}/types/nominal/proof.f.d.ts +0 -0
  460. /package/{fs → fjs}/types/nullable/module.f.d.ts +0 -0
  461. /package/{fs → fjs}/types/nullable/module.f.js +0 -0
  462. /package/{fs → fjs}/types/nullable/proof.f.d.ts +0 -0
  463. /package/{fs → fjs}/types/number/module.f.d.ts +0 -0
  464. /package/{fs → fjs}/types/number/proof.f.d.ts +0 -0
  465. /package/{fs → fjs}/types/object/module.f.d.ts +0 -0
  466. /package/{fs → fjs}/types/object/module.f.js +0 -0
  467. /package/{fs → fjs}/types/object/proof.f.d.ts +0 -0
  468. /package/{fs → fjs}/types/option/module.f.d.ts +0 -0
  469. /package/{fs → fjs}/types/option/module.f.js +0 -0
  470. /package/{fs → fjs}/types/ordered_map/module.f.d.ts +0 -0
  471. /package/{fs → fjs}/types/ordered_map/module.f.js +0 -0
  472. /package/{fs → fjs}/types/ordered_map/proof.f.d.ts +0 -0
  473. /package/{fs → fjs}/types/ordered_map/proof.f.js +0 -0
  474. /package/{fs → fjs}/types/patricia_trie/module.f.d.ts +0 -0
  475. /package/{fs → fjs}/types/patricia_trie/module.f.js +0 -0
  476. /package/{fs → fjs}/types/patricia_trie/proof.f.d.ts +0 -0
  477. /package/{fs → fjs}/types/phantom/module.f.d.ts +0 -0
  478. /package/{fs → fjs}/types/phantom/module.f.js +0 -0
  479. /package/{fs → fjs}/types/prime_field/module.f.d.ts +0 -0
  480. /package/{fs → fjs}/types/prime_field/proof.f.d.ts +0 -0
  481. /package/{fs → fjs}/types/prime_field/proof.f.js +0 -0
  482. /package/{fs → fjs}/types/range/proof.f.d.ts +0 -0
  483. /package/{fs → fjs}/types/range_map/module.f.d.ts +0 -0
  484. /package/{fs → fjs}/types/range_map/module.f.js +0 -0
  485. /package/{fs → fjs}/types/range_map/proof.f.d.ts +0 -0
  486. /package/{fs → fjs}/types/result/module.d.ts +0 -0
  487. /package/{fs → fjs}/types/result/module.f.d.ts +0 -0
  488. /package/{fs → fjs}/types/result/module.f.js +0 -0
  489. /package/{fs → fjs}/types/result/module.js +0 -0
  490. /package/{fs → fjs}/types/rtti/module.f.d.ts +0 -0
  491. /package/{fs → fjs}/types/rtti/module.f.js +0 -0
  492. /package/{fs → fjs}/types/rtti/parse/module.f.d.ts +0 -0
  493. /package/{fs → fjs}/types/rtti/parse/proof.f.d.ts +0 -0
  494. /package/{fs → fjs}/types/rtti/proof.f.d.ts +0 -0
  495. /package/{fs → fjs}/types/rtti/proof.f.js +0 -0
  496. /package/{fs → fjs}/types/rtti/ts/module.f.js +0 -0
  497. /package/{fs → fjs}/types/rtti/ts/proof.f.d.ts +0 -0
  498. /package/{fs → fjs}/types/rtti/ts/proof.f.js +0 -0
  499. /package/{fs → fjs}/types/rtti/validate/module.f.d.ts +0 -0
  500. /package/{fs → fjs}/types/rtti/validate/proof.f.d.ts +0 -0
  501. /package/{fs → fjs}/types/sorted_list/module.f.d.ts +0 -0
  502. /package/{fs → fjs}/types/sorted_list/module.f.js +0 -0
  503. /package/{fs → fjs}/types/sorted_list/proof.f.d.ts +0 -0
  504. /package/{fs → fjs}/types/sorted_set/module.f.d.ts +0 -0
  505. /package/{fs → fjs}/types/sorted_set/module.f.js +0 -0
  506. /package/{fs → fjs}/types/sorted_set/proof.f.d.ts +0 -0
  507. /package/{fs → fjs}/types/string/module.f.d.ts +0 -0
  508. /package/{fs → fjs}/types/string/proof.f.d.ts +0 -0
  509. /package/{fs → fjs}/types/string_set/module.f.d.ts +0 -0
  510. /package/{fs → fjs}/types/string_set/module.f.js +0 -0
  511. /package/{fs → fjs}/types/string_set/proof.f.d.ts +0 -0
  512. /package/{fs → fjs}/types/ts/module.f.d.ts +0 -0
  513. /package/{fs → fjs}/types/ts/module.f.js +0 -0
  514. /package/{fs → fjs}/types/ts/proof.f.d.ts +0 -0
  515. /package/{fs → fjs}/types/uint8array/module.f.d.ts +0 -0
  516. /package/{fs → fjs}/website/module.f.d.ts +0 -0
  517. /package/{fs → fjs}/website/proof.f.d.ts +0 -0
@@ -3,21 +3,16 @@ import { identity } from '../../types/function/module.f.js';
3
3
  import { sort } from '../../types/object/module.f.js';
4
4
  import { oneEncode, option, range, rangeDecode, repeat0Plus, set } from '../module.f.js';
5
5
  import { classic, deterministic } from '../testlib.f.js';
6
- import { toData } from './module.f.js';
6
+ import { emptyTagMap, toData } from './module.f.js';
7
+ import { assertEq } from '../../asserts/module.f.js';
7
8
  export const proof = {
8
9
  rangeDecode: () => {
9
10
  const decoded1 = stringify(sort)(rangeDecode(0x000079_000087));
10
- if (decoded1 !== '[121,135]') {
11
- throw decoded1;
12
- }
11
+ assertEq(decoded1, '[121,135]');
13
12
  const decoded2 = stringify(sort)(rangeDecode(0x000080_000087));
14
- if (decoded2 !== '[128,135]') {
15
- throw decoded2;
16
- }
13
+ assertEq(decoded2, '[128,135]');
17
14
  const decoded3 = stringify(sort)(rangeDecode(0x10FFFF_10FFFF));
18
- if (decoded3 !== '[1114111,1114111]') {
19
- throw decoded3;
20
- }
15
+ assertEq(decoded3, '[1114111,1114111]');
21
16
  },
22
17
  rangeEncode: () => {
23
18
  const encoded1 = oneEncode(0x79);
@@ -70,26 +65,20 @@ export const proof = {
70
65
  const varintRule = { true: 'true', false: 'false' };
71
66
  const result = stringify(sort)(toData(varintRule));
72
67
  const expected = '[{"":{"false":"5","true":"0"},"0":["1","2","3","4"],"1":1946157172,"2":1912602738,"3":1962934389,"4":1694498917,"5":["6","7","8","9","4"],"6":1711276134,"7":1627390049,"8":1811939436,"9":1929379955},""]';
73
- if (result !== expected) {
74
- throw [result, expected];
75
- }
68
+ assertEq(result, expected, [result, expected]);
76
69
  },
77
70
  () => {
78
71
  const lazyRule = () => 'true';
79
72
  const lazyRule0 = () => 'false';
80
73
  const result = stringify(sort)(toData([lazyRule, lazyRule0]));
81
74
  const expected = '[{"":["lazyRule","lazyRule0"],"0":1946157172,"1":1912602738,"2":1962934389,"3":1694498917,"4":1711276134,"5":1627390049,"6":1811939436,"7":1929379955,"lazyRule":["0","1","2","3"],"lazyRule0":["4","5","6","7","3"]},""]';
82
- if (result !== expected) {
83
- throw [result, expected];
84
- }
75
+ assertEq(result, expected, [result, expected]);
85
76
  },
86
77
  () => {
87
78
  const emptyRule = '';
88
79
  const result = stringify(sort)(toData(emptyRule));
89
80
  const expected = '[{"":[]},""]';
90
- if (result !== expected) {
91
- throw [result, expected];
92
- }
81
+ assertEq(result, expected, [result, expected]);
93
82
  },
94
83
  () => {
95
84
  const optionRule = option('a');
@@ -120,6 +109,52 @@ export const proof = {
120
109
  throw result;
121
110
  }
122
111
  },
112
+ emptyTagMap: [
113
+ () => {
114
+ const stringRule = 'true';
115
+ const result = JSON.stringify(emptyTagMap(toData(stringRule)[0]));
116
+ assertEq(result, '{}');
117
+ },
118
+ () => {
119
+ const emptyRule = '';
120
+ const result = JSON.stringify(emptyTagMap(toData(emptyRule)[0]));
121
+ assertEq(result, '{"":true}');
122
+ },
123
+ () => {
124
+ const emptyRule = '';
125
+ const varintRule = { true: 'true', e: emptyRule };
126
+ const result = JSON.stringify(emptyTagMap(toData(varintRule)[0]));
127
+ assertEq(result, '{"5":true,"":"e"}');
128
+ },
129
+ () => {
130
+ const repeatRule = repeat0Plus(option('a'));
131
+ const result = JSON.stringify(emptyTagMap(toData(repeatRule)[0]));
132
+ assertEq(result, '{"0":"none","3":true,"":true,"r":"none"}');
133
+ },
134
+ () => {
135
+ // Regression for the sequence case: a sequence is nullable iff
136
+ // *all* of its items are, not just the first one. The old
137
+ // descent-only implementation pinned the result to nullable as
138
+ // soon as it saw the leading empty item, and reported this
139
+ // 2-item sequence as nullable even though its second item is a
140
+ // mandatory terminal.
141
+ const data = toData(['', range('AA')]);
142
+ const emptyTags = emptyTagMap(data[0]);
143
+ assertEq(emptyTags[data[1]], undefined, emptyTags);
144
+ },
145
+ () => {
146
+ // Regression: a fixed round count (one round per rule) settles
147
+ // the nullable/non-nullable *set* — a standard result — but a
148
+ // variant's chosen *tag* can still change for rounds after that,
149
+ // while a cyclic dependency's own tag catches up. Here A is
150
+ // nullable via 'x' (A -> E, both settle in 2 rounds), but B (a
151
+ // 1-item sequence over A) only becomes nullable once A does, and
152
+ // once B is nullable, A's true winning branch is 'y' (A -> B) —
153
+ // reachable only by iterating to an actual fixpoint.
154
+ const rs = { A: { x: 'E', y: 'B' }, B: ['A'], E: [] };
155
+ assertEq(emptyTagMap(rs).A, 'y');
156
+ },
157
+ ],
123
158
  example: () => {
124
159
  const grammar = {
125
160
  space: 0x000020_000020,
@@ -1,20 +1,16 @@
1
1
  /**
2
2
  * Recursive descent matcher backend over the BNF data {@link RuleSet}.
3
3
  *
4
- * Built from the serializable IR in `fs/bnf/data`, this is a sibling of the
5
- * LL(1) dispatch builder (`fs/bnf/ll1`). It walks the grammar by recursive
4
+ * Built from the serializable IR in `fjs/bnf/data`, this is a sibling of the
5
+ * LL(1) dispatch builder (`fjs/bnf/ll1`). It walks the grammar by recursive
6
6
  * descent and preserves per-code-point metadata, producing a metadata-aware
7
- * AST ({@link AstRuleMeta}). It also exposes {@link createEmptyTagMap}, which
8
- * records whether each rule can match the empty input.
7
+ * AST ({@link AstRuleMeta}). Nullability (which rule can match empty input) is
8
+ * computed once by {@link emptyTagMap} in `fjs/bnf/data`.
9
9
  *
10
10
  * @module
11
11
  */
12
12
  import { type CodePoint } from '../../text/utf16/module.f.ts';
13
- import { type StringMap } from '../../types/object/module.f.ts';
14
- import { type RuleSet } from '../data/module.f.ts';
15
13
  import { type Rule as FRule } from '../module.f.ts';
16
- type EmptyTagEntry = string | boolean;
17
- type EmptyTagMap = StringMap<string, EmptyTagEntry>;
18
14
  export type AstTag = string | true | undefined;
19
15
  /**
20
16
  * Recursive descent matcher for a single named rule.
@@ -43,14 +39,8 @@ export type AstRuleMeta<T> = {
43
39
  readonly tag: AstTag;
44
40
  readonly sequence: AstSequenceMeta<T>;
45
41
  };
46
- /**
47
- * Creates a map that describes whether each rule can consume empty input and,
48
- * for tagged variants, which tag represents the empty match.
49
- */
50
- export declare const createEmptyTagMap: (data: readonly [RuleSet, string]) => EmptyTagMap;
51
42
  /**
52
43
  * Creates a recursive descent parser that preserves metadata for each consumed
53
44
  * code point.
54
45
  */
55
46
  export declare const descentParser: <T>(fr: FRule) => DescentMatch<T>;
56
- export {};
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Recursive descent matcher backend over the BNF data {@link RuleSet}.
3
+ *
4
+ * Built from the serializable IR in `fjs/bnf/data`, this is a sibling of the
5
+ * LL(1) dispatch builder (`fjs/bnf/ll1`). It walks the grammar by recursive
6
+ * descent and preserves per-code-point metadata, producing a metadata-aware
7
+ * AST ({@link AstRuleMeta}). Nullability (which rule can match empty input) is
8
+ * computed once by {@link emptyTagMap} in `fjs/bnf/data`.
9
+ *
10
+ * @module
11
+ */
12
+ import {} from '../../text/utf16/module.f.js';
13
+ import { rangeDecode } from '../module.f.js';
14
+ import { contains as rangeContains } from '../../types/range/module.f.js';
15
+ import { definedEntries } from '../../types/object/module.f.js';
16
+ import { emptyTagMap, toData } from '../data/module.f.js';
17
+ import {} from '../module.f.js';
18
+ /**
19
+ * Creates a recursive descent parser that preserves metadata for each consumed
20
+ * code point.
21
+ */
22
+ export const descentParser = (fr) => {
23
+ const data = toData(fr);
24
+ const emptyTags = emptyTagMap(data[0]);
25
+ // The recursive-descent matcher as an explicit-stack machine: each iteration either
26
+ // starts the current task (pushing a frame for a sequence/variant and descending into
27
+ // its first child) or feeds the pending result into the innermost frame. Semantics are
28
+ // identical to the former recursive `f`, but the JS call stack stays O(1) regardless of
29
+ // grammar recursion depth — right-recursive rules (e.g. repeat0Plus chains) no longer
30
+ // overflow on long input (see the longInput proof group).
31
+ const f = (name, tag, cp, idx) => {
32
+ const mrSuccess = (tag, sequence, idx) => [{ tag, sequence }, true, idx];
33
+ const mrFail = (tag, sequence, idx) => [{ tag, sequence }, false, idx];
34
+ let stack = null;
35
+ let task = { name, tag, idx };
36
+ let result = mrFail(undefined, [], idx);
37
+ while (true) {
38
+ if (task !== null) {
39
+ const { name, tag, idx } = task;
40
+ task = null;
41
+ // The explicit annotation cuts a control-flow inference cycle (TS7022):
42
+ // `name`'s narrowed type feeds `rule`, whose type would otherwise feed the
43
+ // later `task` assignments that `name`'s narrowing depends on.
44
+ const rule = data[0][name];
45
+ if (typeof rule === 'number') {
46
+ const emptyTag = emptyTags[name];
47
+ if (idx >= cp.length) {
48
+ result = emptyTag === undefined ? mrFail(emptyTag, [], idx) : mrSuccess(emptyTag, [], idx);
49
+ }
50
+ else {
51
+ const cpi = cp[idx];
52
+ const range = rangeDecode(rule);
53
+ result = rangeContains(...range)(cpi[0]) ? mrSuccess(tag, [cpi], idx + 1) : mrFail(emptyTag, [], idx);
54
+ }
55
+ }
56
+ else if (rule instanceof Array) {
57
+ if (rule.length === 0) {
58
+ result = mrSuccess(tag, [], idx);
59
+ }
60
+ else {
61
+ stack = { top: { kind: 'seq', tag, items: rule, itemIndex: 0, startIdx: idx, seq: [] }, rest: stack };
62
+ task = { name: rule[0], tag: undefined, idx };
63
+ }
64
+ }
65
+ else {
66
+ const entries = definedEntries(rule);
67
+ const emptyTag = emptyTags[name];
68
+ const emptyResult = mrFail(emptyTag, [], idx);
69
+ if (entries.length === 0) {
70
+ result = emptyResult;
71
+ }
72
+ else {
73
+ stack = { top: { kind: 'variant', entries, entryIndex: 0, idx, emptyResult }, rest: stack };
74
+ const [entryTag, entryName] = entries[0];
75
+ task = { name: entryName, tag: entryTag, idx };
76
+ }
77
+ }
78
+ continue;
79
+ }
80
+ if (stack === null) {
81
+ return result;
82
+ }
83
+ const frame = stack.top;
84
+ stack = stack.rest;
85
+ if (frame.kind === 'seq') {
86
+ const [astRule, success, nidx] = result;
87
+ if (success === false) {
88
+ result = mrFail(frame.tag, [], frame.startIdx);
89
+ }
90
+ else {
91
+ const seq = [...frame.seq, astRule];
92
+ const itemIndex = frame.itemIndex + 1;
93
+ if (itemIndex < frame.items.length) {
94
+ stack = { top: { ...frame, itemIndex, seq }, rest: stack };
95
+ task = { name: frame.items[itemIndex], tag: undefined, idx: nidx };
96
+ }
97
+ else {
98
+ result = mrSuccess(frame.tag, seq, nidx);
99
+ }
100
+ }
101
+ }
102
+ else {
103
+ // success that consumed input wins immediately: the frame stays popped and
104
+ // `result` propagates to the frame below, matching the recursive `return m`.
105
+ if (!(result[1] && frame.idx !== result[2])) {
106
+ const emptyResult = result[1] ? result : frame.emptyResult;
107
+ const entryIndex = frame.entryIndex + 1;
108
+ if (entryIndex < frame.entries.length) {
109
+ stack = { top: { ...frame, entryIndex, emptyResult }, rest: stack };
110
+ const [entryTag, entryName] = frame.entries[entryIndex];
111
+ task = { name: entryName, tag: entryTag, idx: frame.idx };
112
+ }
113
+ else {
114
+ result = emptyResult;
115
+ }
116
+ }
117
+ }
118
+ }
119
+ };
120
+ const match = (name, cp) => {
121
+ return f(name, undefined, cp, 0);
122
+ };
123
+ return match;
124
+ };
@@ -1,5 +1,6 @@
1
1
  export declare const proof: {
2
2
  emptyTags: (() => void)[];
3
3
  descentParser: (() => void)[];
4
+ longInput: (() => void)[];
4
5
  descentParserWithMeta: (() => void)[];
5
6
  };
@@ -2,8 +2,9 @@ import { stringToCodePointList } from '../../text/utf16/module.f.js';
2
2
  import { map, toArray } from '../../types/list/module.f.js';
3
3
  import { commaJoin0Plus, option, range, repeat0Plus, set } from '../module.f.js';
4
4
  import { deterministic } from '../testlib.f.js';
5
- import { toData } from '../data/module.f.js';
6
- import { createEmptyTagMap, descentParser } from './module.f.js';
5
+ import { emptyTagMap, toData } from '../data/module.f.js';
6
+ import { descentParser } from './module.f.js';
7
+ import { assertEq } from '../../asserts/module.f.js';
7
8
  const mapCodePoint = (cp) => [cp, undefined];
8
9
  const descentParserCpOnly = (m, name, cp) => {
9
10
  const cpm = toArray(map(mapCodePoint)(cp));
@@ -14,34 +15,34 @@ export const proof = {
14
15
  () => {
15
16
  const stringRule = 'true';
16
17
  const data = toData(stringRule);
17
- const emptyTags = createEmptyTagMap(data);
18
+ const emptyTags = emptyTagMap(data[0]);
18
19
  const result = JSON.stringify(emptyTags);
19
- if (result !== '{"0":false,"1":false,"2":false,"3":false,"":false}') {
20
+ if (result !== '{}') {
20
21
  throw result;
21
22
  }
22
23
  },
23
24
  () => {
24
25
  const terminalRangeRule = range('AF');
25
26
  const data = toData(terminalRangeRule);
26
- const emptyTags = createEmptyTagMap(data);
27
+ const emptyTags = emptyTagMap(data[0]);
27
28
  const result = JSON.stringify(emptyTags);
28
- if (result !== '{"":false}') {
29
+ if (result !== '{}') {
29
30
  throw result;
30
31
  }
31
32
  },
32
33
  () => {
33
34
  const varintRule = { true: 'true', false: 'false' };
34
35
  const data = toData(varintRule);
35
- const emptyTags = createEmptyTagMap(data);
36
+ const emptyTags = emptyTagMap(data[0]);
36
37
  const result = JSON.stringify(emptyTags);
37
- if (result !== '{"0":false,"1":false,"2":false,"3":false,"4":false,"5":false,"6":false,"7":false,"8":false,"9":false,"":false}') {
38
+ if (result !== '{}') {
38
39
  throw result;
39
40
  }
40
41
  },
41
42
  () => {
42
43
  const emptyRule = '';
43
44
  const data = toData(emptyRule);
44
- const emptyTags = createEmptyTagMap(data);
45
+ const emptyTags = emptyTagMap(data[0]);
45
46
  const result = JSON.stringify(emptyTags);
46
47
  if (result !== '{"":true}') {
47
48
  throw result;
@@ -51,27 +52,27 @@ export const proof = {
51
52
  const emptyRule = '';
52
53
  const varintRule = { true: 'true', e: emptyRule };
53
54
  const data = toData(varintRule);
54
- const emptyTags = createEmptyTagMap(data);
55
+ const emptyTags = emptyTagMap(data[0]);
55
56
  const result = JSON.stringify(emptyTags);
56
- if (result !== '{"0":false,"1":false,"2":false,"3":false,"4":false,"5":true,"":"e"}') {
57
+ if (result !== '{"5":true,"":"e"}') {
57
58
  throw result;
58
59
  }
59
60
  },
60
61
  () => {
61
62
  const repeatRule = repeat0Plus(option('a'));
62
63
  const data = toData(repeatRule);
63
- const emptyTags = createEmptyTagMap(data);
64
+ const emptyTags = emptyTagMap(data[0]);
64
65
  const result = JSON.stringify(emptyTags);
65
- if (result !== '{"0":"none","1":false,"2":false,"3":true,"r":"none","":true}') {
66
+ if (result !== '{"0":"none","3":true,"":true,"r":"none"}') {
66
67
  throw result;
67
68
  }
68
69
  },
69
70
  () => {
70
71
  const repeatRule = repeat0Plus(set(' \n\r\t'));
71
72
  const data = toData(repeatRule);
72
- const emptyTags = createEmptyTagMap(data);
73
+ const emptyTags = emptyTagMap(data[0]);
73
74
  const result = JSON.stringify(emptyTags);
74
- if (result !== '{"0":false,"1":false,"2":false,"3":false,"4":false,"5":true,"r":"none","":true}') {
75
+ if (result !== '{"5":true,"r":"none"}') {
75
76
  throw result;
76
77
  }
77
78
  }
@@ -151,6 +152,15 @@ export const proof = {
151
152
  throw result;
152
153
  }
153
154
  },
155
+ () => {
156
+ const emptyVariantRule = {};
157
+ const m = descentParser(emptyVariantRule);
158
+ const mr = m("", []);
159
+ const result = JSON.stringify(mr);
160
+ if (result !== '[{"sequence":[]},false,0]') {
161
+ throw result;
162
+ }
163
+ },
154
164
  () => {
155
165
  const stringRule = 'AB';
156
166
  const m = descentParser(stringRule);
@@ -214,9 +224,7 @@ export const proof = {
214
224
  const cp = toArray(stringToCodePointList(s));
215
225
  const mr = descentParserCpOnly(m, '', cp);
216
226
  const success = mr[1] && mr[2] === cp.length;
217
- if (success !== expected) {
218
- throw mr;
219
- }
227
+ assertEq(success, expected, mr);
220
228
  };
221
229
  expect('a', true);
222
230
  expect('', true);
@@ -236,9 +244,7 @@ export const proof = {
236
244
  const cp = toArray(stringToCodePointList(s));
237
245
  const mr = descentParserCpOnly(m, 'value', cp);
238
246
  const success = mr[1] && mr[2] === cp.length;
239
- if (success !== expected) {
240
- throw mr;
241
- }
247
+ assertEq(success, expected, mr);
242
248
  };
243
249
  expect('', false);
244
250
  expect('[]', true);
@@ -252,9 +258,7 @@ export const proof = {
252
258
  const cp = toArray(stringToCodePointList(s));
253
259
  const mr = descentParserCpOnly(m, '', cp);
254
260
  const success = mr[1] && mr[2] === cp.length;
255
- if (success !== expected) {
256
- throw mr;
257
- }
261
+ assertEq(success, expected, mr);
258
262
  };
259
263
  expect(' true ', true);
260
264
  expect(' tr2ue ', false);
@@ -278,6 +282,33 @@ export const proof = {
278
282
  expect(' [{ "q": [ 12, false, [}], "a"] }] ', false);
279
283
  }
280
284
  ],
285
+ // Regression for the stack-recursive matcher bug: the matcher used to recurse
286
+ // natively once per grammar step, so match depth grew with input length and these
287
+ // inputs threw "RangeError: Maximum call stack size exceeded" at a few thousand
288
+ // code points. The explicit-frame-stack matcher handles them in O(1) JS call stack.
289
+ longInput: [
290
+ () => {
291
+ // long right-recursive repetition: one repeat0Plus chain across the whole input
292
+ const rule = repeat0Plus(set(' \n\r\t'));
293
+ const name = toData(rule)[1];
294
+ const m = descentParser(rule);
295
+ const cp = toArray(stringToCodePointList(' '.repeat(10000)));
296
+ const [, ok, idx] = descentParserCpOnly(m, name, cp);
297
+ assertEq(ok, true);
298
+ assertEq(idx, 10000);
299
+ },
300
+ () => {
301
+ // deep non-repetition nesting: 5000 bracket levels in the JSON-like test
302
+ // grammar — a shape that repetition-specific fixes (a `repeat` primitive)
303
+ // would not cover
304
+ const m = descentParser(deterministic());
305
+ const n = 5000;
306
+ const cp = toArray(stringToCodePointList('['.repeat(n) + ']'.repeat(n)));
307
+ const [, ok, idx] = descentParserCpOnly(m, '', cp);
308
+ assertEq(ok, true);
309
+ assertEq(idx, n * 2);
310
+ },
311
+ ],
281
312
  descentParserWithMeta: [
282
313
  () => {
283
314
  const emptyRule = '';
@@ -1,20 +1,20 @@
1
1
  /**
2
2
  * LL(1) dispatch/matcher backend over the BNF data {@link RuleSet}.
3
3
  *
4
- * Built from the serializable IR in `fs/bnf/data`, this is one member of the
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
7
  * ({@link MatchResult}). It throws at build time (`can not merge …`) when the
8
- * grammar is not LL(1) — a first/first conflict.
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.
9
10
  *
10
11
  * @module
11
12
  */
12
13
  import { type CodePoint } from '../../text/utf16/module.f.ts';
13
14
  import { type RangeMapArray } from '../../types/range_map/module.f.ts';
14
15
  import { type StringMap } from '../../types/object/module.f.ts';
15
- import { type RuleSet } from '../data/module.f.ts';
16
+ import { type EmptyTag, type RuleSet } from '../data/module.f.ts';
16
17
  import { type Rule as FRule } from '../module.f.ts';
17
- type EmptyTag = string | true | undefined;
18
18
  type DispatchRule = {
19
19
  readonly emptyTag: EmptyTag;
20
20
  readonly rangeMap: Dispatch;
@@ -1,11 +1,12 @@
1
1
  /**
2
2
  * LL(1) dispatch/matcher backend over the BNF data {@link RuleSet}.
3
3
  *
4
- * Built from the serializable IR in `fs/bnf/data`, this is one member of the
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
7
  * ({@link MatchResult}). It throws at build time (`can not merge …`) when the
8
- * grammar is not LL(1) — a first/first conflict.
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.
9
10
  *
10
11
  * @module
11
12
  */
@@ -16,7 +17,7 @@ import { rangeMap } from '../../types/range_map/module.f.js';
16
17
  import { contains, set } from '../../types/string_set/module.f.js';
17
18
  import { rangeDecode } from '../module.f.js';
18
19
  import { definedEntries } from '../../types/object/module.f.js';
19
- import { toData } from '../data/module.f.js';
20
+ import { emptyTagMap, toData } from '../data/module.f.js';
20
21
  import {} from '../module.f.js';
21
22
  const dispatchOp = rangeMap({
22
23
  union: a => b => {
@@ -35,6 +36,7 @@ const dispatchOp = rangeMap({
35
36
  * Builds a dispatch map for a {@link RuleSet} to enable predictive parsing.
36
37
  */
37
38
  export const dispatchMap = (ruleSet) => {
39
+ const nullMap = emptyTagMap(ruleSet);
38
40
  const addRuleToDispatch = (dr, name) => {
39
41
  if (dr === null)
40
42
  return null;
@@ -70,7 +72,7 @@ export const dispatchMap = (ruleSet) => {
70
72
  if (emptyTag === true) {
71
73
  result = result.map(x => [addRuleToDispatch(x[0], item), x[1]]);
72
74
  result = toArray(dispatchOp.merge(result)(dr.rangeMap));
73
- emptyTag = dr.emptyTag !== undefined ? true : undefined;
75
+ emptyTag = nullMap[item] !== undefined ? true : undefined;
74
76
  }
75
77
  else {
76
78
  result = result.map(x => [addRuleToDispatch(x[0], item), x[1]]);
@@ -87,7 +89,7 @@ export const dispatchMap = (ruleSet) => {
87
89
  for (const [tag, item] of entries) {
88
90
  dm = dispatchRule(dm, item, newCurrent);
89
91
  const dr = dm[item];
90
- if (dr.emptyTag !== undefined) {
92
+ if (nullMap[item] !== undefined) {
91
93
  emptyTag = tag;
92
94
  }
93
95
  else {
@@ -6,4 +6,5 @@ export declare const proof: {
6
6
  throw: {
7
7
  ambiguousVariantDispatch: () => void;
8
8
  };
9
+ cyclicNullability: () => void;
9
10
  };
@@ -4,6 +4,7 @@ import { commaJoin0Plus, option, range, repeat0Plus, set } from '../module.f.js'
4
4
  import { deterministic } from '../testlib.f.js';
5
5
  import { toData } from '../data/module.f.js';
6
6
  import { dispatchMap, parser, parserRuleSet } from './module.f.js';
7
+ import { assertEq } from '../../asserts/module.f.js';
7
8
  export const proof = {
8
9
  dispatch: [
9
10
  () => {
@@ -238,9 +239,7 @@ export const proof = {
238
239
  const isSuccess = (mr) => mr[1] && mr[2]?.length === 0;
239
240
  const expect = (s, success) => {
240
241
  const mr = m('', toArray(stringToCodePointList(s)));
241
- if (isSuccess(mr) !== success) {
242
- throw mr;
243
- }
242
+ assertEq(isSuccess(mr), success, mr);
244
243
  };
245
244
  expect('a', true);
246
245
  expect('', true);
@@ -259,9 +258,7 @@ export const proof = {
259
258
  const isSuccess = (mr) => mr[1] && mr[2]?.length === 0;
260
259
  const expect = (s, success) => {
261
260
  const mr = m('value', toArray(stringToCodePointList(s)));
262
- if (isSuccess(mr) !== success) {
263
- throw mr;
264
- }
261
+ assertEq(isSuccess(mr), success, mr);
265
262
  };
266
263
  expect('', false);
267
264
  expect('[]', true);
@@ -274,9 +271,7 @@ export const proof = {
274
271
  const isSuccess = (mr) => mr[1] && mr[2]?.length === 0;
275
272
  const expect = (s, success) => {
276
273
  const mr = m('', toArray(stringToCodePointList(s)));
277
- if (isSuccess(mr) !== success) {
278
- throw mr;
279
- }
274
+ assertEq(isSuccess(mr), success, mr);
280
275
  };
281
276
  expect(' true ', true);
282
277
  expect(' tr2ue ', false);
@@ -354,5 +349,27 @@ export const proof = {
354
349
  const conflictRule = { 'a': range('AA'), 'b': range('AA') };
355
350
  dispatchMap(toData(conflictRule)[0]);
356
351
  }
357
- }
352
+ },
353
+ // Regression: `emptyTagMap` must stay correct for cyclic rule references.
354
+ // A naive single-pass, memoized derivation that marks a rule nullable as
355
+ // a placeholder *before* recursing into its own children (to break the
356
+ // cycle) over-approximates nullability here, and made `dispatchMap`
357
+ // falsely report a first/first conflict for this grammar even though it
358
+ // has none — `value` only ever nests inside brackets or is the literal
359
+ // `a`, and `ws` is genuinely optional on both sides of it.
360
+ cyclicNullability: () => {
361
+ const ws = option(' ');
362
+ const value = () => ({ array: ['[', value, ']'], leaf: 'a' });
363
+ const m = parser([ws, value, ws]); // must not throw 'can not merge'
364
+ const expect = (s, success) => {
365
+ const mr = m('', toArray(stringToCodePointList(s)));
366
+ assertEq(mr[1] && mr[2]?.length === 0, success, mr);
367
+ };
368
+ expect('a', true);
369
+ expect(' a ', true);
370
+ expect('[a]', true);
371
+ expect('[[a]]', true);
372
+ expect(' [[a]] ', true);
373
+ expect('b', false);
374
+ },
358
375
  };
@@ -6,6 +6,21 @@ import { type Array2 } from '../types/array/module.f.ts';
6
6
  * For example: 0xBBBBBB_EEEEEE
7
7
  * - 0xBBBBBB is the first symbol (24 bits)
8
8
  * - 0xEEEEEE is the last symbol (24 bits)
9
+ *
10
+ * 24 bits per half, not 26 (the most `float64`'s 52-bit safe-integer mantissa
11
+ * could fit two of): 24 is divisible by 4, so each half is exactly 6 hex
12
+ * digits, and the packed pair reads as a plain `0xYYYYYY_ZZZZZZ` literal with
13
+ * no partial hex digit at either boundary. 26 bits would still be safe to
14
+ * store but wouldn't align to hex nibbles, making the packed literal harder
15
+ * to read and split by eye.
16
+ *
17
+ * Not 16 bits (32 bits total) either, even though a 32-bit pair would fit in
18
+ * a JS bitwise operator's native 32-bit range (JS `|`/`&`/`<<`/etc. operate on
19
+ * 32-bit ints, whereas the 48-bit pair used here, and even a 52-bit one,
20
+ * would need converting to `BigInt` for bitwise operations). 16 bits per
21
+ * symbol can't hold a full Unicode code point: the max scalar value `0x10FFFF`
22
+ * needs 21 bits, well past `0xFFFF`. So the bitwise-op convenience of 16 loses
23
+ * to the requirement of representing every Unicode code point in one half.
9
24
  */
10
25
  export type TerminalRange = number;
11
26
  /**
@@ -16,10 +31,6 @@ export declare const fullRange: TerminalRange;
16
31
  * Unicode scalar value range packed into a single {@link TerminalRange}.
17
32
  */
18
33
  export declare const unicodeRange: TerminalRange;
19
- /**
20
- * Maximal non-Unicode symbol encoded as a string value.
21
- */
22
- export declare const max: string;
23
34
  /**
24
35
  * Maximal Unicode code point encoded as a string value.
25
36
  */
@@ -48,7 +59,10 @@ export declare const rangeEncode: (a: number, b: number) => TerminalRange;
48
59
  */
49
60
  export declare const oneEncode: (a: number) => TerminalRange;
50
61
  /**
51
- * End-of-file marker represented as one code point beyond Unicode range.
62
+ * End-of-file marker: `mask`, the single largest value the 24-bit symbol
63
+ * space can hold (the top of `fullRange`). Deliberately outside Unicode
64
+ * (`unicodeRange` tops out at `0x10FFFF`) so it can never collide with a
65
+ * real code point.
52
66
  */
53
67
  export declare const eof: TerminalRange;
54
68
  /**