functionalscript 0.44.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/README.md +5 -3
  2. package/fjs/asn.1/module.f.mjs +8 -1
  3. package/fjs/asn.1/proof.f.d.mts +15 -0
  4. package/fjs/asn.1/proof.f.mjs +31 -3
  5. package/fjs/asserts/module.f.d.mts +14 -0
  6. package/fjs/asserts/module.f.mjs +20 -0
  7. package/fjs/asserts/proof.f.d.mts +3 -0
  8. package/fjs/asserts/proof.f.mjs +15 -1
  9. package/fjs/basen/base128/module.f.mjs +22 -5
  10. package/fjs/basen/base128/proof.f.d.mts +3 -1
  11. package/fjs/basen/base128/proof.f.mjs +3 -1
  12. package/fjs/basen/base64/module.f.mjs +7 -3
  13. package/fjs/basen/base64/proof.f.d.mts +3 -1
  14. package/fjs/basen/base64/proof.f.mjs +7 -4
  15. package/fjs/basen/cbase32/proof.f.d.mts +3 -1
  16. package/fjs/basen/cbase32/proof.f.mjs +3 -1
  17. package/fjs/bnf/data/module.f.d.mts +32 -6
  18. package/fjs/bnf/data/module.f.mjs +112 -7
  19. package/fjs/bnf/data/proof.f.d.mts +2 -0
  20. package/fjs/bnf/data/proof.f.mjs +74 -4
  21. package/fjs/bnf/data/types.d.ts +20 -2
  22. package/fjs/bnf/descent/module.f.d.mts +34 -5
  23. package/fjs/bnf/descent/module.f.mjs +176 -54
  24. package/fjs/bnf/descent/proof.f.d.mts +3 -0
  25. package/fjs/bnf/descent/proof.f.mjs +189 -27
  26. package/fjs/bnf/descent/types.d.ts +24 -18
  27. package/fjs/bnf/ll1/module.f.d.mts +74 -6
  28. package/fjs/bnf/ll1/module.f.mjs +297 -95
  29. package/fjs/bnf/ll1/proof.f.d.mts +17 -2
  30. package/fjs/bnf/ll1/proof.f.mjs +372 -137
  31. package/fjs/bnf/ll1/types.d.ts +25 -27
  32. package/fjs/bnf/matcher/module.f.d.mts +66 -0
  33. package/fjs/bnf/matcher/module.f.mjs +81 -0
  34. package/fjs/bnf/matcher/proof.f.d.mts +10 -0
  35. package/fjs/bnf/matcher/proof.f.mjs +79 -0
  36. package/fjs/bnf/matcher/types.d.ts +54 -0
  37. package/fjs/bnf/module.f.d.mts +15 -6
  38. package/fjs/bnf/module.f.mjs +52 -11
  39. package/fjs/bnf/proof.f.d.mts +2 -0
  40. package/fjs/bnf/proof.f.mjs +79 -3
  41. package/fjs/bnf/testlib.f.d.mts +31 -0
  42. package/fjs/bnf/testlib.f.mjs +80 -0
  43. package/fjs/bnf/token_symbol/module.f.d.mts +4 -3
  44. package/fjs/bnf/token_symbol/module.f.mjs +7 -6
  45. package/fjs/bnf/token_symbol/proof.f.mjs +5 -2
  46. package/fjs/bnf/token_symbol/types.d.ts +2 -2
  47. package/fjs/bnf/types.d.ts +10 -3
  48. package/fjs/cas/cli/module.f.d.mts +1 -1
  49. package/fjs/cas/cli/module.f.mjs +14 -20
  50. package/fjs/cas/cli/proof.f.d.mts +4 -4
  51. package/fjs/cas/cli/proof.f.mjs +47 -34
  52. package/fjs/cas/evo/module.f.d.mts +71 -31
  53. package/fjs/cas/evo/module.f.mjs +223 -138
  54. package/fjs/cas/evo/proof.f.d.mts +10 -1
  55. package/fjs/cas/evo/proof.f.mjs +311 -226
  56. package/fjs/cas/evo/types.d.ts +45 -9
  57. package/fjs/cas/module.f.d.mts +18 -32
  58. package/fjs/cas/module.f.mjs +164 -176
  59. package/fjs/cas/proof.f.d.mts +11 -8
  60. package/fjs/cas/proof.f.mjs +259 -147
  61. package/fjs/cas/types.d.ts +24 -10
  62. package/fjs/ci/common/module.f.d.mts +1 -1
  63. package/fjs/ci/common/module.f.mjs +1 -0
  64. package/fjs/ci/config/module.f.d.mts +3 -3
  65. package/fjs/ci/config/module.f.mjs +3 -3
  66. package/fjs/ci/module.f.d.mts +5 -5
  67. package/fjs/ci/module.f.mjs +8 -7
  68. package/fjs/ci/nix/module.f.d.mts +7 -5
  69. package/fjs/ci/nix/module.f.mjs +13 -12
  70. package/fjs/ci/nix/proof.f.d.mts +2 -0
  71. package/fjs/ci/nix/proof.f.mjs +4 -4
  72. package/fjs/ci/proof.f.d.mts +4 -2
  73. package/fjs/ci/proof.f.mjs +13 -8
  74. package/fjs/cli/module.f.d.mts +4 -6
  75. package/fjs/cli/module.f.mjs +4 -8
  76. package/fjs/cli/proof.f.d.mts +4 -2
  77. package/fjs/cli/proof.f.mjs +21 -18
  78. package/fjs/cli/types.d.ts +2 -3
  79. package/fjs/common/monoid/module.f.d.mts +70 -12
  80. package/fjs/common/monoid/module.f.mjs +177 -14
  81. package/fjs/common/monoid/proof.f.d.mts +12 -1
  82. package/fjs/common/monoid/proof.f.mjs +88 -4
  83. package/fjs/common/monoid/types.d.ts +23 -0
  84. package/fjs/crypto/hmac/module.f.mjs +2 -2
  85. package/fjs/crypto/secp/proof.f.d.mts +3 -1
  86. package/fjs/crypto/secp/proof.f.mjs +3 -1
  87. package/fjs/crypto/sha2/module.f.mjs +3 -1
  88. package/fjs/crypto/sha2/proof.f.d.mts +4 -1
  89. package/fjs/crypto/sha2/proof.f.mjs +27 -1
  90. package/fjs/crypto/sha2/types.d.ts +11 -0
  91. package/fjs/crypto/sign/module.f.mjs +2 -2
  92. package/fjs/crypto/vdf/module.f.d.mts +23 -4
  93. package/fjs/crypto/vdf/module.f.mjs +6 -4
  94. package/fjs/dev/module.f.d.mts +17 -5
  95. package/fjs/dev/module.f.mjs +60 -30
  96. package/fjs/dev/update/module.f.d.mts +11 -3
  97. package/fjs/dev/update/module.f.mjs +16 -11
  98. package/fjs/dev/update/proof.f.d.mts +4 -3
  99. package/fjs/dev/update/proof.f.mjs +11 -7
  100. package/fjs/djs/module.f.d.mts +13 -5
  101. package/fjs/djs/module.f.mjs +31 -16
  102. package/fjs/djs/parser/module.f.d.mts +16 -3
  103. package/fjs/djs/parser/module.f.mjs +135 -16
  104. package/fjs/djs/parser/proof.f.d.mts +8 -1
  105. package/fjs/djs/parser/proof.f.mjs +287 -13
  106. package/fjs/djs/parser/types.d.ts +7 -1
  107. package/fjs/djs/proof.f.d.mts +20 -1
  108. package/fjs/djs/proof.f.mjs +190 -12
  109. package/fjs/djs/serializer/module.f.d.mts +25 -8
  110. package/fjs/djs/serializer/module.f.mjs +66 -19
  111. package/fjs/djs/serializer/proof.f.d.mts +5 -0
  112. package/fjs/djs/serializer/proof.f.mjs +23 -1
  113. package/fjs/djs/tokenizer/module.f.d.mts +17 -5
  114. package/fjs/djs/tokenizer/module.f.mjs +120 -73
  115. package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
  116. package/fjs/djs/tokenizer/proof.f.mjs +86 -67
  117. package/fjs/djs/transpiler/module.f.d.mts +13 -19
  118. package/fjs/djs/transpiler/module.f.mjs +79 -72
  119. package/fjs/djs/transpiler/types.d.ts +29 -0
  120. package/fjs/djs/types.d.ts +7 -1
  121. package/fjs/effects/list/module.f.d.mts +23 -12
  122. package/fjs/effects/list/module.f.mjs +16 -12
  123. package/fjs/effects/list/types.d.ts +27 -7
  124. package/fjs/effects/memory/module.f.d.mts +6 -3
  125. package/fjs/effects/memory/module.f.mjs +7 -7
  126. package/fjs/effects/memory/proof.f.d.mts +4 -0
  127. package/fjs/effects/memory/proof.f.mjs +18 -9
  128. package/fjs/effects/memory/types.d.ts +4 -3
  129. package/fjs/effects/mock/module.f.d.mts +28 -4
  130. package/fjs/effects/mock/module.f.mjs +39 -5
  131. package/fjs/effects/mock/types.d.ts +10 -1
  132. package/fjs/effects/module.d.mts +12 -2
  133. package/fjs/effects/module.f.d.mts +469 -281
  134. package/fjs/effects/module.f.mjs +538 -299
  135. package/fjs/effects/module.mjs +11 -2
  136. package/fjs/effects/node/memory/module.d.mts +7 -2
  137. package/fjs/effects/node/memory/module.mjs +9 -5
  138. package/fjs/effects/node/memory/proof.d.mts +2 -0
  139. package/fjs/effects/node/memory/proof.mjs +12 -5
  140. package/fjs/effects/node/module.d.mts +8 -2
  141. package/fjs/effects/node/module.f.d.mts +183 -43
  142. package/fjs/effects/node/module.f.mjs +260 -62
  143. package/fjs/effects/node/module.mjs +61 -50
  144. package/fjs/effects/node/proof.f.d.mts +28 -2
  145. package/fjs/effects/node/proof.f.mjs +161 -42
  146. package/fjs/effects/node/types.d.ts +106 -18
  147. package/fjs/effects/node/virtual/module.f.d.mts +21 -4
  148. package/fjs/effects/node/virtual/module.f.mjs +113 -70
  149. package/fjs/effects/node/virtual/proof.f.d.mts +31 -2
  150. package/fjs/effects/node/virtual/proof.f.mjs +201 -8
  151. package/fjs/effects/proof.f.d.mts +69 -34
  152. package/fjs/effects/proof.f.mjs +413 -130
  153. package/fjs/effects/types.d.ts +161 -33
  154. package/fjs/emergent_testing/all.test.d.mts +8 -0
  155. package/fjs/emergent_testing/all.test.mjs +14 -0
  156. package/fjs/emergent_testing/module.f.d.mts +22 -10
  157. package/fjs/emergent_testing/module.f.mjs +119 -85
  158. package/fjs/emergent_testing/proof.f.d.mts +21 -7
  159. package/fjs/emergent_testing/proof.f.mjs +169 -35
  160. package/fjs/emergent_testing/types.d.ts +22 -4
  161. package/fjs/fsc/bnf.f.d.mts +3 -0
  162. package/fjs/fsc/bnf.f.mjs +4 -1
  163. package/fjs/fsc/json.f.d.mts +3 -0
  164. package/fjs/fsc/json.f.mjs +4 -1
  165. package/fjs/fsc/module.f.d.mts +9 -0
  166. package/fjs/fsc/module.f.mjs +5 -3
  167. package/fjs/fsm/module.f.d.mts +14 -4
  168. package/fjs/fsm/module.f.mjs +54 -37
  169. package/fjs/fsm/proof.f.d.mts +5 -0
  170. package/fjs/fsm/proof.f.mjs +87 -115
  171. package/fjs/js/keywords/module.f.d.mts +52 -0
  172. package/fjs/js/keywords/module.f.mjs +72 -0
  173. package/fjs/{emergent_testing/scenarios/return-value.pass.d.ts → js/keywords/proof.f.d.mts} +1 -1
  174. package/fjs/js/keywords/proof.f.mjs +13 -0
  175. package/fjs/js/tokenizer/module.f.d.mts +30 -3
  176. package/fjs/js/tokenizer/module.f.mjs +161 -211
  177. package/fjs/js/tokenizer/proof.f.d.mts +1 -0
  178. package/fjs/js/tokenizer/proof.f.mjs +54 -24
  179. package/fjs/js/tokenizer/types.d.ts +33 -24
  180. package/fjs/mcp/cas/module.f.d.mts +1 -6
  181. package/fjs/mcp/cas/module.f.mjs +55 -51
  182. package/fjs/mcp/cas/proof.f.d.mts +15 -0
  183. package/fjs/mcp/cas/proof.f.mjs +174 -0
  184. package/fjs/mcp/evo/module.f.d.mts +19 -10
  185. package/fjs/mcp/evo/module.f.mjs +48 -27
  186. package/fjs/mcp/evo/proof.f.d.mts +6 -1
  187. package/fjs/mcp/evo/proof.f.mjs +115 -31
  188. package/fjs/mcp/module.f.d.mts +39 -4
  189. package/fjs/mcp/module.f.mjs +14 -12
  190. package/fjs/mcp/proof.f.d.mts +13 -1
  191. package/fjs/mcp/proof.f.mjs +120 -61
  192. package/fjs/media/html/module.f.d.mts +12 -0
  193. package/fjs/media/html/module.f.mjs +7 -5
  194. package/fjs/media/html/proof.f.d.mts +3 -0
  195. package/fjs/media/html/proof.f.mjs +4 -1
  196. package/fjs/media/json/extended/module.f.d.mts +82 -0
  197. package/fjs/media/json/extended/module.f.mjs +153 -0
  198. package/fjs/media/json/extended/proof.f.d.mts +42 -0
  199. package/fjs/media/json/extended/proof.f.mjs +127 -0
  200. package/fjs/media/json/extended/types.d.ts +23 -0
  201. package/fjs/media/json/module.f.d.mts +8 -2
  202. package/fjs/media/json/module.f.mjs +43 -41
  203. package/fjs/media/json/number/module.f.d.mts +59 -0
  204. package/fjs/media/json/number/module.f.mjs +136 -0
  205. package/fjs/media/json/number/proof.f.d.mts +24 -0
  206. package/fjs/media/json/number/proof.f.mjs +86 -0
  207. package/fjs/media/json/number/types.d.ts +28 -0
  208. package/fjs/media/json/parser/module.f.d.mts +25 -13
  209. package/fjs/media/json/parser/module.f.mjs +133 -72
  210. package/fjs/media/json/parser/proof.f.d.mts +5 -0
  211. package/fjs/media/json/parser/proof.f.mjs +31 -1
  212. package/fjs/media/json/parser/types.d.ts +38 -14
  213. package/fjs/media/json/rtti/module.f.d.mts +1 -1
  214. package/fjs/media/json/rtti/module.f.mjs +1 -1
  215. package/fjs/media/json/rtti/proof.f.d.mts +3 -0
  216. package/fjs/media/json/rtti/proof.f.mjs +12 -12
  217. package/fjs/media/json/schema/module.f.d.mts +61 -27
  218. package/fjs/media/json/schema/module.f.mjs +218 -63
  219. package/fjs/media/json/schema/proof.f.d.mts +41 -1
  220. package/fjs/media/json/schema/proof.f.mjs +220 -9
  221. package/fjs/media/json/serializer/module.f.d.mts +44 -0
  222. package/fjs/media/json/serializer/module.f.mjs +71 -9
  223. package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
  224. package/fjs/media/json/tokenizer/module.f.mjs +31 -8
  225. package/fjs/media/json/tokenizer/proof.f.d.mts +6 -0
  226. package/fjs/media/json/tokenizer/proof.f.mjs +62 -21
  227. package/fjs/media/json/types.d.ts +36 -10
  228. package/fjs/media/lock/module.f.d.mts +100 -0
  229. package/fjs/media/lock/module.f.mjs +125 -0
  230. package/fjs/media/lock/proof.f.d.mts +33 -0
  231. package/fjs/media/lock/proof.f.mjs +196 -0
  232. package/fjs/media/lock/types.d.ts +15 -0
  233. package/fjs/media/module.f.d.mts +6 -5
  234. package/fjs/media/module.f.mjs +8 -7
  235. package/fjs/media/nix/module.f.d.mts +13 -0
  236. package/fjs/media/nix/module.f.mjs +4 -2
  237. package/fjs/media/nix/proof.f.d.mts +3 -0
  238. package/fjs/media/nix/proof.f.mjs +4 -1
  239. package/fjs/media/note/module.f.d.mts +121 -0
  240. package/fjs/media/note/module.f.mjs +131 -0
  241. package/fjs/media/note/proof.f.d.mts +29 -0
  242. package/fjs/media/note/proof.f.mjs +150 -0
  243. package/fjs/media/note/types.d.ts +10 -0
  244. package/fjs/media/proof.f.d.mts +4 -1
  245. package/fjs/media/proof.f.mjs +40 -21
  246. package/fjs/media/revision/module.f.d.mts +83 -7
  247. package/fjs/media/revision/module.f.mjs +127 -23
  248. package/fjs/media/revision/proof.f.d.mts +14 -0
  249. package/fjs/media/revision/proof.f.mjs +93 -2
  250. package/fjs/media/revision/types.d.ts +34 -5
  251. package/fjs/media/type/module.f.d.mts +53 -18
  252. package/fjs/media/type/module.f.mjs +87 -97
  253. package/fjs/media/type/proof.f.d.mts +17 -0
  254. package/fjs/media/type/proof.f.mjs +73 -13
  255. package/fjs/module.d.mts +5 -0
  256. package/fjs/module.f.d.mts +8 -0
  257. package/fjs/module.f.mjs +33 -10
  258. package/fjs/module.mjs +6 -0
  259. package/fjs/nanvm/proof.f.mjs +3 -3
  260. package/fjs/nanvm/rust/module.f.mjs +1 -1
  261. package/fjs/nanvm/update/module.f.d.mts +4 -4
  262. package/fjs/nanvm/update/module.f.mjs +8 -9
  263. package/fjs/nanvm/update/proof.f.mjs +4 -3
  264. package/fjs/path/module.f.d.mts +8 -0
  265. package/fjs/path/module.f.mjs +4 -2
  266. package/fjs/proof.f.d.mts +7 -3
  267. package/fjs/proof.f.mjs +41 -12
  268. package/fjs/protocol/json_rpc/module.f.d.mts +3 -3
  269. package/fjs/protocol/json_rpc/module.f.mjs +10 -7
  270. package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
  271. package/fjs/protocol/json_rpc/proof.f.mjs +26 -5
  272. package/fjs/protocol/mcp/module.f.d.mts +10 -13
  273. package/fjs/protocol/mcp/module.f.mjs +74 -58
  274. package/fjs/protocol/mcp/proof.f.d.mts +16 -3
  275. package/fjs/protocol/mcp/proof.f.mjs +224 -69
  276. package/fjs/protocol/mcp/stdio/module.f.d.mts +17 -11
  277. package/fjs/protocol/mcp/stdio/module.f.mjs +39 -33
  278. package/fjs/protocol/mcp/stdio/proof.f.d.mts +5 -3
  279. package/fjs/protocol/mcp/stdio/proof.f.mjs +46 -13
  280. package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
  281. package/fjs/protocol/mcp/types.d.ts +17 -6
  282. package/fjs/sul/id/module.f.d.mts +4 -0
  283. package/fjs/sul/id/module.f.mjs +6 -6
  284. package/fjs/sul/level/hash/module.f.d.mts +4 -1
  285. package/fjs/sul/level/hash/module.f.mjs +6 -4
  286. package/fjs/sul/level/hash/proof.f.d.mts +4 -0
  287. package/fjs/sul/level/hash/proof.f.mjs +7 -4
  288. package/fjs/sul/level/literal/module.f.d.mts +4 -1
  289. package/fjs/sul/level/literal/module.f.mjs +4 -3
  290. package/fjs/sul/level/literal/proof.f.d.mts +3 -0
  291. package/fjs/sul/level/literal/proof.f.mjs +4 -1
  292. package/fjs/sul/module.f.d.mts +5 -3
  293. package/fjs/sul/module.f.mjs +23 -17
  294. package/fjs/sul/proof.f.d.mts +4 -0
  295. package/fjs/sul/proof.f.mjs +5 -2
  296. package/fjs/text/ascii/module.f.d.mts +26 -0
  297. package/fjs/text/ascii/module.f.mjs +49 -1
  298. package/fjs/text/ascii/proof.f.d.mts +10 -0
  299. package/fjs/text/ascii/proof.f.mjs +33 -1
  300. package/fjs/text/code_point/module.f.d.mts +29 -3
  301. package/fjs/text/code_point/module.f.mjs +32 -9
  302. package/fjs/text/code_point/proof.f.d.mts +2 -0
  303. package/fjs/text/code_point/proof.f.mjs +39 -0
  304. package/fjs/text/module.f.d.mts +4 -2
  305. package/fjs/text/module.f.mjs +4 -3
  306. package/fjs/text/proof.f.d.mts +3 -0
  307. package/fjs/text/proof.f.mjs +4 -1
  308. package/fjs/text/sgr/module.f.d.mts +6 -5
  309. package/fjs/text/sgr/module.f.mjs +8 -8
  310. package/fjs/text/sgr/proof.f.d.mts +3 -0
  311. package/fjs/text/sgr/proof.f.mjs +4 -1
  312. package/fjs/text/utf16/module.f.d.mts +5 -1
  313. package/fjs/text/utf16/module.f.mjs +38 -35
  314. package/fjs/text/utf16/proof.f.d.mts +3 -1
  315. package/fjs/text/utf16/proof.f.mjs +19 -2
  316. package/fjs/text/utf8/module.f.d.mts +9 -5
  317. package/fjs/text/utf8/module.f.mjs +20 -20
  318. package/fjs/types/array/module.f.d.mts +2 -1
  319. package/fjs/types/array/module.f.mjs +16 -4
  320. package/fjs/types/bigfloat/module.f.d.mts +21 -1
  321. package/fjs/types/bigfloat/module.f.mjs +33 -7
  322. package/fjs/types/bigfloat/proof.f.d.mts +1 -0
  323. package/fjs/types/bigfloat/proof.f.mjs +46 -0
  324. package/fjs/types/bigint/module.f.d.mts +4 -0
  325. package/fjs/types/bigint/module.f.mjs +4 -3
  326. package/fjs/types/bit_vec/module.f.d.mts +10 -16
  327. package/fjs/types/bit_vec/module.f.mjs +99 -95
  328. package/fjs/types/bit_vec/proof.f.d.mts +6 -0
  329. package/fjs/types/bit_vec/proof.f.mjs +31 -5
  330. package/fjs/types/btree/find/module.f.d.mts +5 -1
  331. package/fjs/types/btree/find/module.f.mjs +5 -5
  332. package/fjs/types/btree/find/proof.f.d.mts +5 -1
  333. package/fjs/types/btree/find/proof.f.mjs +5 -3
  334. package/fjs/types/btree/module.f.d.mts +3 -0
  335. package/fjs/types/btree/module.f.mjs +3 -2
  336. package/fjs/types/btree/proof.f.d.mts +5 -1
  337. package/fjs/types/btree/proof.f.mjs +5 -3
  338. package/fjs/types/btree/remove/module.f.d.mts +11 -0
  339. package/fjs/types/btree/remove/module.f.mjs +10 -10
  340. package/fjs/types/btree/remove/proof.f.d.mts +3 -0
  341. package/fjs/types/btree/remove/proof.f.mjs +4 -1
  342. package/fjs/types/btree/set/module.f.d.mts +9 -0
  343. package/fjs/types/btree/set/module.f.mjs +14 -17
  344. package/fjs/types/btree/set/proof.f.d.mts +3 -0
  345. package/fjs/types/btree/set/proof.f.mjs +16 -1
  346. package/fjs/types/btree/types/module.f.d.mts +2 -1
  347. package/fjs/types/btree/types/module.f.mjs +2 -1
  348. package/fjs/types/byte_set/module.f.d.mts +20 -4
  349. package/fjs/types/byte_set/module.f.mjs +18 -8
  350. package/fjs/types/byte_set/proof.f.d.mts +3 -1
  351. package/fjs/types/byte_set/proof.f.mjs +10 -8
  352. package/fjs/types/function/compare/module.f.d.mts +3 -2
  353. package/fjs/types/function/compare/module.f.mjs +13 -5
  354. package/fjs/types/function/module.f.d.mts +8 -1
  355. package/fjs/types/function/module.f.mjs +8 -1
  356. package/fjs/types/function/operator/module.f.d.mts +2 -1
  357. package/fjs/types/function/operator/module.f.mjs +2 -2
  358. package/fjs/types/list/module.f.d.mts +10 -3
  359. package/fjs/types/list/module.f.mjs +6 -4
  360. package/fjs/types/list/proof.f.d.mts +4 -1
  361. package/fjs/types/list/proof.f.mjs +4 -2
  362. package/fjs/types/nibble_set/module.f.d.mts +2 -1
  363. package/fjs/types/nibble_set/module.f.mjs +2 -2
  364. package/fjs/types/nominal/module.f.d.mts +2 -1
  365. package/fjs/types/nominal/module.f.mjs +2 -1
  366. package/fjs/types/nullable/module.f.d.mts +26 -6
  367. package/fjs/types/nullable/module.f.mjs +25 -6
  368. package/fjs/types/nullable/proof.f.d.mts +4 -0
  369. package/fjs/types/nullable/proof.f.mjs +15 -0
  370. package/fjs/types/number/module.f.d.mts +4 -0
  371. package/fjs/types/number/module.f.mjs +4 -3
  372. package/fjs/types/object/module.f.d.mts +26 -4
  373. package/fjs/types/object/module.f.mjs +26 -7
  374. package/fjs/types/object/proof.f.d.mts +5 -2
  375. package/fjs/types/object/proof.f.mjs +6 -3
  376. package/fjs/types/object/structurally_same/module.f.d.mts +39 -0
  377. package/fjs/types/object/structurally_same/module.f.mjs +59 -0
  378. package/fjs/types/object/structurally_same/proof.f.d.mts +6 -0
  379. package/fjs/types/object/structurally_same/proof.f.mjs +73 -0
  380. package/fjs/types/ordered_map/module.f.d.mts +5 -0
  381. package/fjs/types/ordered_map/module.f.mjs +5 -4
  382. package/fjs/types/ordered_map/proof.f.d.mts +3 -0
  383. package/fjs/types/ordered_map/proof.f.mjs +4 -1
  384. package/fjs/types/patricia_trie/module.f.d.mts +2 -1
  385. package/fjs/types/patricia_trie/module.f.mjs +27 -12
  386. package/fjs/types/patricia_trie/proof.f.d.mts +3 -0
  387. package/fjs/types/patricia_trie/proof.f.mjs +4 -1
  388. package/fjs/types/prime_field/module.f.d.mts +3 -1
  389. package/fjs/types/prime_field/module.f.mjs +3 -2
  390. package/fjs/types/range/module.f.d.mts +2 -1
  391. package/fjs/types/range/module.f.mjs +2 -2
  392. package/fjs/types/range_map/module.f.d.mts +6 -0
  393. package/fjs/types/range_map/module.f.mjs +6 -9
  394. package/fjs/types/range_map/proof.f.d.mts +5 -1
  395. package/fjs/types/range_map/proof.f.mjs +5 -3
  396. package/fjs/types/range_set/module.f.d.mts +5 -0
  397. package/fjs/types/range_set/module.f.mjs +1 -0
  398. package/fjs/types/range_set/proof.f.d.mts +3 -0
  399. package/fjs/types/range_set/proof.f.mjs +4 -1
  400. package/fjs/types/result/module.d.mts +8 -0
  401. package/fjs/types/result/module.f.d.mts +37 -7
  402. package/fjs/types/result/module.f.mjs +38 -8
  403. package/fjs/types/result/module.mjs +9 -1
  404. package/fjs/types/result/proof.f.d.mts +5 -0
  405. package/fjs/types/result/proof.f.mjs +22 -2
  406. package/fjs/types/rtti/common/module.f.d.mts +44 -14
  407. package/fjs/types/rtti/common/module.f.mjs +42 -36
  408. package/fjs/types/rtti/common/proof.f.d.mts +4 -0
  409. package/fjs/types/rtti/common/proof.f.mjs +10 -7
  410. package/fjs/types/rtti/data/module.f.d.mts +134 -0
  411. package/fjs/types/rtti/data/module.f.mjs +1053 -0
  412. package/fjs/types/rtti/data/proof.f.d.mts +76 -0
  413. package/fjs/types/rtti/data/proof.f.mjs +589 -0
  414. package/fjs/types/rtti/data/types.d.ts +83 -0
  415. package/fjs/types/rtti/module.f.d.mts +12 -5
  416. package/fjs/types/rtti/module.f.mjs +7 -5
  417. package/fjs/types/rtti/parse/module.f.d.mts +48 -0
  418. package/fjs/types/rtti/parse/module.f.mjs +45 -34
  419. package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
  420. package/fjs/types/rtti/parse/proof.f.mjs +51 -52
  421. package/fjs/types/rtti/proof.f.d.mts +3 -1
  422. package/fjs/types/rtti/proof.f.mjs +6 -2
  423. package/fjs/types/rtti/ts/module.f.d.mts +68 -9
  424. package/fjs/types/rtti/ts/module.f.mjs +258 -30
  425. package/fjs/types/rtti/ts/proof.f.d.mts +44 -0
  426. package/fjs/types/rtti/ts/proof.f.mjs +152 -4
  427. package/fjs/types/rtti/ts/types.d.ts +25 -1
  428. package/fjs/types/rtti/types.d.ts +40 -0
  429. package/fjs/types/sorted_list/module.f.d.mts +4 -1
  430. package/fjs/types/sorted_list/module.f.mjs +21 -12
  431. package/fjs/types/sorted_list/proof.f.d.mts +3 -1
  432. package/fjs/types/sorted_list/proof.f.mjs +3 -1
  433. package/fjs/types/sorted_set/module.f.d.mts +49 -1
  434. package/fjs/types/sorted_set/module.f.mjs +26 -2
  435. package/fjs/types/sorted_set/proof.f.d.mts +4 -1
  436. package/fjs/types/sorted_set/proof.f.mjs +19 -2
  437. package/fjs/types/string/module.f.d.mts +4 -0
  438. package/fjs/types/string/module.f.mjs +4 -3
  439. package/fjs/types/string_set/module.f.d.mts +3 -1
  440. package/fjs/types/string_set/module.f.mjs +3 -2
  441. package/fjs/types/ts/module.f.d.mts +2 -0
  442. package/fjs/types/ts/module.f.mjs +3 -3
  443. package/fjs/types/ts/proof.f.d.mts +1 -0
  444. package/fjs/types/ts/proof.f.mjs +5 -0
  445. package/fjs/types/ts/types.d.ts +6 -1
  446. package/fjs/types/uint8array/module.f.d.mts +13 -2
  447. package/fjs/types/uint8array/module.f.mjs +20 -15
  448. package/fjs/website/module.f.d.mts +5 -2
  449. package/fjs/website/module.f.mjs +6 -8
  450. package/fjs/website/proof.f.mjs +2 -1
  451. package/package.json +3 -3
  452. package/fjs/asn.1/types.js +0 -6
  453. package/fjs/asserts/types.js +0 -6
  454. package/fjs/basen/types.js +0 -6
  455. package/fjs/bnf/data/types.js +0 -6
  456. package/fjs/bnf/descent/types.js +0 -6
  457. package/fjs/bnf/ll1/types.js +0 -6
  458. package/fjs/bnf/token_symbol/types.js +0 -6
  459. package/fjs/bnf/types.js +0 -6
  460. package/fjs/cas/evo/types.js +0 -7
  461. package/fjs/cas/types.js +0 -6
  462. package/fjs/ci/common/types.js +0 -1
  463. package/fjs/ci/nix/types.js +0 -6
  464. package/fjs/ci/types.js +0 -6
  465. package/fjs/cli/types.js +0 -6
  466. package/fjs/common/monoid/types.js +0 -6
  467. package/fjs/crypto/pow/types.js +0 -6
  468. package/fjs/crypto/secp/types.js +0 -6
  469. package/fjs/crypto/sha2/types.js +0 -6
  470. package/fjs/crypto/sign/types.js +0 -6
  471. package/fjs/crypto/vdf/types.js +0 -6
  472. package/fjs/dev/package_json/module.f.d.mts +0 -32
  473. package/fjs/dev/package_json/module.f.mjs +0 -37
  474. package/fjs/dev/package_json/proof.f.d.mts +0 -6
  475. package/fjs/dev/package_json/proof.f.mjs +0 -32
  476. package/fjs/dev/types.js +0 -6
  477. package/fjs/djs/ast/types.js +0 -8
  478. package/fjs/djs/parser/types.js +0 -7
  479. package/fjs/djs/tokenizer/types.js +0 -7
  480. package/fjs/djs/types.js +0 -7
  481. package/fjs/effects/eff/module.f.d.mts +0 -10
  482. package/fjs/effects/eff/module.f.mjs +0 -68
  483. package/fjs/effects/eff/proof.f.d.mts +0 -12
  484. package/fjs/effects/eff/proof.f.mjs +0 -66
  485. package/fjs/effects/eff/types.d.ts +0 -71
  486. package/fjs/effects/eff/types.js +0 -6
  487. package/fjs/effects/list/types.js +0 -6
  488. package/fjs/effects/memory/types.js +0 -6
  489. package/fjs/effects/mock/types.js +0 -6
  490. package/fjs/effects/node/types.js +0 -6
  491. package/fjs/effects/node/virtual/types.js +0 -7
  492. package/fjs/effects/types.js +0 -6
  493. package/fjs/emergent_testing/all.test.d.ts +0 -1
  494. package/fjs/emergent_testing/all.test.js +0 -5
  495. package/fjs/emergent_testing/scenarios/all.d.ts +0 -1
  496. package/fjs/emergent_testing/scenarios/all.js +0 -1
  497. package/fjs/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -6
  498. package/fjs/emergent_testing/scenarios/async-subtests.fail.js +0 -9
  499. package/fjs/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -6
  500. package/fjs/emergent_testing/scenarios/async-subtests.pass.js +0 -9
  501. package/fjs/emergent_testing/scenarios/async.fail.d.ts +0 -3
  502. package/fjs/emergent_testing/scenarios/async.fail.js +0 -6
  503. package/fjs/emergent_testing/scenarios/async.pass.d.ts +0 -3
  504. package/fjs/emergent_testing/scenarios/async.pass.js +0 -5
  505. package/fjs/emergent_testing/scenarios/fail.fail.d.ts +0 -3
  506. package/fjs/emergent_testing/scenarios/fail.fail.js +0 -3
  507. package/fjs/emergent_testing/scenarios/return-value.pass.js +0 -4
  508. package/fjs/emergent_testing/scenarios/thenable.pass.d.ts +0 -5
  509. package/fjs/emergent_testing/scenarios/thenable.pass.js +0 -11
  510. package/fjs/emergent_testing/scenarios/thenable2.pass.d.ts +0 -5
  511. package/fjs/emergent_testing/scenarios/thenable2.pass.js +0 -3
  512. package/fjs/emergent_testing/scenarios/throw.pass.d.ts +0 -5
  513. package/fjs/emergent_testing/scenarios/throw.pass.js +0 -3
  514. package/fjs/emergent_testing/types.js +0 -6
  515. package/fjs/js/tokenizer/types.js +0 -6
  516. package/fjs/media/html/types.js +0 -6
  517. package/fjs/media/json/parser/types.js +0 -6
  518. package/fjs/media/json/tokenizer/types.js +0 -6
  519. package/fjs/media/json/types.js +0 -13
  520. package/fjs/media/nix/types.js +0 -6
  521. package/fjs/media/revision/types.js +0 -8
  522. package/fjs/media/type/types.js +0 -6
  523. package/fjs/media/types.js +0 -7
  524. package/fjs/nanvm/types.js +0 -11
  525. package/fjs/protocol/json_rpc/types.js +0 -8
  526. package/fjs/protocol/mcp/types.js +0 -8
  527. package/fjs/sul/id/types.js +0 -6
  528. package/fjs/sul/level/hash/types.js +0 -6
  529. package/fjs/sul/level/literal/types.js +0 -6
  530. package/fjs/sul/types.js +0 -6
  531. package/fjs/text/sgr/types.js +0 -6
  532. package/fjs/text/types.js +0 -6
  533. package/fjs/text/utf16/types.js +0 -6
  534. package/fjs/text/utf8/types.js +0 -6
  535. package/fjs/types/array/types.js +0 -6
  536. package/fjs/types/bigfloat/types.js +0 -6
  537. package/fjs/types/bigint/types.js +0 -6
  538. package/fjs/types/bit_vec/types.js +0 -6
  539. package/fjs/types/btree/find/types.js +0 -6
  540. package/fjs/types/btree/types/types.js +0 -6
  541. package/fjs/types/byte_set/types.js +0 -6
  542. package/fjs/types/function/compare/types.js +0 -6
  543. package/fjs/types/function/operator/types.js +0 -6
  544. package/fjs/types/function/types.js +0 -6
  545. package/fjs/types/list/types.js +0 -6
  546. package/fjs/types/nibble_set/types.js +0 -6
  547. package/fjs/types/nominal/types.js +0 -6
  548. package/fjs/types/nullable/types.js +0 -6
  549. package/fjs/types/object/types.js +0 -8
  550. package/fjs/types/option/types.js +0 -6
  551. package/fjs/types/ordered_map/types.js +0 -6
  552. package/fjs/types/patricia_trie/types.js +0 -6
  553. package/fjs/types/phantom/types.js +0 -11
  554. package/fjs/types/prime_field/types.js +0 -6
  555. package/fjs/types/range/types.js +0 -6
  556. package/fjs/types/range_map/types.js +0 -6
  557. package/fjs/types/result/types.js +0 -6
  558. package/fjs/types/rtti/common/types.js +0 -1
  559. package/fjs/types/rtti/parse/types.js +0 -1
  560. package/fjs/types/rtti/ts/types.js +0 -1
  561. package/fjs/types/rtti/types.js +0 -1
  562. package/fjs/types/rtti/validate/module.f.d.mts +0 -6
  563. package/fjs/types/rtti/validate/module.f.mjs +0 -169
  564. package/fjs/types/rtti/validate/proof.f.d.mts +0 -125
  565. package/fjs/types/rtti/validate/proof.f.mjs +0 -437
  566. package/fjs/types/rtti/validate/types.d.ts +0 -6
  567. package/fjs/types/rtti/validate/types.js +0 -1
  568. package/fjs/types/sorted_list/types.js +0 -6
  569. package/fjs/types/sorted_set/types.js +0 -6
  570. package/fjs/types/string_set/types.js +0 -6
  571. package/fjs/types/ts/types.js +0 -8
