functionalscript 0.36.0 → 0.38.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 (523) hide show
  1. package/README.md +1 -1
  2. package/{fs → fjs}/asn.1/module.f.js +1 -1
  3. package/{fs → fjs}/asn.1/proof.f.js +32 -94
  4. package/fjs/asserts/module.f.d.ts +36 -0
  5. package/fjs/asserts/module.f.js +39 -0
  6. package/fjs/asserts/proof.f.d.ts +11 -0
  7. package/fjs/asserts/proof.f.js +18 -0
  8. package/{fs → fjs}/base_n/module.f.js +3 -3
  9. package/{fs → fjs}/base_n/proof.f.js +15 -39
  10. package/{fs → fjs/basen}/base128/module.f.d.ts +1 -1
  11. package/{fs → fjs/basen}/base128/module.f.js +1 -1
  12. package/{fs → fjs/basen}/base128/proof.f.js +3 -3
  13. package/{fs → fjs/basen}/base64/module.f.d.ts +2 -2
  14. package/{fs → fjs/basen}/base64/module.f.js +25 -15
  15. package/{fs → fjs/basen}/base64/proof.f.d.ts +2 -0
  16. package/{fs → fjs/basen}/base64/proof.f.js +26 -6
  17. package/{fs → fjs/basen}/cbase32/module.f.d.ts +2 -2
  18. package/{fs → fjs/basen}/cbase32/module.f.js +2 -2
  19. package/{fs → fjs/basen}/cbase32/proof.f.js +16 -43
  20. package/fjs/bnf/data/module.f.d.ts +52 -0
  21. package/{fs → fjs}/bnf/data/module.f.js +56 -6
  22. package/{fs → fjs}/bnf/data/proof.f.d.ts +1 -0
  23. package/{fs → fjs}/bnf/data/proof.f.js +59 -24
  24. package/{fs → fjs}/bnf/descent/module.f.d.ts +4 -14
  25. package/fjs/bnf/descent/module.f.js +124 -0
  26. package/{fs → fjs}/bnf/descent/proof.f.d.ts +1 -0
  27. package/{fs → fjs}/bnf/descent/proof.f.js +59 -28
  28. package/{fs → fjs}/bnf/ll1/module.f.d.ts +4 -4
  29. package/{fs → fjs}/bnf/ll1/module.f.js +15 -13
  30. package/{fs → fjs}/bnf/ll1/proof.f.d.ts +1 -0
  31. package/{fs → fjs}/bnf/ll1/proof.f.js +33 -16
  32. package/{fs → fjs}/bnf/module.f.d.ts +19 -5
  33. package/{fs → fjs}/bnf/module.f.js +14 -15
  34. package/fjs/bnf/proof.f.js +69 -0
  35. package/{fs → fjs}/bnf/testlib.f.js +2 -2
  36. package/{fs → fjs}/cas/cli/module.f.js +7 -7
  37. package/{fs → fjs}/cas/cli/proof.f.d.ts +4 -1
  38. package/{fs → fjs}/cas/cli/proof.f.js +37 -74
  39. package/fjs/cas/evo/mcp/module.f.d.ts +19 -0
  40. package/fjs/cas/evo/mcp/module.f.js +56 -0
  41. package/fjs/cas/evo/mcp/proof.f.d.ts +9 -0
  42. package/fjs/cas/evo/mcp/proof.f.js +95 -0
  43. package/fjs/cas/evo/module.f.d.ts +138 -0
  44. package/fjs/cas/evo/module.f.js +309 -0
  45. package/fjs/cas/evo/proof.f.d.ts +32 -0
  46. package/fjs/cas/evo/proof.f.js +453 -0
  47. package/fjs/cas/mcp/module.f.d.ts +49 -0
  48. package/fjs/cas/mcp/module.f.js +267 -0
  49. package/{fs → fjs}/cas/mcp/proof.f.d.ts +7 -2
  50. package/{fs → fjs}/cas/mcp/proof.f.js +116 -60
  51. package/{fs → fjs}/cas/module.f.d.ts +10 -0
  52. package/{fs → fjs}/cas/module.f.js +36 -10
  53. package/{fs → fjs}/cas/proof.f.d.ts +8 -2
  54. package/{fs → fjs}/cas/proof.f.js +85 -94
  55. package/{fs → fjs}/ci/bun/module.f.js +2 -2
  56. package/{fs → fjs}/ci/common/module.f.d.ts +2 -2
  57. package/{fs → fjs}/ci/common/module.f.js +4 -4
  58. package/fjs/ci/config/module.f.d.ts +42 -0
  59. package/{fs → fjs}/ci/config/module.f.js +6 -8
  60. package/fjs/ci/deno/module.f.js +20 -0
  61. package/{fs → fjs}/ci/module.f.js +9 -9
  62. package/{fs → fjs}/ci/node/module.f.d.ts +1 -1
  63. package/{fs → fjs}/ci/node/module.f.js +3 -5
  64. package/{fs → fjs}/ci/playwright/module.f.js +3 -3
  65. package/{fs → fjs}/ci/proof.f.js +27 -22
  66. package/{fs → fjs}/ci/rust/module.f.js +11 -3
  67. package/{fs → fjs}/cli/module.f.js +3 -3
  68. package/{fs → fjs}/cli/proof.f.js +25 -66
  69. package/{fs/types → fjs/common}/monoid/module.f.d.ts +1 -1
  70. package/{fs/types → fjs/common}/monoid/proof.f.js +4 -9
  71. package/{fs → fjs}/crypto/hmac/module.f.js +2 -2
  72. package/{fs → fjs}/crypto/hmac/proof.f.js +9 -17
  73. package/{fs → fjs}/crypto/pow/module.f.js +3 -3
  74. package/fjs/crypto/pow/proof.f.js +111 -0
  75. package/{fs → fjs}/crypto/secp/module.f.js +2 -2
  76. package/{fs → fjs}/crypto/secp/proof.f.js +14 -35
  77. package/{fs → fjs}/crypto/sha2/module.f.js +2 -2
  78. package/{fs → fjs}/crypto/sha2/proof.f.js +23 -54
  79. package/{fs → fjs}/crypto/sign/module.f.d.ts +0 -5
  80. package/{fs → fjs}/crypto/sign/module.f.js +11 -8
  81. package/{fs → fjs}/crypto/sign/proof.f.js +36 -105
  82. package/{fs → fjs}/crypto/vdf/module.f.js +1 -1
  83. package/{fs → fjs}/crypto/vdf/proof.f.js +23 -64
  84. package/{fs → fjs}/dev/module.f.js +6 -6
  85. package/{fs → fjs}/dev/package_json/module.f.js +6 -6
  86. package/{fs → fjs}/dev/package_json/proof.f.js +9 -9
  87. package/{fs → fjs}/dev/proof.f.js +3 -5
  88. package/{fs → fjs}/djs/ast/module.f.js +2 -2
  89. package/{fs → fjs}/djs/ast/proof.f.js +8 -16
  90. package/fjs/djs/examples/m.f.d.ts +2 -0
  91. package/{fs → fjs}/djs/module.f.d.ts +1 -1
  92. package/{fs → fjs}/djs/module.f.js +5 -5
  93. package/{fs → fjs}/djs/parser/module.f.d.ts +5 -0
  94. package/{fs → fjs}/djs/parser/module.f.js +24 -4
  95. package/{fs → fjs}/djs/parser/proof.f.js +145 -407
  96. package/{fs → fjs}/djs/proof.f.js +16 -39
  97. package/{fs → fjs}/djs/serializer/module.f.js +6 -6
  98. package/{fs → fjs}/djs/serializer/proof.f.js +18 -43
  99. package/fjs/djs/tokenizer/module.f.d.ts +24 -0
  100. package/fjs/djs/tokenizer/module.f.js +472 -0
  101. package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.d.ts +4 -3
  102. package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.js +447 -446
  103. package/{fs → fjs}/djs/transpiler/module.f.d.ts +5 -0
  104. package/{fs → fjs}/djs/transpiler/module.f.js +21 -11
  105. package/{fs → fjs}/djs/transpiler/proof.f.d.ts +3 -0
  106. package/fjs/djs/transpiler/proof.f.js +67 -0
  107. package/{fs → fjs}/effects/memory/module.f.js +4 -4
  108. package/{fs → fjs}/effects/memory/proof.f.js +11 -24
  109. package/{fs → fjs}/effects/module.f.js +1 -1
  110. package/{fs → fjs}/effects/node/memory/module.js +2 -2
  111. package/{fs → fjs}/effects/node/memory/proof.js +8 -15
  112. package/{fs → fjs}/effects/node/module.d.ts +1 -1
  113. package/{fs → fjs}/effects/node/module.f.d.ts +1 -1
  114. package/{fs → fjs}/effects/node/module.f.js +7 -7
  115. package/{fs → fjs}/effects/node/module.js +13 -13
  116. package/{fs → fjs}/effects/node/proof.f.d.ts +1 -0
  117. package/{fs → fjs}/effects/node/proof.f.js +106 -292
  118. package/{fs → fjs}/effects/node/virtual/module.f.js +7 -7
  119. package/{fs → fjs}/effects/node/virtual/proof.f.d.ts +2 -0
  120. package/{fs → fjs}/effects/node/virtual/proof.f.js +44 -30
  121. package/{fs → fjs}/effects/proof.f.js +18 -47
  122. package/fjs/emergent_testing/all.test.js +4 -0
  123. package/{fs → fjs}/emergent_testing/example.f.d.ts +1 -1
  124. package/{fs → fjs}/emergent_testing/module.f.js +6 -6
  125. package/{fs → fjs}/emergent_testing/proof.f.d.ts +19 -17
  126. package/{fs → fjs}/emergent_testing/proof.f.js +14 -14
  127. package/fjs/emergent_testing/scenarios/all.js +1 -0
  128. package/{fs → fjs}/fsc/bnf.f.js +2 -2
  129. package/{fs → fjs}/fsc/json.f.js +1 -1
  130. package/{fs → fjs}/fsc/module.f.js +7 -7
  131. package/{fs → fjs}/fsc/proof.f.js +16 -38
  132. package/{fs → fjs}/fsm/module.f.js +9 -9
  133. package/{fs → fjs}/fsm/proof.f.js +12 -19
  134. package/{fs → fjs}/js/tokenizer/module.f.js +7 -7
  135. package/{fs → fjs}/js/tokenizer/proof.f.js +5 -5
  136. package/{fs → fjs}/mcp/module.f.d.ts +20 -13
  137. package/{fs → fjs}/mcp/module.f.js +16 -9
  138. package/{fs → fjs}/mcp/proof.f.js +17 -17
  139. package/{fs → fjs}/mcp/stdio/module.f.d.ts +4 -4
  140. package/{fs → fjs}/mcp/stdio/module.f.js +12 -12
  141. package/{fs → fjs}/mcp/stdio/proof.f.js +10 -10
  142. package/{fs → fjs/media}/html/module.f.d.ts +3 -3
  143. package/{fs → fjs/media}/html/module.f.js +9 -9
  144. package/{fs → fjs/media}/html/proof.f.js +12 -33
  145. package/fjs/media/json/module.f.d.ts +50 -0
  146. package/{fs → fjs/media}/json/module.f.js +7 -7
  147. package/{fs → fjs/media}/json/parser/module.f.d.ts +7 -2
  148. package/{fs → fjs/media}/json/parser/module.f.js +21 -7
  149. package/{fs → fjs/media}/json/parser/proof.f.js +45 -120
  150. package/{fs → fjs/media}/json/proof.f.js +4 -4
  151. package/fjs/media/json/rpc/module.f.d.ts +114 -0
  152. package/{fs → fjs/media}/json/rpc/module.f.js +4 -4
  153. package/{fs → fjs/media}/json/rpc/proof.f.js +4 -4
  154. package/fjs/media/json/schema/module.f.d.ts +78 -0
  155. package/{fs → fjs/media}/json/schema/module.f.js +25 -41
  156. package/{fs → fjs/media}/json/schema/proof.f.js +6 -9
  157. package/{fs → fjs/media}/json/serializer/module.f.d.ts +1 -1
  158. package/{fs → fjs/media}/json/serializer/module.f.js +2 -2
  159. package/{fs → fjs/media}/json/serializer/proof.f.js +12 -29
  160. package/{fs → fjs/media}/json/tokenizer/module.f.d.ts +2 -2
  161. package/{fs → fjs/media}/json/tokenizer/module.f.js +4 -4
  162. package/{fs → fjs/media}/json/tokenizer/proof.f.js +5 -5
  163. package/fjs/media/module.f.d.ts +37 -0
  164. package/fjs/media/module.f.js +23 -0
  165. package/fjs/media/proof.f.d.ts +9 -0
  166. package/fjs/media/proof.f.js +58 -0
  167. package/fjs/media/revision/module.f.d.ts +78 -0
  168. package/fjs/media/revision/module.f.js +122 -0
  169. package/fjs/media/revision/proof.f.d.ts +31 -0
  170. package/fjs/media/revision/proof.f.js +140 -0
  171. package/{fs/mime → fjs/media/type}/module.f.d.ts +6 -6
  172. package/{fs/mime → fjs/media/type}/module.f.js +6 -6
  173. package/{fs/mime → fjs/media/type}/proof.f.js +8 -12
  174. package/fjs/module.f.d.ts +2 -0
  175. package/{fs/fjs → fjs}/module.f.js +9 -9
  176. package/fjs/module.js +4 -0
  177. package/{fs → fjs}/path/module.f.js +2 -2
  178. package/{fs → fjs}/path/proof.f.js +27 -78
  179. package/{fs/fjs → fjs}/proof.f.js +6 -4
  180. package/{fs → fjs}/sul/id/module.f.js +9 -9
  181. package/{fs → fjs}/sul/id/proof.f.js +12 -26
  182. package/{fs → fjs}/sul/level/hash/module.f.js +3 -3
  183. package/{fs → fjs}/sul/level/hash/proof.f.js +8 -8
  184. package/{fs → fjs}/sul/level/literal/module.f.js +5 -5
  185. package/{fs → fjs}/sul/level/literal/proof.f.js +15 -29
  186. package/{fs → fjs}/sul/module.f.js +3 -3
  187. package/{fs → fjs}/sul/proof.f.js +3 -3
  188. package/fjs/text/ascii/proof.f.d.ts +6 -0
  189. package/fjs/text/ascii/proof.f.js +14 -0
  190. package/{fs → fjs}/text/code_point/module.f.js +12 -12
  191. package/{fs → fjs}/text/code_point/proof.f.js +1 -1
  192. package/{fs → fjs}/text/module.f.js +5 -5
  193. package/{fs → fjs}/text/proof.f.js +7 -12
  194. package/{fs → fjs}/text/sgr/module.f.js +2 -2
  195. package/{fs → fjs}/text/sgr/proof.f.js +8 -17
  196. package/{fs → fjs}/text/utf16/module.f.js +6 -6
  197. package/{fs → fjs}/text/utf16/proof.f.js +27 -70
  198. package/{fs → fjs}/text/utf8/module.f.js +22 -17
  199. package/{fs → fjs}/text/utf8/proof.f.js +59 -128
  200. package/{fs → fjs}/types/array/module.f.js +1 -1
  201. package/{fs → fjs}/types/array/proof.f.js +21 -55
  202. package/{fs → fjs}/types/bigfloat/module.f.js +1 -1
  203. package/fjs/types/bigfloat/proof.f.js +217 -0
  204. package/{fs → fjs}/types/bigint/module.f.js +2 -2
  205. package/{fs → fjs}/types/bigint/proof.f.js +51 -147
  206. package/{fs → fjs}/types/bit_vec/module.f.js +8 -8
  207. package/{fs → fjs}/types/bit_vec/proof.f.js +76 -218
  208. package/{fs → fjs}/types/btree/find/module.f.js +1 -1
  209. package/fjs/types/btree/find/proof.f.d.ts +3 -0
  210. package/fjs/types/btree/find/proof.f.js +108 -0
  211. package/{fs → fjs}/types/btree/module.f.js +2 -2
  212. package/fjs/types/btree/proof.f.d.ts +13 -0
  213. package/{fs → fjs}/types/btree/proof.f.js +12 -19
  214. package/{fs → fjs}/types/btree/remove/module.f.js +4 -4
  215. package/fjs/types/btree/remove/proof.f.d.ts +9 -0
  216. package/{fs → fjs}/types/btree/remove/proof.f.js +88 -235
  217. package/{fs → fjs}/types/btree/set/module.f.js +8 -5
  218. package/{fs → fjs}/types/btree/set/proof.f.js +39 -28
  219. package/{fs → fjs}/types/byte_set/module.f.js +2 -2
  220. package/fjs/types/byte_set/proof.f.js +79 -0
  221. package/{fs → fjs}/types/function/compare/proof.f.js +14 -37
  222. package/fjs/types/function/operator/proof.f.d.ts +23 -0
  223. package/{fs → fjs}/types/function/operator/proof.f.js +18 -49
  224. package/{fs → fjs}/types/function/proof.f.js +3 -4
  225. package/{fs → fjs}/types/list/module.f.js +2 -2
  226. package/fjs/types/list/proof.f.d.ts +30 -0
  227. package/{fs → fjs}/types/list/proof.f.js +59 -167
  228. package/{fs → fjs}/types/map/proof.f.js +6 -14
  229. package/fjs/types/nibble_set/proof.f.js +60 -0
  230. package/{fs → fjs}/types/nominal/proof.f.js +5 -10
  231. package/{fs → fjs}/types/nullable/module.f.js +2 -2
  232. package/fjs/types/nullable/proof.f.js +29 -0
  233. package/{fs → fjs}/types/number/module.f.js +5 -5
  234. package/{fs → fjs}/types/number/proof.f.js +10 -25
  235. package/{fs → fjs}/types/object/module.f.js +4 -4
  236. package/{fs → fjs}/types/object/proof.f.js +4 -7
  237. package/{fs → fjs}/types/ordered_map/module.f.js +6 -6
  238. package/{fs → fjs}/types/ordered_map/proof.f.js +3 -3
  239. package/fjs/types/patricia_trie/proof.f.d.ts +13 -0
  240. package/{fs → fjs}/types/patricia_trie/proof.f.js +22 -22
  241. package/{fs → fjs}/types/prime_field/module.f.js +3 -8
  242. package/{fs → fjs}/types/prime_field/proof.f.js +2 -2
  243. package/{fs → fjs}/types/range/module.f.d.ts +1 -1
  244. package/fjs/types/range/module.f.js +2 -0
  245. package/fjs/types/range/proof.f.js +9 -0
  246. package/{fs → fjs}/types/range_map/module.f.js +4 -4
  247. package/{fs → fjs}/types/range_map/proof.f.js +35 -88
  248. package/{fs → fjs}/types/result/module.js +1 -1
  249. package/fjs/types/result/proof.f.d.ts +12 -0
  250. package/fjs/types/result/proof.f.js +31 -0
  251. package/{fs → fjs}/types/rtti/common/module.f.d.ts +36 -1
  252. package/{fs → fjs}/types/rtti/common/module.f.js +48 -4
  253. package/fjs/types/rtti/common/proof.f.d.ts +8 -0
  254. package/fjs/types/rtti/common/proof.f.js +51 -0
  255. package/{fs → fjs}/types/rtti/module.f.d.ts +2 -2
  256. package/{fs → fjs}/types/rtti/module.f.js +1 -1
  257. package/{fs → fjs}/types/rtti/parse/module.f.js +16 -25
  258. package/{fs → fjs}/types/rtti/parse/proof.f.js +9 -20
  259. package/{fs → fjs}/types/rtti/ts/module.f.d.ts +10 -4
  260. package/{fs → fjs}/types/rtti/ts/module.f.js +1 -1
  261. package/{fs → fjs}/types/rtti/ts/proof.f.js +2 -2
  262. package/{fs → fjs}/types/rtti/validate/module.f.js +11 -32
  263. package/{fs → fjs}/types/rtti/validate/proof.f.js +6 -11
  264. package/{fs → fjs}/types/sorted_list/module.f.js +3 -3
  265. package/{fs → fjs}/types/sorted_list/proof.f.js +14 -27
  266. package/{fs → fjs}/types/sorted_set/module.f.js +1 -1
  267. package/{fs → fjs}/types/sorted_set/proof.f.js +20 -45
  268. package/{fs → fjs}/types/string/module.f.js +4 -4
  269. package/fjs/types/string/proof.f.js +77 -0
  270. package/{fs → fjs}/types/string_set/module.f.js +6 -6
  271. package/fjs/types/string_set/proof.f.js +43 -0
  272. package/{fs → fjs}/types/ts/proof.f.d.ts +18 -18
  273. package/{fs → fjs}/types/ts/proof.f.js +16 -43
  274. package/{fs → fjs}/types/uint8array/module.f.js +10 -10
  275. package/{fs → fjs}/types/uint8array/proof.f.d.ts +4 -1
  276. package/{fs → fjs}/types/uint8array/proof.f.js +11 -11
  277. package/{fs → fjs}/website/module.f.js +3 -3
  278. package/fjs/website/proof.f.js +13 -0
  279. package/package.json +8 -8
  280. package/fs/asserts/module.f.d.ts +0 -4
  281. package/fs/asserts/module.f.js +0 -9
  282. package/fs/asserts/proof.f.d.ts +0 -8
  283. package/fs/asserts/proof.f.js +0 -51
  284. package/fs/bnf/data/module.f.d.ts +0 -30
  285. package/fs/bnf/descent/module.f.js +0 -119
  286. package/fs/bnf/proof.f.js +0 -104
  287. package/fs/cas/mcp/module.f.d.ts +0 -36
  288. package/fs/cas/mcp/module.f.js +0 -249
  289. package/fs/ci/config/module.f.d.ts +0 -43
  290. package/fs/ci/deno/module.f.js +0 -16
  291. package/fs/crypto/pow/proof.f.js +0 -161
  292. package/fs/djs/examples/m.f.d.ts +0 -2
  293. package/fs/djs/tokenizer/module.f.d.ts +0 -12
  294. package/fs/djs/tokenizer/module.f.js +0 -62
  295. package/fs/djs/tokenizer/proof.f.d.ts +0 -7
  296. package/fs/djs/tokenizer/proof.f.js +0 -543
  297. package/fs/djs/tokenizer-new/module.f.d.ts +0 -3
  298. package/fs/djs/tokenizer-new/module.f.js +0 -155
  299. package/fs/djs/transpiler/proof.f.js +0 -68
  300. package/fs/emergent_testing/all.test.js +0 -4
  301. package/fs/emergent_testing/scenarios/all.js +0 -1
  302. package/fs/fjs/module.f.d.ts +0 -2
  303. package/fs/fjs/module.js +0 -4
  304. package/fs/json/module.f.d.ts +0 -50
  305. package/fs/json/rpc/module.f.d.ts +0 -114
  306. package/fs/json/schema/module.f.d.ts +0 -77
  307. package/fs/text/ascii/proof.f.d.ts +0 -4
  308. package/fs/text/ascii/proof.f.js +0 -24
  309. package/fs/types/bigfloat/proof.f.js +0 -348
  310. package/fs/types/btree/find/proof.f.js +0 -151
  311. package/fs/types/btree/proof.f.d.ts +0 -7
  312. package/fs/types/btree/remove/proof.f.d.ts +0 -4
  313. package/fs/types/byte_set/proof.f.js +0 -120
  314. package/fs/types/function/operator/proof.f.d.ts +0 -12
  315. package/fs/types/list/proof.f.d.ts +0 -22
  316. package/fs/types/nibble_set/proof.f.js +0 -89
  317. package/fs/types/nullable/proof.f.js +0 -50
  318. package/fs/types/patricia_trie/proof.f.d.ts +0 -7
  319. package/fs/types/range/module.f.js +0 -2
  320. package/fs/types/range/proof.f.d.ts +0 -1
  321. package/fs/types/range/proof.f.js +0 -18
  322. package/fs/types/result/proof.f.d.ts +0 -6
  323. package/fs/types/result/proof.f.js +0 -52
  324. package/fs/types/string/proof.f.js +0 -118
  325. package/fs/types/string_set/proof.f.js +0 -82
  326. package/fs/website/proof.f.js +0 -16
  327. /package/{fs → fjs}/asn.1/module.f.d.ts +0 -0
  328. /package/{fs → fjs}/asn.1/proof.f.d.ts +0 -0
  329. /package/{fs → fjs}/base_n/module.f.d.ts +0 -0
  330. /package/{fs → fjs}/base_n/proof.f.d.ts +0 -0
  331. /package/{fs → fjs/basen}/base128/proof.f.d.ts +0 -0
  332. /package/{fs → fjs/basen}/cbase32/proof.f.d.ts +0 -0
  333. /package/{fs → fjs}/bnf/proof.f.d.ts +0 -0
  334. /package/{fs → fjs}/bnf/testlib.f.d.ts +0 -0
  335. /package/{fs → fjs}/cas/cli/module.f.d.ts +0 -0
  336. /package/{fs → fjs}/ci/bun/module.f.d.ts +0 -0
  337. /package/{fs → fjs}/ci/deno/module.f.d.ts +0 -0
  338. /package/{fs → fjs}/ci/module.f.d.ts +0 -0
  339. /package/{fs → fjs}/ci/playwright/module.f.d.ts +0 -0
  340. /package/{fs → fjs}/ci/proof.f.d.ts +0 -0
  341. /package/{fs → fjs}/ci/rust/module.f.d.ts +0 -0
  342. /package/{fs → fjs}/cli/module.f.d.ts +0 -0
  343. /package/{fs → fjs}/cli/proof.f.d.ts +0 -0
  344. /package/{fs/types → fjs/common}/monoid/module.f.js +0 -0
  345. /package/{fs/types → fjs/common}/monoid/proof.f.d.ts +0 -0
  346. /package/{fs → fjs}/crypto/hmac/module.f.d.ts +0 -0
  347. /package/{fs → fjs}/crypto/hmac/proof.f.d.ts +0 -0
  348. /package/{fs → fjs}/crypto/pow/module.f.d.ts +0 -0
  349. /package/{fs → fjs}/crypto/pow/proof.f.d.ts +0 -0
  350. /package/{fs → fjs}/crypto/secp/module.f.d.ts +0 -0
  351. /package/{fs → fjs}/crypto/secp/proof.f.d.ts +0 -0
  352. /package/{fs → fjs}/crypto/sha2/module.f.d.ts +0 -0
  353. /package/{fs → fjs}/crypto/sha2/proof.f.d.ts +0 -0
  354. /package/{fs → fjs}/crypto/sign/proof.f.d.ts +0 -0
  355. /package/{fs → fjs}/crypto/vdf/module.f.d.ts +0 -0
  356. /package/{fs → fjs}/crypto/vdf/proof.f.d.ts +0 -0
  357. /package/{fs → fjs}/dev/module.f.d.ts +0 -0
  358. /package/{fs → fjs}/dev/package_json/module.f.d.ts +0 -0
  359. /package/{fs → fjs}/dev/package_json/proof.f.d.ts +0 -0
  360. /package/{fs → fjs}/dev/proof.f.d.ts +0 -0
  361. /package/{fs → fjs}/djs/ast/module.f.d.ts +0 -0
  362. /package/{fs → fjs}/djs/ast/proof.f.d.ts +0 -0
  363. /package/{fs → fjs}/djs/examples/input.f.d.ts +0 -0
  364. /package/{fs → fjs}/djs/examples/input.f.js +0 -0
  365. /package/{fs → fjs}/djs/examples/m.f.js +0 -0
  366. /package/{fs → fjs}/djs/parser/proof.f.d.ts +0 -0
  367. /package/{fs → fjs}/djs/proof.f.d.ts +0 -0
  368. /package/{fs → fjs}/djs/serializer/module.f.d.ts +0 -0
  369. /package/{fs → fjs}/djs/serializer/proof.f.d.ts +0 -0
  370. /package/{fs → fjs}/effects/list/module.f.d.ts +0 -0
  371. /package/{fs → fjs}/effects/list/module.f.js +0 -0
  372. /package/{fs → fjs}/effects/memory/module.f.d.ts +0 -0
  373. /package/{fs → fjs}/effects/memory/proof.f.d.ts +0 -0
  374. /package/{fs → fjs}/effects/mock/module.f.d.ts +0 -0
  375. /package/{fs → fjs}/effects/mock/module.f.js +0 -0
  376. /package/{fs → fjs}/effects/module.d.ts +0 -0
  377. /package/{fs → fjs}/effects/module.f.d.ts +0 -0
  378. /package/{fs → fjs}/effects/module.js +0 -0
  379. /package/{fs → fjs}/effects/node/memory/module.d.ts +0 -0
  380. /package/{fs → fjs}/effects/node/memory/proof.d.ts +0 -0
  381. /package/{fs → fjs}/effects/node/virtual/module.f.d.ts +0 -0
  382. /package/{fs → fjs}/effects/proof.f.d.ts +0 -0
  383. /package/{fs → fjs}/emergent_testing/all.test.d.ts +0 -0
  384. /package/{fs → fjs}/emergent_testing/example.f.js +0 -0
  385. /package/{fs → fjs}/emergent_testing/module.f.d.ts +0 -0
  386. /package/{fs → fjs}/emergent_testing/scenarios/all.d.ts +0 -0
  387. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -0
  388. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.js +0 -0
  389. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -0
  390. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.js +0 -0
  391. /package/{fs → fjs}/emergent_testing/scenarios/async.fail.d.ts +0 -0
  392. /package/{fs → fjs}/emergent_testing/scenarios/async.fail.js +0 -0
  393. /package/{fs → fjs}/emergent_testing/scenarios/async.pass.d.ts +0 -0
  394. /package/{fs → fjs}/emergent_testing/scenarios/async.pass.js +0 -0
  395. /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.d.ts +0 -0
  396. /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.js +0 -0
  397. /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.d.ts +0 -0
  398. /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.js +0 -0
  399. /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.d.ts +0 -0
  400. /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.js +0 -0
  401. /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.d.ts +0 -0
  402. /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.js +0 -0
  403. /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.d.ts +0 -0
  404. /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.js +0 -0
  405. /package/{fs → fjs}/fsc/bnf.f.d.ts +0 -0
  406. /package/{fs → fjs}/fsc/json.f.d.ts +0 -0
  407. /package/{fs → fjs}/fsc/module.f.d.ts +0 -0
  408. /package/{fs → fjs}/fsc/proof.f.d.ts +0 -0
  409. /package/{fs → fjs}/fsm/module.f.d.ts +0 -0
  410. /package/{fs → fjs}/fsm/proof.f.d.ts +0 -0
  411. /package/{fs → fjs}/js/tokenizer/module.f.d.ts +0 -0
  412. /package/{fs → fjs}/js/tokenizer/proof.f.d.ts +0 -0
  413. /package/{fs → fjs}/mcp/proof.f.d.ts +0 -0
  414. /package/{fs → fjs}/mcp/stdio/proof.f.d.ts +0 -0
  415. /package/{fs → fjs/media}/html/proof.f.d.ts +0 -0
  416. /package/{fs → fjs/media}/json/parser/proof.f.d.ts +0 -0
  417. /package/{fs → fjs/media}/json/proof.f.d.ts +0 -0
  418. /package/{fs → fjs/media}/json/rpc/proof.f.d.ts +0 -0
  419. /package/{fs → fjs/media}/json/schema/proof.f.d.ts +0 -0
  420. /package/{fs → fjs/media}/json/serializer/proof.f.d.ts +0 -0
  421. /package/{fs → fjs/media}/json/tokenizer/proof.f.d.ts +0 -0
  422. /package/{fs/mime → fjs/media/type}/proof.f.d.ts +0 -0
  423. /package/{fs/fjs → fjs}/module.d.ts +0 -0
  424. /package/{fs → fjs}/path/module.f.d.ts +0 -0
  425. /package/{fs → fjs}/path/proof.f.d.ts +0 -0
  426. /package/{fs/fjs → fjs}/proof.f.d.ts +0 -0
  427. /package/{fs → fjs}/sul/id/module.f.d.ts +0 -0
  428. /package/{fs → fjs}/sul/id/proof.f.d.ts +0 -0
  429. /package/{fs → fjs}/sul/level/hash/module.f.d.ts +0 -0
  430. /package/{fs → fjs}/sul/level/hash/proof.f.d.ts +0 -0
  431. /package/{fs → fjs}/sul/level/literal/module.f.d.ts +0 -0
  432. /package/{fs → fjs}/sul/level/literal/proof.f.d.ts +0 -0
  433. /package/{fs → fjs}/sul/module.f.d.ts +0 -0
  434. /package/{fs → fjs}/sul/proof.f.d.ts +0 -0
  435. /package/{fs → fjs}/text/ascii/module.f.d.ts +0 -0
  436. /package/{fs → fjs}/text/ascii/module.f.js +0 -0
  437. /package/{fs → fjs}/text/code_point/module.f.d.ts +0 -0
  438. /package/{fs → fjs}/text/code_point/proof.f.d.ts +0 -0
  439. /package/{fs → fjs}/text/module.f.d.ts +0 -0
  440. /package/{fs → fjs}/text/proof.f.d.ts +0 -0
  441. /package/{fs → fjs}/text/sgr/module.f.d.ts +0 -0
  442. /package/{fs → fjs}/text/sgr/proof.f.d.ts +0 -0
  443. /package/{fs → fjs}/text/utf16/module.f.d.ts +0 -0
  444. /package/{fs → fjs}/text/utf16/proof.f.d.ts +0 -0
  445. /package/{fs → fjs}/text/utf8/module.f.d.ts +0 -0
  446. /package/{fs → fjs}/text/utf8/proof.f.d.ts +0 -0
  447. /package/{fs → fjs}/types/array/module.f.d.ts +0 -0
  448. /package/{fs → fjs}/types/array/proof.f.d.ts +0 -0
  449. /package/{fs → fjs}/types/bigfloat/module.f.d.ts +0 -0
  450. /package/{fs → fjs}/types/bigfloat/proof.f.d.ts +0 -0
  451. /package/{fs → fjs}/types/bigint/module.f.d.ts +0 -0
  452. /package/{fs → fjs}/types/bigint/proof.f.d.ts +0 -0
  453. /package/{fs → fjs}/types/bit_vec/module.f.d.ts +0 -0
  454. /package/{fs → fjs}/types/bit_vec/proof.f.d.ts +0 -0
  455. /package/{fs → fjs}/types/btree/find/module.f.d.ts +0 -0
  456. /package/{fs → fjs}/types/btree/module.f.d.ts +0 -0
  457. /package/{fs → fjs}/types/btree/remove/module.f.d.ts +0 -0
  458. /package/{fs → fjs}/types/btree/set/module.f.d.ts +0 -0
  459. /package/{fs → fjs}/types/btree/set/proof.f.d.ts +0 -0
  460. /package/{fs → fjs}/types/btree/types/module.f.d.ts +0 -0
  461. /package/{fs → fjs}/types/btree/types/module.f.js +0 -0
  462. /package/{fs → fjs}/types/byte_set/module.f.d.ts +0 -0
  463. /package/{fs → fjs}/types/byte_set/proof.f.d.ts +0 -0
  464. /package/{fs → fjs}/types/function/compare/module.f.d.ts +0 -0
  465. /package/{fs → fjs}/types/function/compare/module.f.js +0 -0
  466. /package/{fs/types/btree/find → fjs/types/function/compare}/proof.f.d.ts +0 -0
  467. /package/{fs → fjs}/types/function/module.f.d.ts +0 -0
  468. /package/{fs → fjs}/types/function/module.f.js +0 -0
  469. /package/{fs → fjs}/types/function/operator/module.f.d.ts +0 -0
  470. /package/{fs → fjs}/types/function/operator/module.f.js +0 -0
  471. /package/{fs/types/function/compare → fjs/types/function}/proof.f.d.ts +0 -0
  472. /package/{fs → fjs}/types/list/module.f.d.ts +0 -0
  473. /package/{fs → fjs}/types/map/module.f.d.ts +0 -0
  474. /package/{fs → fjs}/types/map/module.f.js +0 -0
  475. /package/{fs → fjs}/types/map/proof.f.d.ts +0 -0
  476. /package/{fs → fjs}/types/nibble_set/module.f.d.ts +0 -0
  477. /package/{fs → fjs}/types/nibble_set/module.f.js +0 -0
  478. /package/{fs → fjs}/types/nibble_set/proof.f.d.ts +0 -0
  479. /package/{fs → fjs}/types/nominal/module.f.d.ts +0 -0
  480. /package/{fs → fjs}/types/nominal/module.f.js +0 -0
  481. /package/{fs → fjs}/types/nominal/proof.f.d.ts +0 -0
  482. /package/{fs → fjs}/types/nullable/module.f.d.ts +0 -0
  483. /package/{fs → fjs}/types/nullable/proof.f.d.ts +0 -0
  484. /package/{fs → fjs}/types/number/module.f.d.ts +0 -0
  485. /package/{fs → fjs}/types/number/proof.f.d.ts +0 -0
  486. /package/{fs → fjs}/types/object/module.f.d.ts +0 -0
  487. /package/{fs → fjs}/types/object/proof.f.d.ts +0 -0
  488. /package/{fs → fjs}/types/option/module.f.d.ts +0 -0
  489. /package/{fs → fjs}/types/option/module.f.js +0 -0
  490. /package/{fs → fjs}/types/ordered_map/module.f.d.ts +0 -0
  491. /package/{fs → fjs}/types/ordered_map/proof.f.d.ts +0 -0
  492. /package/{fs → fjs}/types/patricia_trie/module.f.d.ts +0 -0
  493. /package/{fs → fjs}/types/patricia_trie/module.f.js +0 -0
  494. /package/{fs → fjs}/types/phantom/module.f.d.ts +0 -0
  495. /package/{fs → fjs}/types/phantom/module.f.js +0 -0
  496. /package/{fs → fjs}/types/prime_field/module.f.d.ts +0 -0
  497. /package/{fs → fjs}/types/prime_field/proof.f.d.ts +0 -0
  498. /package/{fs/types/function → fjs/types/range}/proof.f.d.ts +0 -0
  499. /package/{fs → fjs}/types/range_map/module.f.d.ts +0 -0
  500. /package/{fs → fjs}/types/range_map/proof.f.d.ts +0 -0
  501. /package/{fs → fjs}/types/result/module.d.ts +0 -0
  502. /package/{fs → fjs}/types/result/module.f.d.ts +0 -0
  503. /package/{fs → fjs}/types/result/module.f.js +0 -0
  504. /package/{fs → fjs}/types/rtti/parse/module.f.d.ts +0 -0
  505. /package/{fs → fjs}/types/rtti/parse/proof.f.d.ts +0 -0
  506. /package/{fs → fjs}/types/rtti/proof.f.d.ts +0 -0
  507. /package/{fs → fjs}/types/rtti/proof.f.js +0 -0
  508. /package/{fs → fjs}/types/rtti/ts/proof.f.d.ts +0 -0
  509. /package/{fs → fjs}/types/rtti/validate/module.f.d.ts +0 -0
  510. /package/{fs → fjs}/types/rtti/validate/proof.f.d.ts +0 -0
  511. /package/{fs → fjs}/types/sorted_list/module.f.d.ts +0 -0
  512. /package/{fs → fjs}/types/sorted_list/proof.f.d.ts +0 -0
  513. /package/{fs → fjs}/types/sorted_set/module.f.d.ts +0 -0
  514. /package/{fs → fjs}/types/sorted_set/proof.f.d.ts +0 -0
  515. /package/{fs → fjs}/types/string/module.f.d.ts +0 -0
  516. /package/{fs → fjs}/types/string/proof.f.d.ts +0 -0
  517. /package/{fs → fjs}/types/string_set/module.f.d.ts +0 -0
  518. /package/{fs → fjs}/types/string_set/proof.f.d.ts +0 -0
  519. /package/{fs → fjs}/types/ts/module.f.d.ts +0 -0
  520. /package/{fs → fjs}/types/ts/module.f.js +0 -0
  521. /package/{fs → fjs}/types/uint8array/module.f.d.ts +0 -0
  522. /package/{fs → fjs}/website/module.f.d.ts +0 -0
  523. /package/{fs → fjs}/website/proof.f.d.ts +0 -0