@@ -6,41 +6,40 @@
6
6
  import type { CodePoint } from '../../text/utf16/types.ts';
7
7
  import type { RangeMapArray } from '../../types/range_map/types.ts';
8
8
  import type { StringMap } from '../../types/object/types.ts';
9
- import type { EmptyTag } from '../data/types.ts';
10
- /** @internal */
9
+ import type { Ast } from '../matcher/types.ts';
10
+ /**
11
+ * A rule's dispatch entry: its first set as a range map, and — for a variant
12
+ * that can match empty — the branch a dispatch miss selects.
13
+ *
14
+ * @internal
15
+ */
11
16
  export type _DispatchRule = {
12
- readonly emptyTag: EmptyTag;
17
+ readonly empty: _DispatchBranch | undefined;
13
18
  readonly rangeMap: _Dispatch;
14
19
  };
15
20
  /** @internal */
16
21
  export type _Dispatch = RangeMapArray<_DispatchResult>;
17
22
  /** @internal */
18
- export type _DispatchResult = _DispatchRuleCollection | null;
19
- /** @internal */
20
- export type _DispatchRuleOrName = _DispatchRule | string;
21
- /** @internal */
22
- export type _DispatchRuleCollection = {
23
- readonly tag: string | undefined;
24
- readonly rules: _DispatchRuleOrName[];
25
- };
26
- /** @internal */
27
- export type _DispatchMap = StringMap<_DispatchRule>;
23
+ export type _DispatchResult = _DispatchBranch | null;
28
24
  /**
29
- * Represents a parsed AST rule, consisting of a rule name and its parsed sequence.
25
+ * A branch as dispatch selects it: the name of the rule to invoke a name
26
+ * into the {@link _DispatchMap} — and the tag its node gets. Only a variant's
27
+ * entries are ever read as branches; every other rule kind consults its range
28
+ * map solely for first-set membership.
30
29
  *
31
30
  * @internal
32
31
  */