@@ -1,26 +1,19 @@
1
- import { empty, vec } from "../types/bit_vec/module.f.js";
1
+ import { empty, vec } from "../../types/bit_vec/module.f.js";
2
2
  import { cBase32ToVec, cBase32ToVec5x, vec5xToCBase32, vecToCBase32 } from "./module.f.js";
3
+ import { assertEq } from '../../asserts/module.f.js';
3
4
  const check5x = (s, v) => {
4
5
  const sr = vec5xToCBase32(v);
5
- if (sr !== s) {
6
- throw [sr, s];
7
- }
6
+ assertEq(sr, s, [sr, s]);
8
7
  const vr = cBase32ToVec5x(s);
9
- if (vr !== v) {
10
- throw [vr, v];
11
- }
8
+ assertEq(vr, v, [vr, v]);
12
9
  //
13
10
  check(`${s}g`, v);
14
11
  };
15
12
  const check = (s, v) => {
16
13
  const sr = vecToCBase32(v);
17
- if (sr !== s) {
18
- throw [sr, s];
19
- }
14
+ assertEq(sr, s, [sr, s]);
20
15
  const vr = cBase32ToVec(s);
21
- if (vr !== v) {
22
- throw [vr, v];
23
- }
16
+ assertEq(vr, v, [vr, v]);
24
17
  };