33
- export type _AstRule = {
34
- readonly tag: AstTag;
35
- readonly sequence: AstSequence;
32
+ export type _DispatchBranch = {
33
+ readonly tag: string | undefined;
34
+ readonly name: string;
36
35
  };
37
- /**
38
- * Represents a parsed AST sequence.
39
- */
40
- export type AstSequence = readonly (_AstRule | CodePoint)[];
41
- export type AstTag = string | true | undefined;
36
+ /** @internal */
37
+ export type _DispatchMap = StringMap<_DispatchRule>;
42
38
  /**
43
39
  * Represents the remaining input after a match attempt, or `null` if no match is possible.
40
+ *
41
+ * The remainder is physical: consuming the synthesized end-of-input symbol
42
+ * leaves it empty rather than making it `null`.
44
43
  */
45
44
  export type Remainder = readonly CodePoint[] | null;
46
45
  /**
@@ -48,12 +47,11 @@ export type Remainder = readonly CodePoint[] | null;
48
47
  *
49
48
  * Represents the result of a match operation, including the parsed AST rule and the remainder of the input.
50
49
  */
51
- export type MatchResult = readonly [_AstRule, boolean, Remainder];
50
+ export type MatchResult = readonly [Ast<CodePoint>, boolean, Remainder];
52
51
  /**
53
52
  * LL(1) parser function for matching by rule name.
53
+ *
54
+ * `s` holds physical symbols only; the matcher synthesizes the one logical
55
+ * end-of-input symbol after them.
54
56
  */
55
57
  export type Match = (name: string, s: readonly CodePoint[]) => MatchResult;
56
- /**
57
- * Internal match function signature used by compiled dispatch rules.
58
- */
59
- export type MatchRule = (dr: _DispatchRule, s: readonly CodePoint[]) => MatchResult;
@@ -0,0 +1,66 @@
1
+ /**
2
+ * The layer every BNF matcher backend shares: the {@link Cursor} it matches at,
3
+ * the {@link Ast} it builds, and the constructors that pair them.
4
+ *
5
+ * `fjs/bnf/ll1` and `fjs/bnf/descent` are two machines over one contract, and
6
+ * the contract is what lives here — not the machines. Backtracking, frame
7
+ * shapes, failure reporting and the public result type are each backend's own,
8
+ * and deliberately different; where the input sits, what a consumed symbol
9
+ * contributes to the AST, and how a node is built are not.
10
+ *
11
+ * The three are one module rather than three because they are interdependent:
12
+ * {@link leafAt} produces AST leaves, and {@link mrSuccess} builds AST nodes
13
+ * positioned by a cursor. Splitting them would put one concept behind three
14
+ * imports.
15
+ *
16
+ * See `./types.ts` for the type-level API and `./README.md` for the contract
17
+ * this implements.
18
+ *
19
+ * @module
20
+ *
21
+ * @import { Ast, AstResult, AstSequence, AstTag, Cursor } from './types.ts'
22
+ */
23
+ import type { AstResult, AstSequence, AstTag, Cursor } from './types.ts';
24
+ /**
25
+ * What consuming the symbol at a cursor contributes to the AST: the leaf
26
+ * itself, and nothing for the synthesized end-of-input symbol — it has no
27
+ * physical source element, so it never reaches an AST.
28
+ *
29
+ * @type {<L>(input: readonly L[], pos: Cursor) => AstSequence<L>}
30
+ */
31
+ export declare const leafAt: <L>(input: readonly L[], pos: Cursor) => AstSequence<L>;
32
+ /**
33
+ * The semantic symbol a cursor points at: one read out of the physical input,
34
+ * and the synthesized {@link eofSymbol} at its end. Only meaningful where the
35
+ * cursor still has a symbol, `pos <= input.length`.
36
+ *
37
+ * `symbolOf` is the one place backends differ — it is how a leaf yields its
38
+ * symbol, `identity` where the leaf *is* the code point and a destructuring
39
+ * where it carries metadata alongside. Each backend binds its own partial
40
+ * application once at module scope.
41
+ *
42
+ * @type {<L>(symbolOf: (leaf: L) => number) => (input: readonly L[], pos: Cursor) => number}
43
+ */
44
+ export declare const symbolAt: <L>(symbolOf: (leaf: L) => number) => (input: readonly L[], pos: Cursor) => number;
45
+ /**
46
+ * The public, physical index of a cursor. Consuming the synthesized
47
+ * end-of-input symbol moves the cursor past the physical end, and both cursors
48
+ * report `length`.
49
+ *
50
+ * @type {(length: number) => (pos: Cursor) => number}
51
+ */
52
+ export declare const physicalIdx: (length: number) => (pos: Cursor) => number;
53
+ export type _Mr<L, P> = (tag: AstTag, sequence: AstSequence<L>, pos: P) => AstResult<L, P>;
54
+ /**
55
+ * A matched node at a position.
56
+ *
57
+ * @type {<L, P>(tag: AstTag, sequence: AstSequence<L>, pos: P) => AstResult<L, P>}
58
+ */
59
+ export declare const mrSuccess: <L, P>(tag: AstTag, sequence: AstSequence<L>, pos: P) => AstResult<L, P>;
60
+ /**
61
+ * A node that did not match, at the position the caller should resume from —
62
+ * which a backtracking backend rewinds and a predictive one does not.
63
+ *
64
+ * @type {<L, P>(tag: AstTag, sequence: AstSequence<L>, pos: P) => AstResult<L, P>}
65
+ */
66
+ export declare const mrFail: <L, P>(tag: AstTag, sequence: AstSequence<L>, pos: P) => AstResult<L, P>;
@@ -0,0 +1,81 @@
1
+ /**
2
+ * The layer every BNF matcher backend shares: the {@link Cursor} it matches at,
3
+ * the {@link Ast} it builds, and the constructors that pair them.
4
+ *
5
+ * `fjs/bnf/ll1` and `fjs/bnf/descent` are two machines over one contract, and
6
+ * the contract is what lives here — not the machines. Backtracking, frame
7
+ * shapes, failure reporting and the public result type are each backend's own,
8
+ * and deliberately different; where the input sits, what a consumed symbol
9
+ * contributes to the AST, and how a node is built are not.
10
+ *
11
+ * The three are one module rather than three because they are interdependent:
12
+ * {@link leafAt} produces AST leaves, and {@link mrSuccess} builds AST nodes
13
+ * positioned by a cursor. Splitting them would put one concept behind three
14
+ * imports.
15
+ *
16
+ * See `./types.ts` for the type-level API and `./README.md` for the contract
17
+ * this implements.
18
+ *
19
+ * @module
20
+ *
21
+ * @import { Ast, AstResult, AstSequence, AstTag, Cursor } from './types.ts'
22
+ */
23
+
24
+ import { eofSymbol } from '../module.f.mjs'
25
+
26
+ /**
27
+ * What consuming the symbol at a cursor contributes to the AST: the leaf
28
+ * itself, and nothing for the synthesized end-of-input symbol — it has no
29
+ * physical source element, so it never reaches an AST.
30
+ *
31
+ * @type {<L>(input: readonly L[], pos: Cursor) => AstSequence<L>}
32
+ */
33
+ export const leafAt = (input, pos) => pos < input.length ? [input[pos]] : []
34
+
35
+ /**
36
+ * The semantic symbol a cursor points at: one read out of the physical input,
37
+ * and the synthesized {@link eofSymbol} at its end. Only meaningful where the
38
+ * cursor still has a symbol, `pos <= input.length`.
39
+ *
40
+ * `symbolOf` is the one place backends differ — it is how a leaf yields its
41
+ * symbol, `identity` where the leaf *is* the code point and a destructuring
42
+ * where it carries metadata alongside. Each backend binds its own partial
43
+ * application once at module scope.
44
+ *
45
+ * @type {<L>(symbolOf: (leaf: L) => number) => (input: readonly L[], pos: Cursor) => number}
46
+ */
47
+ export const symbolAt = symbolOf => (input, pos) =>
48
+ pos < input.length ? symbolOf(input[pos]) : eofSymbol
49
+
50
+ /**
51
+ * The public, physical index of a cursor. Consuming the synthesized
52
+ * end-of-input symbol moves the cursor past the physical end, and both cursors
53
+ * report `length`.
54
+ *
55
+ * @type {(length: number) => (pos: Cursor) => number}
56
+ */
57
+ export const physicalIdx = length => pos => Math.min(pos, length)
58
+
59
+ /**
60
+ * @template L
61
+ * @template P
62
+ * @typedef {(tag: AstTag, sequence: AstSequence<L>, pos: P) => AstResult<L, P>} _Mr
63
+ */
64
+
65
+ /** @type {<L, P>(success: boolean) => _Mr<L, P>} */
66
+ const mr = success => (tag, sequence, pos) => ({ ast: { tag, sequence }, success, pos })
67
+
68
+ /**
69
+ * A matched node at a position.
70
+ *
71
+ * @type {<L, P>(tag: AstTag, sequence: AstSequence<L>, pos: P) => AstResult<L, P>}
72
+ */
73
+ export const mrSuccess = mr(true)
74
+
75
+ /**
76
+ * A node that did not match, at the position the caller should resume from —
77
+ * which a backtracking backend rewinds and a predictive one does not.
78
+ *
79
+ * @type {<L, P>(tag: AstTag, sequence: AstSequence<L>, pos: P) => AstResult<L, P>}
80
+ */
81
+ export const mrFail = mr(false)
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @import { CodePointMeta } from '../descent/types.ts'
3
+ */
4
+ export declare const proof: {
5
+ leafAt: (() => void)[];
6
+ symbolAt: (() => void)[];
7
+ physicalIdx: () => void;
8
+ mrSuccess: () => void;
9
+ mrFail: () => void;
10
+ };
@@ -0,0 +1,79 @@
1
+ /**
2
+ * @import { CodePointMeta } from '../descent/types.ts'
3
+ */
4
+
5
+ import { assertEq } from '../../asserts/module.f.mjs'
6
+ import { identity } from '../../types/function/module.f.mjs'
7
+ import { eofSymbol } from '../module.f.mjs'
8
+ import { leafAt, mrFail, mrSuccess, physicalIdx, symbolAt } from './module.f.mjs'
9
+
10
+ /** @type {readonly CodePointMeta<string>[]} */
11
+ const withMeta = [[0x41, 'a'], [0x42, 'b']]
12
+
13
+ /** @type {(leaf: CodePointMeta<string>) => number} */
14
+ const metaSymbolOf = ([symbol]) => symbol
15
+
16
+ export const proof = {
17
+ leafAt: [
18
+ () => {
19
+ // Inside the physical input a leaf is contributed whole, whatever a
20
+ // backend chose a leaf to be.
21
+ assertEq(JSON.stringify(leafAt([65, 66], 0)), '[65]')
22
+ assertEq(JSON.stringify(leafAt([65, 66], 1)), '[66]')
23
+ assertEq(JSON.stringify(leafAt(withMeta, 0)), '[[65,"a"]]')
24
+ },
25
+ () => {
26
+ // At and past the physical end there is nothing to contribute: the
27
+ // synthesized end-of-input symbol has no source element, so it never
28
+ // reaches an AST.
29
+ assertEq(JSON.stringify(leafAt([65, 66], 2)), '[]')
30
+ assertEq(JSON.stringify(leafAt([65, 66], 3)), '[]')
31
+ assertEq(JSON.stringify(leafAt([], 0)), '[]')
32
+ },
33
+ ],
34
+ symbolAt: [
35
+ () => {
36
+ // `identity` is the leaf reader of a backend whose leaf *is* the
37
+ // symbol; a pair's reader takes its first half. Same positions, same
38
+ // symbols.
39
+ /** @type {(leaf: number) => number} */
40
+ const symbolOf = identity
41
+ assertEq(symbolAt(symbolOf)([65, 66], 0), 65)
42
+ assertEq(symbolAt(metaSymbolOf)(withMeta, 0), 65)
43
+ assertEq(symbolAt(metaSymbolOf)(withMeta, 1), 66)
44
+ },
45
+ () => {
46
+ // The one synthesized end-of-input symbol sits at the physical end,
47
+ // for either leaf shape.
48
+ /** @type {(leaf: number) => number} */
49
+ const symbolOf = identity
50
+ assertEq(symbolAt(symbolOf)([65, 66], 2), eofSymbol)
51
+ assertEq(symbolAt(metaSymbolOf)(withMeta, 2), eofSymbol)
52
+ assertEq(symbolAt(symbolOf)([], 0), eofSymbol)
53
+ },
54
+ ],
55
+ physicalIdx: () => {
56
+ const physical = physicalIdx(2)
57
+ assertEq(physical(0), 0)
58
+ assertEq(physical(2), 2)
59
+ // Consuming the end-of-input symbol moves the cursor past the physical
60
+ // end, and both cursors report the same public index — which is what
61
+ // keeps a public position physical.
62
+ assertEq(physical(3), 2)
63
+ },
64
+ mrSuccess: () => {
65
+ assertEq(
66
+ JSON.stringify(mrSuccess('some', [65], 1)),
67
+ '{"ast":{"tag":"some","sequence":[65]},"success":true,"pos":1}')
68
+ // The position type is the backend's own: `null` is how a predictive
69
+ // backend says it ran out of input.
70
+ assertEq(
71
+ JSON.stringify(mrSuccess(undefined, [], null)),
72
+ '{"ast":{"sequence":[]},"success":true,"pos":null}')
73
+ },
74
+ mrFail: () => {
75
+ assertEq(
76
+ JSON.stringify(mrFail(true, [], 0)),
77
+ '{"ast":{"tag":true,"sequence":[]},"success":false,"pos":0}')
78
+ },
79
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Type-level API for the layer every BNF matcher backend shares: the position
3
+ * it matches at, the AST it builds, and the result that pairs them.
4
+ *
5
+ * @module
6
+ */
7
+ /**
8
+ * Tag of an AST node: the variant branch that matched, `true` where a rule
9
+ * matched empty input without naming a branch, and `undefined` where the rule
10
+ * is not a choice at all.
11
+ */
12
+ export type AstTag = string | true | undefined;
13
+ /**
14
+ * An AST over leaves of type `L`. A backend picks `L` for what it keeps of a
15
+ * consumed symbol — the code point alone, or the code point with metadata.
16
+ */
17
+ export type Ast<L> = {
18
+ readonly tag: AstTag;
19
+ readonly sequence: AstSequence<L>;
20
+ };
21
+ /** The children of an {@link Ast} node: nested nodes and consumed leaves. */
22
+ export type AstSequence<L> = readonly (Ast<L> | L)[];
23
+ /**
24
+ * A match position over input of `length` leaves: `0 .. length` are the
25
+ * physical positions, and `length + 1` is where the one synthesized
26
+ * end-of-input symbol has been consumed.
27
+ *
28
+ * This is the complete cursor `(idx, eofConsumed)` of
29
+ * [the BNF contract](../README.md#logical-eof-in-parser-input) written as one
30
+ * number. `eofConsumed` can only be true at the physical end, so the pair and
31
+ * the extended position hold the same information — and being one number is
32
+ * what makes every ordering a backend needs a plain `<`, because consuming EOF
33
+ * *is* progress even though the public index does not move. A backend that
34
+ * treated it as no progress would loop forever on a repetition over a rule that
35
+ * can match EOF.
36
+ *
37
+ * Public positions are physical, so a cursor is converted back with
38
+ * `physicalIdx` before it leaves a backend.
39
+ */
40
+ export type Cursor = number;
41
+ /**
42
+ * A matcher's own result: the AST built so far, whether it matched, and where
43
+ * it stopped.
44
+ *
45
+ * `P` is the position type. A backend whose match always has one uses
46
+ * {@link Cursor}; one that also reports running out of input uses
47
+ * `Cursor | null`. Public results are each backend's own type — this is the
48
+ * shape they are built from, not the shape they return.
49
+ */
50
+ export type AstResult<L, P> = {
51
+ readonly ast: Ast<L>;
52
+ readonly success: boolean;
53
+ readonly pos: P;
54
+ };
@@ -12,6 +12,14 @@
12
12
  */
13
13
  import type { Tuple } from '../types/array/types.ts';
14
14
  import type { TerminalRange, Sequence, Rule, RangeVariant, None, Option, Repeat0Plus, Repeat1Plus, Join1Plus, Repeat } from './types.ts';
15
+ /**
16
+ * The logical end-of-input symbol.
17
+ *
18
+ * `-1` is outside the non-negative physical-symbol domain, so no alphabet
19
+ * adapter can produce it and no ordinary symbol has to be reserved for it.
20
+ * Parser backends synthesize it exactly once, after the physical input.
21
+ */
22
+ export declare const eofSymbol = -1;
15
23
  /** @type {(a: number, b: number) => TerminalRange} */
16
24
  export declare const rangeEncode: (a: number, b: number) => TerminalRange;
17
25
  /**
@@ -21,16 +29,17 @@ export declare const rangeEncode: (a: number, b: number) => TerminalRange;
21
29
  */
22
30
  export declare const oneEncode: (a: number) => TerminalRange;
23
31
  /**
24
- * End-of-file marker: `mask`, the single largest value the 24-bit symbol
25
- * space can hold (the top of `fullRange`). Deliberately outside Unicode
26
- * (`unicodeRange` tops out at `0x10FFFF`) so it can never collide with a
27
- * real code point.
32
+ * End-of-file marker: the singleton range of {@link eofSymbol}. Deliberately
33
+ * outside the ordinary symbol domain and so outside Unicode — so it can
34
+ * never collide with a real code point.
28
35
  *
29
36
  * @type {TerminalRange}
30
37
  */
31
38
  export declare const eof: TerminalRange;
32
39
  /**
33
- * Full 24-bit symbol range packed into a single {@link TerminalRange}.
40
+ * Every ordinary symbol packed into a single {@link TerminalRange}. EOF is not
41
+ * one of them, so complements over this range never include it.
42
+ *
34
43
  * @type {TerminalRange}
35
44
  */
36
45
  export declare const fullRange: TerminalRange;
@@ -44,7 +53,7 @@ export declare const unicodeRange: TerminalRange;
44
53
  */
45
54
  export declare const unicodeMax: string;
46
55
  /**
47
- * Decodes a packed range into `[start, end]` symbols.
56
+ * Decodes a packed range into `[start, end]` semantic symbols.
48
57
  *
49
58
  * @type {(r: number) => Tuple<2, number>}
50
59
  */
@@ -31,12 +31,52 @@ const offset = 24
31
31
 
32
32
  const mask = (1 << offset) - 1
33
33
 
34
- const isValid = contains(0, mask)
34
+ /**
35
+ * How many stored endpoint codes one 24-bit half holds: `2 ** 24`.
36
+ */
37
+ const terminalSize = mask + 1
38
+
39
+ /**
40
+ * The logical end-of-input symbol.
41
+ *
42
+ * `-1` is outside the non-negative physical-symbol domain, so no alphabet
43
+ * adapter can produce it and no ordinary symbol has to be reserved for it.
44
+ * Parser backends synthesize it exactly once, after the physical input.
45
+ */
46
+ export const eofSymbol = -1
47
+
48
+ /**
49
+ * The largest ordinary symbol, `2 ** 24 - 2`: the semantic domain is
50
+ * `[-1] | [0, 2 ** 24 - 2]`, exactly `2 ** 24` terminals, one per stored code.
51
+ */
52
+ const maxSymbol = mask - 1
53
+
54
+ const isValid = contains(eofSymbol, maxSymbol)
55
+
56
+ /**
57
+ * Semantic terminal to its stored 24-bit endpoint code. Branchless: EOF wraps
58
+ * to `2 ** 24 - 1` (the top of the stored space) and every ordinary symbol
59
+ * keeps its own value as its code.
60
+ *
61
+ * @type {(value: number) => number}
62
+ */
63
+ const encodeTerminal = value => (value + terminalSize) & mask
64
+
65
+ /**
66
+ * The inverse of `encodeTerminal`, also branchless.
67
+ *
68
+ * Stored codes are an implementation representation, not semantic terminal
69
+ * ordering — `2 ** 24 - 1` is the largest code but the smallest terminal — so
70
+ * range operations that care about ordering must compare decoded values.
71
+ *
72
+ * @type {(value: number) => number}
73
+ */
74
+ const decodeTerminal = value => ((value + 1) & mask) - 1
35
75
 
36
76
  /** @type {(a: number, b: number) => TerminalRange} */
37
77
  export const rangeEncode = (a, b) => {
38
78
  assert(isValid(a) && isValid(b) && a <= b)
39
- return Number((BigInt(a) << BigInt(offset)) | BigInt(b))
79
+ return Number((BigInt(encodeTerminal(a)) << BigInt(offset)) | BigInt(encodeTerminal(b)))
40
80
  }
41
81
 
42
82
  /**
@@ -47,20 +87,21 @@ export const rangeEncode = (a, b) => {
47
87
  export const oneEncode = a => rangeEncode(a, a)
48
88
 
49
89
  /**
50
- * End-of-file marker: `mask`, the single largest value the 24-bit symbol
51
- * space can hold (the top of `fullRange`). Deliberately outside Unicode
52
- * (`unicodeRange` tops out at `0x10FFFF`) so it can never collide with a
53
- * real code point.
90
+ * End-of-file marker: the singleton range of {@link eofSymbol}. Deliberately
91
+ * outside the ordinary symbol domain and so outside Unicode — so it can
92
+ * never collide with a real code point.
54
93
  *
55
94
  * @type {TerminalRange}
56
95
  */
57
- export const eof = oneEncode(mask)
96
+ export const eof = oneEncode(eofSymbol)
58
97
 
59
98
  /**
60
- * Full 24-bit symbol range packed into a single {@link TerminalRange}.
99
+ * Every ordinary symbol packed into a single {@link TerminalRange}. EOF is not
100
+ * one of them, so complements over this range never include it.
101
+ *
61
102
  * @type {TerminalRange}
62
103
  */
63
- export const fullRange = 0x000000_FFFFFF
104
+ export const fullRange = rangeEncode(0, maxSymbol)
64
105
 
65
106
  /**
66
107
  * Unicode scalar value range packed into a single {@link TerminalRange}.
@@ -74,12 +115,12 @@ export const unicodeRange = 0x000000_10FFFF
74
115
  export const unicodeMax = codePointListToString([0x10FFFF])
75
116
 
76
117
  /**
77
- * Decodes a packed range into `[start, end]` symbols.
118
+ * Decodes a packed range into `[start, end]` semantic symbols.
78
119
  *
79
120
  * @type {(r: number) => Tuple<2, number>}
80
121
  */
81
122
  export const rangeDecode = r =>
82
- [Number(BigInt(r) >> BigInt(offset)), r & mask]
123
+ [decodeTerminal(Number(BigInt(r) >> BigInt(offset))), decodeTerminal(r & mask)]
83
124
 
84
125
  const mapOneEncode = map(oneEncode)
85
126
 
@@ -9,6 +9,8 @@ export declare const proof: {
9
9
  rangeEncodeInvalid: (() => void)[];
10
10
  rangeInvalid: (() => void)[];
11
11
  };
12
+ terminal: (() => void)[];
13
+ complement: (() => void)[];
12
14
  str: (() => void)[];
13
15
  set: () => void;
14
16
  commaJoin0Plus: () => void;
@@ -4,8 +4,18 @@
4
4
  * @import { Rule } from './types.ts'
5
5
  */
6
6
 
7
- import { assert, assertEq } from '../asserts/module.f.mjs'
8
7
  import {
8
+ assert,
9
+ assertEq,
10
+ assertStructurallySame,
11
+ } from '../asserts/module.f.mjs'
12
+ import {
13
+ eof,
14
+ eofSymbol,
15
+ fullRange,
16
+ not,
17
+ notSet,
18
+ rangeDecode,
9
19
  rangeEncode,
10
20
  str,
11
21
  set,
@@ -15,8 +25,14 @@ import {
15
25
  oneEncode,
16
26
  repeat1Plus,
17
27
  } from './module.f.mjs'
28
+ import { definedValues } from '../types/object/module.f.mjs'
18
29
  import { classic, deterministic } from './testlib.f.mjs'
19
30
 
31
+ // The last ordinary symbol, `2 ** 24 - 2`. Written out because the range codec
32
+ // is what these tests check: deriving it from the codec would move both sides
33
+ // of every assertion together.
34
+ const maxSymbol = 0xFFFFFE
35
+
20
36
  export const proof = {
21
37
  test: () => {
22
38
  classic()
@@ -24,8 +40,14 @@ export const proof = {
24
40
  },
25
41
  throw: {
26
42
  rangeEncodeInvalid: [
27
- () => { rangeEncode(-1, 0) },
28
- () => { rangeEncode(0, -1) },
43
+ // one below `eofSymbol`, the smallest semantic terminal
44
+ () => { rangeEncode(-2, 0) },
45
+ () => { rangeEncode(0, -2) },
46
+ // one above the largest ordinary symbol: `2 ** 24 - 1` is EOF's
47
+ // stored code, not a terminal of its own
48
+ () => { rangeEncode(0, maxSymbol + 1) },
49
+ // semantic ordering, so EOF is below every ordinary symbol
50
+ () => { rangeEncode(0, eofSymbol) },
29
51
  () => { rangeEncode(5, 3) },
30
52
  ],
31
53
  rangeInvalid: [
@@ -33,6 +55,60 @@ export const proof = {
33
55
  () => { range('abc') },
34
56
  ],
35
57
  },
58
+ terminal: [
59
+ () => {
60
+ // EOF is the singleton `[-1, -1]` and keeps the stored code
61
+ // `2 ** 24 - 1` at both endpoints.
62
+ assertEq(eof, 0xFFFFFF_FFFFFF)
63
+ const [a, b] = rangeDecode(eof)
64
+ assertEq(a, eofSymbol)
65
+ assertEq(b, eofSymbol)
66
+ },
67
+ () => {
68
+ // `fullRange` holds the ordinary symbols only.
69
+ const [a, b] = rangeDecode(fullRange)
70
+ assertEq(a, 0)
71
+ assertEq(b, maxSymbol)
72
+ },
73
+ () => {
74
+ // Round trips over the whole semantic domain: EOF, the ordinary
75
+ // minimum, an ordinary symbol, and the ordinary maximum.
76
+ for (const v of [eofSymbol, 0, 0x10FFFF, maxSymbol]) {
77
+ const [a, b] = rangeDecode(oneEncode(v))
78
+ assertEq(a, v)
79
+ assertEq(b, v)
80
+ }
81
+ },
82
+ () => {
83
+ // Ordinary symbols keep their own value as their stored code, so a
84
+ // packed literal still reads as its endpoints.
85
+ assertEq(oneEncode(0x20), 0x000020_000020)
86
+ const [a, b] = rangeDecode(0x000030_000039)
87
+ assertEq(a, 0x30)
88
+ assertEq(b, 0x39)
89
+ },
90
+ () => {
91
+ // A range may span EOF and ordinary symbols; the endpoints are
92
+ // ordered semantically, not by stored code.
93
+ const [a, b] = rangeDecode(rangeEncode(eofSymbol, maxSymbol))
94
+ assertEq(a, eofSymbol)
95
+ assertEq(b, maxSymbol)
96
+ },
97
+ ],
98
+ complement: [
99
+ () => {
100
+ // The complement of nothing over `fullRange` is `fullRange`: EOF is
101
+ // not an ordinary symbol, so no complement can produce it.
102
+ const r = definedValues(not({}))
103
+ assertEq(r.length, 1)
104
+ assertEq(r[0], fullRange)
105
+ },
106
+ () => {
107
+ const r = definedValues(notSet('a'))
108
+ const decoded = r.map(rangeDecode)
109
+ assertStructurallySame(decoded, [[0, 0x60], [0x62, maxSymbol]])
110
+ },
111
+ ],
36
112
  str: [
37
113
  () => {
38
114
  const result = str('a')