25
18
  export const proof = {
26
19
  roundtrip5x: () => {
@@ -50,40 +43,20 @@ export const proof = {
50
43
  unalignedBits: () => {
51
44
  const v = vec(1n)(1n);
52
45
  const cr = vec5xToCBase32(v);
53
- if (cr !== "g") {
54
- throw ['g', cr];
55
- }
46
+ assertEq(cr, "g", ['g', cr]);
56
47
  },
57
48
  caseInsensitive: () => {
58
- if (cBase32ToVec5x("A") !== cBase32ToVec5x("a")) {
59
- throw 'case-insensitive expected';
60
- }
61
- if (cBase32ToVec5x("I") !== cBase32ToVec5x("1")) {
62
- throw 'i maps to 1';
63
- }
64
- if (cBase32ToVec5x("l") !== cBase32ToVec5x("1")) {
65
- throw 'l maps to 1';
66
- }
67
- if (cBase32ToVec5x("o") !== cBase32ToVec5x("0")) {
68
- throw 'o maps to 0';
69
- }
70
- if (cBase32ToVec5x("u") !== null) {
71
- throw 'should error on invalid character';
72
- }
49
+ assertEq(cBase32ToVec5x("A"), cBase32ToVec5x("a"), 'case-insensitive expected');
50
+ assertEq(cBase32ToVec5x("I"), cBase32ToVec5x("1"), 'i maps to 1');
51
+ assertEq(cBase32ToVec5x("l"), cBase32ToVec5x("1"), 'l maps to 1');
52
+ assertEq(cBase32ToVec5x("o"), cBase32ToVec5x("0"), 'o maps to 0');
53
+ assertEq(cBase32ToVec5x("u"), null, 'should error on invalid character');
73
54
  },
74
55
  unterminated: () => {
75
56
  // No sentinel `1` bit → invalid; must return null, not loop forever.
76
- if (cBase32ToVec("") !== null) {
77
- throw 'empty must be null';
78
- }
79
- if (cBase32ToVec("0") !== null) {
80
- throw 'single zero symbol must be null';
81
- }
82
- if (cBase32ToVec("00") !== null) {
83
- throw 'all-zero symbols must be null';
84
- }
85
- if (cBase32ToVec("o") !== null) {
86
- throw 'o (maps to 0) must be null';
87
- }
57
+ assertEq(cBase32ToVec(""), null, 'empty must be null');
58
+ assertEq(cBase32ToVec("0"), null, 'single zero symbol must be null');
59
+ assertEq(cBase32ToVec("00"), null, 'all-zero symbols must be null');
60
+ assertEq(cBase32ToVec("o"), null, 'o (maps to 0) must be null');
88
61
  }
89
62
  };
@@ -0,0 +1,52 @@
1
+ import { type Rule as FRule } from '../module.f.ts';
2
+ import { type StringMap } from '../../types/object/module.f.ts';
3
+ /**
4
+ * Encoded terminal range value used by BNF data rules.
5
+ *
6
+ * The same as the functional TerminalRange.
7
+ */
8
+ export type TerminalRange = number;
9
+ /**
10
+ * Ordered list of grammar rule names.
11
+ */
12
+ export type Sequence = readonly string[];
13
+ /** A variant of rule names. */
14
+ export type Variant = StringMap<string, string>;
15
+ /**
16
+ * Grammar rule definition.
17
+ *
18
+ * It can be one of:
19
+ * - a tagged variant map,
20
+ * - a sequence of referenced rule names,
21
+ * - an encoded terminal range.
22
+ */
23
+ export type Rule = Variant | Sequence | TerminalRange;
24
+ /** The full grammar */
25
+ export type RuleSet = Readonly<Record<string, Rule>>;
26
+ /**
27
+ * Whether a rule can match empty input: `undefined` if it never can, `true`
28
+ * if it can with no tag (a nullable sequence), or the tag of the nullable
29
+ * variant branch.
30
+ */
31
+ export type EmptyTag = string | true | undefined;
32
+ type EmptyTagMap = StringMap<string, EmptyTag>;
33
+ /**
34
+ * Computes, for every rule in the set, whether it can match empty input, by
35
+ * the standard nullable-set fixpoint: a sequence is nullable iff all of its
36
+ * items are (AND semantics), a variant iff at least one branch is (its tag is
37
+ * that branch's). Rules may reference each other cyclically (e.g. a `repeat`
38
+ * rule referring to itself), so this starts every rule as non-nullable and
39
+ * relaxes every rule, one round at a time, until a full round changes
40
+ * nothing. A round only ever grows the nullable set or moves a variant's
41
+ * chosen tag to a later (still-nullable) branch, both bounded, so this always
42
+ * terminates — but a rule's tag can still change for rounds *after* its own
43
+ * nullable/non-nullable status has already settled, while a cyclic
44
+ * dependency's tag catches up, so a fixed round count isn't enough.
45
+ */
46
+ export declare const emptyTagMap: (ruleSet: RuleSet) => EmptyTagMap;
47
+ /**
48
+ * Converts a functional grammar rule into serializable BNF data and returns
49
+ * the generated rule set with the entry rule identifier.
50
+ */
51
+ export declare const toData: (fr: FRule) => readonly [RuleSet, string];
52
+ export {};
@@ -5,15 +5,65 @@
5
5
  * This module is the pure, parser-agnostic substrate: it defines the
6
6
  * {@link RuleSet} data form (`Rule = Variant | Sequence | TerminalRange`) and
7
7
  * converts a functional grammar into it. The automaton builders that consume a
8
- * {@link RuleSet} live in their own sibling modules (`fs/bnf/ll1`,
9
- * `fs/bnf/descent`, …), so the IR stays free of any one parser's machinery.
8
+ * {@link RuleSet} live in their own sibling modules (`fjs/bnf/ll1`,
9
+ * `fjs/bnf/descent`, …), so the IR stays free of any one parser's machinery.
10
10
  *
11
11
  * @module
12
12
  */
13
- import { stringToCodePointList } from "../../text/utf16/module.f.js";
14
- import { map, toArray } from "../../types/list/module.f.js";
15
- import { oneEncode, } from "../module.f.js";
16
- import {} from "../../types/object/module.f.js";
13
+ import { stringToCodePointList } from '../../text/utf16/module.f.js';
14
+ import { map, toArray } from '../../types/list/module.f.js';
15
+ import { oneEncode, } from '../module.f.js';
16
+ import { definedEntries } from '../../types/object/module.f.js';
17
+ const emptyTagOf = (map) => (rule) => {
18
+ if (typeof rule === 'number') {
19
+ return undefined;
20
+ }
21
+ else if (rule instanceof Array) {
22
+ return rule.every(item => map[item] !== undefined) ? true : undefined;
23
+ }
24
+ else {
25
+ let tag = undefined;
26
+ for (const [k, item] of definedEntries(rule)) {
27
+ if (map[item] !== undefined) {
28
+ tag = k;
29
+ }
30
+ }
31
+ return tag;
32
+ }
33
+ };
34
+ const emptyTagStep = (ruleSet) => (map) => {
35
+ let next = map;
36
+ let changed = false;
37
+ for (const name in ruleSet) {
38
+ const tag = emptyTagOf(map)(ruleSet[name]);
39
+ if (tag !== next[name]) {
40
+ changed = true;
41
+ }
42
+ next = { ...next, [name]: tag };
43
+ }
44
+ return [next, changed];
45
+ };
46
+ /**
47
+ * Computes, for every rule in the set, whether it can match empty input, by
48
+ * the standard nullable-set fixpoint: a sequence is nullable iff all of its
49
+ * items are (AND semantics), a variant iff at least one branch is (its tag is
50
+ * that branch's). Rules may reference each other cyclically (e.g. a `repeat`
51
+ * rule referring to itself), so this starts every rule as non-nullable and
52
+ * relaxes every rule, one round at a time, until a full round changes
53
+ * nothing. A round only ever grows the nullable set or moves a variant's
54
+ * chosen tag to a later (still-nullable) branch, both bounded, so this always
55
+ * terminates — but a rule's tag can still change for rounds *after* its own
56
+ * nullable/non-nullable status has already settled, while a cyclic
57
+ * dependency's tag catches up, so a fixed round count isn't enough.
58
+ */
59
+ export const emptyTagMap = (ruleSet) => {
60
+ const step = emptyTagStep(ruleSet);
61
+ const relax = (map) => {
62
+ const [next, changed] = step(map);
63
+ return changed ? relax(next) : next;
64
+ };
65
+ return relax({});
66
+ };
17
67
  const { entries } = Object;
18
68
  const find = (map) => (fr) => {
19
69
  for (const [k, v] of entries(map)) {
@@ -3,5 +3,6 @@ export declare const proof: {
3
3
  rangeEncode: () => void;
4
4
  toData: (() => void)[];
5
5
  variantTest: () => void;
6
+ emptyTagMap: (() => void)[];
6
7
  example: () => void;
7
8
  };
@@ -1,23 +1,18 @@
1
- import { stringify } from "../../json/module.f.js";
2
- import { identity } from "../../types/function/module.f.js";
3
- import { sort } from "../../types/object/module.f.js";
4
- import { oneEncode, option, range, rangeDecode, repeat0Plus, set } from "../module.f.js";
5
- import { classic, deterministic } from "../testlib.f.js";
6
- import { toData } from "./module.f.js";
1
+ import { stringify } from '../../media/json/module.f.js';
2
+ import { identity } from '../../types/function/module.f.js';
3
+ import { sort } from '../../types/object/module.f.js';
4
+ import { oneEncode, option, range, rangeDecode, repeat0Plus, set } from '../module.f.js';
5
+ import { classic, deterministic } from '../testlib.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
  };