functionalscript 0.44.0 → 0.45.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 (453) hide show
  1. package/fjs/asn.1/proof.f.d.mts +5 -0
  2. package/fjs/asn.1/proof.f.mjs +15 -3
  3. package/fjs/asserts/module.f.d.mts +14 -0
  4. package/fjs/asserts/module.f.mjs +20 -0
  5. package/fjs/asserts/proof.f.d.mts +3 -0
  6. package/fjs/asserts/proof.f.mjs +15 -1
  7. package/fjs/basen/base128/proof.f.d.mts +3 -1
  8. package/fjs/basen/base128/proof.f.mjs +3 -1
  9. package/fjs/basen/base64/module.f.mjs +7 -3
  10. package/fjs/basen/base64/proof.f.d.mts +3 -1
  11. package/fjs/basen/base64/proof.f.mjs +7 -4
  12. package/fjs/basen/cbase32/proof.f.d.mts +3 -1
  13. package/fjs/basen/cbase32/proof.f.mjs +3 -1
  14. package/fjs/bnf/data/proof.f.mjs +0 -1
  15. package/fjs/bnf/descent/module.f.d.mts +17 -2
  16. package/fjs/bnf/descent/module.f.mjs +118 -41
  17. package/fjs/bnf/descent/proof.f.d.mts +1 -0
  18. package/fjs/bnf/descent/proof.f.mjs +77 -1
  19. package/fjs/bnf/descent/types.d.ts +12 -4
  20. package/fjs/bnf/ll1/module.f.d.mts +28 -2
  21. package/fjs/bnf/ll1/module.f.mjs +180 -38
  22. package/fjs/bnf/ll1/proof.f.d.mts +2 -0
  23. package/fjs/bnf/ll1/proof.f.mjs +62 -1
  24. package/fjs/bnf/ll1/types.d.ts +14 -8
  25. package/fjs/bnf/module.f.d.mts +15 -6
  26. package/fjs/bnf/module.f.mjs +52 -11
  27. package/fjs/bnf/proof.f.d.mts +2 -0
  28. package/fjs/bnf/proof.f.mjs +79 -3
  29. package/fjs/bnf/token_symbol/module.f.d.mts +4 -3
  30. package/fjs/bnf/token_symbol/module.f.mjs +7 -6
  31. package/fjs/bnf/token_symbol/proof.f.mjs +5 -2
  32. package/fjs/bnf/token_symbol/types.d.ts +2 -2
  33. package/fjs/bnf/types.d.ts +10 -3
  34. package/fjs/cas/cli/proof.f.d.mts +3 -1
  35. package/fjs/cas/cli/proof.f.mjs +3 -1
  36. package/fjs/cas/evo/module.f.d.mts +7 -13
  37. package/fjs/cas/evo/module.f.mjs +103 -96
  38. package/fjs/cas/evo/proof.f.mjs +6 -3
  39. package/fjs/cas/module.f.mjs +96 -109
  40. package/fjs/ci/common/module.f.d.mts +1 -1
  41. package/fjs/ci/common/module.f.mjs +1 -0
  42. package/fjs/ci/config/module.f.d.mts +2 -2
  43. package/fjs/ci/config/module.f.mjs +2 -2
  44. package/fjs/ci/nix/proof.f.d.mts +2 -0
  45. package/fjs/ci/nix/proof.f.mjs +2 -2
  46. package/fjs/ci/proof.f.d.mts +4 -2
  47. package/fjs/ci/proof.f.mjs +4 -3
  48. package/fjs/cli/proof.f.d.mts +4 -2
  49. package/fjs/cli/proof.f.mjs +4 -2
  50. package/fjs/common/monoid/module.f.d.mts +70 -12
  51. package/fjs/common/monoid/module.f.mjs +177 -14
  52. package/fjs/common/monoid/proof.f.d.mts +12 -1
  53. package/fjs/common/monoid/proof.f.mjs +88 -4
  54. package/fjs/common/monoid/types.d.ts +23 -0
  55. package/fjs/crypto/secp/proof.f.d.mts +3 -1
  56. package/fjs/crypto/secp/proof.f.mjs +3 -1
  57. package/fjs/crypto/sha2/proof.f.d.mts +3 -1
  58. package/fjs/crypto/sha2/proof.f.mjs +3 -1
  59. package/fjs/crypto/vdf/module.f.d.mts +23 -4
  60. package/fjs/crypto/vdf/module.f.mjs +6 -4
  61. package/fjs/dev/module.f.d.mts +5 -2
  62. package/fjs/dev/module.f.mjs +5 -4
  63. package/fjs/dev/package_json/module.f.d.mts +7 -0
  64. package/fjs/dev/package_json/module.f.mjs +10 -7
  65. package/fjs/dev/update/module.f.d.mts +3 -0
  66. package/fjs/dev/update/module.f.mjs +3 -2
  67. package/fjs/dev/update/proof.f.d.mts +3 -0
  68. package/fjs/dev/update/proof.f.mjs +1 -2
  69. package/fjs/djs/parser/module.f.d.mts +3 -0
  70. package/fjs/djs/parser/module.f.mjs +18 -0
  71. package/fjs/djs/parser/proof.f.d.mts +3 -0
  72. package/fjs/djs/parser/proof.f.mjs +13 -1
  73. package/fjs/djs/proof.f.d.mts +3 -0
  74. package/fjs/djs/proof.f.mjs +4 -1
  75. package/fjs/djs/serializer/module.f.mjs +5 -4
  76. package/fjs/djs/tokenizer/module.f.mjs +21 -13
  77. package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
  78. package/fjs/djs/tokenizer/proof.f.mjs +14 -2
  79. package/fjs/djs/transpiler/module.f.d.mts +1 -12
  80. package/fjs/djs/transpiler/module.f.mjs +1 -20
  81. package/fjs/djs/transpiler/types.d.ts +25 -0
  82. package/fjs/effects/eff/module.f.d.mts +10 -0
  83. package/fjs/effects/eff/module.f.mjs +4 -2
  84. package/fjs/effects/eff/proof.f.d.mts +3 -0
  85. package/fjs/effects/eff/proof.f.mjs +4 -1
  86. package/fjs/effects/list/module.f.d.mts +10 -2
  87. package/fjs/effects/list/module.f.mjs +4 -2
  88. package/fjs/effects/memory/module.f.d.mts +4 -2
  89. package/fjs/effects/memory/module.f.mjs +4 -3
  90. package/fjs/effects/memory/proof.f.d.mts +4 -0
  91. package/fjs/effects/memory/proof.f.mjs +5 -2
  92. package/fjs/effects/mock/module.f.d.mts +10 -2
  93. package/fjs/effects/mock/module.f.mjs +4 -2
  94. package/fjs/effects/module.d.mts +8 -0
  95. package/fjs/effects/module.f.d.mts +6 -4
  96. package/fjs/effects/module.f.mjs +6 -5
  97. package/fjs/effects/module.mjs +9 -1
  98. package/fjs/effects/node/memory/module.d.mts +3 -0
  99. package/fjs/effects/node/memory/module.mjs +3 -2
  100. package/fjs/effects/node/memory/proof.d.mts +2 -0
  101. package/fjs/effects/node/memory/proof.mjs +2 -1
  102. package/fjs/effects/node/module.d.mts +5 -0
  103. package/fjs/effects/node/module.f.d.mts +17 -12
  104. package/fjs/effects/node/module.f.mjs +6 -12
  105. package/fjs/effects/node/module.mjs +5 -17
  106. package/fjs/effects/node/virtual/module.f.d.mts +6 -3
  107. package/fjs/effects/node/virtual/module.f.mjs +6 -5
  108. package/fjs/effects/node/virtual/proof.f.d.mts +4 -1
  109. package/fjs/effects/node/virtual/proof.f.mjs +13 -1
  110. package/fjs/effects/proof.f.d.mts +3 -0
  111. package/fjs/effects/proof.f.mjs +4 -1
  112. package/fjs/emergent_testing/all.test.d.mts +8 -0
  113. package/fjs/emergent_testing/all.test.mjs +14 -0
  114. package/fjs/emergent_testing/module.f.d.mts +6 -1
  115. package/fjs/emergent_testing/module.f.mjs +40 -66
  116. package/fjs/emergent_testing/proof.f.mjs +5 -5
  117. package/fjs/fsc/bnf.f.d.mts +3 -0
  118. package/fjs/fsc/bnf.f.mjs +4 -1
  119. package/fjs/fsc/json.f.d.mts +3 -0
  120. package/fjs/fsc/json.f.mjs +4 -1
  121. package/fjs/fsc/module.f.d.mts +9 -0
  122. package/fjs/fsc/module.f.mjs +5 -3
  123. package/fjs/fsm/proof.f.d.mts +3 -0
  124. package/fjs/fsm/proof.f.mjs +4 -1
  125. package/fjs/js/tokenizer/module.f.d.mts +7 -0
  126. package/fjs/js/tokenizer/module.f.mjs +19 -55
  127. package/fjs/mcp/module.f.d.mts +36 -1
  128. package/fjs/mcp/module.f.mjs +9 -7
  129. package/fjs/mcp/proof.f.d.mts +11 -1
  130. package/fjs/mcp/proof.f.mjs +11 -18
  131. package/fjs/media/html/module.f.d.mts +12 -0
  132. package/fjs/media/html/module.f.mjs +6 -4
  133. package/fjs/media/html/proof.f.d.mts +3 -0
  134. package/fjs/media/html/proof.f.mjs +4 -1
  135. package/fjs/media/json/parser/module.f.d.mts +1 -1
  136. package/fjs/media/json/parser/module.f.mjs +25 -8
  137. package/fjs/media/json/parser/types.d.ts +5 -0
  138. package/fjs/media/json/rtti/proof.f.d.mts +3 -0
  139. package/fjs/media/json/rtti/proof.f.mjs +3 -3
  140. package/fjs/media/json/schema/module.f.d.mts +61 -27
  141. package/fjs/media/json/schema/module.f.mjs +228 -63
  142. package/fjs/media/json/schema/proof.f.d.mts +41 -0
  143. package/fjs/media/json/schema/proof.f.mjs +219 -7
  144. package/fjs/media/json/serializer/module.f.d.mts +13 -0
  145. package/fjs/media/json/serializer/module.f.mjs +7 -7
  146. package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
  147. package/fjs/media/json/tokenizer/module.f.mjs +24 -5
  148. package/fjs/media/nix/module.f.d.mts +13 -0
  149. package/fjs/media/nix/module.f.mjs +4 -2
  150. package/fjs/media/nix/proof.f.d.mts +3 -0
  151. package/fjs/media/nix/proof.f.mjs +4 -1
  152. package/fjs/media/revision/module.f.d.mts +5 -0
  153. package/fjs/media/revision/module.f.mjs +8 -11
  154. package/fjs/media/revision/proof.f.d.mts +4 -0
  155. package/fjs/media/revision/proof.f.mjs +5 -2
  156. package/fjs/media/type/module.f.d.mts +28 -11
  157. package/fjs/media/type/module.f.mjs +69 -85
  158. package/fjs/media/type/proof.f.d.mts +16 -0
  159. package/fjs/media/type/proof.f.mjs +44 -4
  160. package/fjs/module.d.mts +5 -0
  161. package/fjs/module.f.d.mts +8 -0
  162. package/fjs/module.f.mjs +4 -2
  163. package/fjs/module.mjs +6 -0
  164. package/fjs/path/module.f.d.mts +8 -0
  165. package/fjs/path/module.f.mjs +4 -2
  166. package/fjs/proof.f.d.mts +4 -0
  167. package/fjs/proof.f.mjs +5 -2
  168. package/fjs/protocol/json_rpc/module.f.d.mts +1 -1
  169. package/fjs/protocol/json_rpc/module.f.mjs +7 -4
  170. package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
  171. package/fjs/protocol/json_rpc/proof.f.mjs +22 -1
  172. package/fjs/protocol/mcp/proof.f.d.mts +4 -0
  173. package/fjs/protocol/mcp/proof.f.mjs +47 -24
  174. package/fjs/protocol/mcp/stdio/module.f.d.mts +2 -4
  175. package/fjs/protocol/mcp/stdio/module.f.mjs +1 -8
  176. package/fjs/protocol/mcp/stdio/proof.f.d.mts +1 -1
  177. package/fjs/protocol/mcp/stdio/proof.f.mjs +1 -1
  178. package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
  179. package/fjs/sul/id/module.f.d.mts +5 -0
  180. package/fjs/sul/id/module.f.mjs +5 -4
  181. package/fjs/sul/level/hash/module.f.d.mts +4 -1
  182. package/fjs/sul/level/hash/module.f.mjs +4 -3
  183. package/fjs/sul/level/hash/proof.f.d.mts +4 -0
  184. package/fjs/sul/level/hash/proof.f.mjs +5 -2
  185. package/fjs/sul/level/literal/module.f.d.mts +4 -1
  186. package/fjs/sul/level/literal/module.f.mjs +4 -3
  187. package/fjs/sul/level/literal/proof.f.d.mts +3 -0
  188. package/fjs/sul/level/literal/proof.f.mjs +4 -1
  189. package/fjs/sul/module.f.d.mts +5 -3
  190. package/fjs/sul/module.f.mjs +5 -4
  191. package/fjs/sul/proof.f.d.mts +4 -0
  192. package/fjs/sul/proof.f.mjs +5 -2
  193. package/fjs/text/ascii/module.f.d.mts +26 -0
  194. package/fjs/text/ascii/module.f.mjs +49 -1
  195. package/fjs/text/ascii/proof.f.d.mts +10 -0
  196. package/fjs/text/ascii/proof.f.mjs +33 -1
  197. package/fjs/text/code_point/module.f.d.mts +21 -3
  198. package/fjs/text/code_point/module.f.mjs +24 -8
  199. package/fjs/text/code_point/proof.f.d.mts +1 -0
  200. package/fjs/text/code_point/proof.f.mjs +28 -0
  201. package/fjs/text/module.f.d.mts +4 -2
  202. package/fjs/text/module.f.mjs +4 -3
  203. package/fjs/text/proof.f.d.mts +3 -0
  204. package/fjs/text/proof.f.mjs +4 -1
  205. package/fjs/text/sgr/module.f.d.mts +4 -1
  206. package/fjs/text/sgr/module.f.mjs +4 -3
  207. package/fjs/text/sgr/proof.f.d.mts +3 -0
  208. package/fjs/text/sgr/proof.f.mjs +4 -1
  209. package/fjs/text/utf16/module.f.d.mts +5 -1
  210. package/fjs/text/utf16/module.f.mjs +31 -33
  211. package/fjs/text/utf16/proof.f.d.mts +3 -1
  212. package/fjs/text/utf16/proof.f.mjs +18 -1
  213. package/fjs/text/utf8/module.f.d.mts +9 -5
  214. package/fjs/text/utf8/module.f.mjs +16 -18
  215. package/fjs/types/array/module.f.d.mts +2 -1
  216. package/fjs/types/array/module.f.mjs +2 -2
  217. package/fjs/types/bigfloat/module.f.d.mts +21 -1
  218. package/fjs/types/bigfloat/module.f.mjs +33 -7
  219. package/fjs/types/bigfloat/proof.f.d.mts +1 -0
  220. package/fjs/types/bigfloat/proof.f.mjs +46 -0
  221. package/fjs/types/bigint/module.f.d.mts +4 -0
  222. package/fjs/types/bigint/module.f.mjs +4 -3
  223. package/fjs/types/bit_vec/module.f.d.mts +10 -14
  224. package/fjs/types/bit_vec/module.f.mjs +61 -71
  225. package/fjs/types/bit_vec/proof.f.d.mts +6 -0
  226. package/fjs/types/bit_vec/proof.f.mjs +29 -3
  227. package/fjs/types/btree/find/module.f.d.mts +5 -1
  228. package/fjs/types/btree/find/module.f.mjs +5 -5
  229. package/fjs/types/btree/find/proof.f.d.mts +5 -1
  230. package/fjs/types/btree/find/proof.f.mjs +5 -3
  231. package/fjs/types/btree/module.f.d.mts +3 -0
  232. package/fjs/types/btree/module.f.mjs +3 -2
  233. package/fjs/types/btree/proof.f.d.mts +5 -1
  234. package/fjs/types/btree/proof.f.mjs +5 -3
  235. package/fjs/types/btree/remove/module.f.d.mts +11 -0
  236. package/fjs/types/btree/remove/module.f.mjs +9 -9
  237. package/fjs/types/btree/remove/proof.f.d.mts +3 -0
  238. package/fjs/types/btree/remove/proof.f.mjs +4 -1
  239. package/fjs/types/btree/set/module.f.d.mts +9 -0
  240. package/fjs/types/btree/set/module.f.mjs +5 -6
  241. package/fjs/types/btree/set/proof.f.d.mts +3 -0
  242. package/fjs/types/btree/set/proof.f.mjs +4 -1
  243. package/fjs/types/btree/types/module.f.d.mts +2 -1
  244. package/fjs/types/btree/types/module.f.mjs +2 -1
  245. package/fjs/types/byte_set/module.f.d.mts +10 -1
  246. package/fjs/types/byte_set/module.f.mjs +5 -3
  247. package/fjs/types/byte_set/proof.f.d.mts +3 -1
  248. package/fjs/types/byte_set/proof.f.mjs +3 -1
  249. package/fjs/types/function/compare/module.f.d.mts +3 -2
  250. package/fjs/types/function/compare/module.f.mjs +3 -2
  251. package/fjs/types/function/module.f.d.mts +8 -1
  252. package/fjs/types/function/module.f.mjs +8 -1
  253. package/fjs/types/function/operator/module.f.d.mts +2 -1
  254. package/fjs/types/function/operator/module.f.mjs +2 -2
  255. package/fjs/types/list/module.f.d.mts +9 -2
  256. package/fjs/types/list/module.f.mjs +5 -3
  257. package/fjs/types/list/proof.f.d.mts +4 -1
  258. package/fjs/types/list/proof.f.mjs +4 -2
  259. package/fjs/types/nibble_set/module.f.d.mts +2 -1
  260. package/fjs/types/nibble_set/module.f.mjs +2 -2
  261. package/fjs/types/nominal/module.f.d.mts +2 -1
  262. package/fjs/types/nominal/module.f.mjs +2 -1
  263. package/fjs/types/nullable/module.f.d.mts +8 -2
  264. package/fjs/types/nullable/module.f.mjs +4 -2
  265. package/fjs/types/number/module.f.d.mts +4 -0
  266. package/fjs/types/number/module.f.mjs +4 -3
  267. package/fjs/types/object/module.f.d.mts +14 -2
  268. package/fjs/types/object/module.f.mjs +15 -6
  269. package/fjs/types/object/proof.f.d.mts +5 -2
  270. package/fjs/types/object/proof.f.mjs +6 -3
  271. package/fjs/types/object/structurally_same/module.f.d.mts +39 -0
  272. package/fjs/types/object/structurally_same/module.f.mjs +59 -0
  273. package/fjs/types/object/structurally_same/proof.f.d.mts +6 -0
  274. package/fjs/types/object/structurally_same/proof.f.mjs +73 -0
  275. package/fjs/types/ordered_map/module.f.d.mts +5 -0
  276. package/fjs/types/ordered_map/module.f.mjs +5 -4
  277. package/fjs/types/ordered_map/proof.f.d.mts +3 -0
  278. package/fjs/types/ordered_map/proof.f.mjs +4 -1
  279. package/fjs/types/patricia_trie/module.f.d.mts +2 -1
  280. package/fjs/types/patricia_trie/module.f.mjs +2 -2
  281. package/fjs/types/patricia_trie/proof.f.d.mts +3 -0
  282. package/fjs/types/patricia_trie/proof.f.mjs +4 -1
  283. package/fjs/types/prime_field/module.f.d.mts +3 -1
  284. package/fjs/types/prime_field/module.f.mjs +3 -2
  285. package/fjs/types/range/module.f.d.mts +2 -1
  286. package/fjs/types/range/module.f.mjs +2 -2
  287. package/fjs/types/range_map/module.f.d.mts +6 -0
  288. package/fjs/types/range_map/module.f.mjs +6 -9
  289. package/fjs/types/range_map/proof.f.d.mts +5 -1
  290. package/fjs/types/range_map/proof.f.mjs +5 -3
  291. package/fjs/types/range_set/module.f.d.mts +5 -0
  292. package/fjs/types/range_set/module.f.mjs +1 -0
  293. package/fjs/types/range_set/proof.f.d.mts +3 -0
  294. package/fjs/types/range_set/proof.f.mjs +4 -1
  295. package/fjs/types/result/module.d.mts +8 -0
  296. package/fjs/types/result/module.f.d.mts +37 -7
  297. package/fjs/types/result/module.f.mjs +38 -8
  298. package/fjs/types/result/module.mjs +9 -1
  299. package/fjs/types/result/proof.f.d.mts +5 -0
  300. package/fjs/types/result/proof.f.mjs +22 -2
  301. package/fjs/types/rtti/common/module.f.d.mts +35 -2
  302. package/fjs/types/rtti/common/module.f.mjs +9 -7
  303. package/fjs/types/rtti/common/proof.f.d.mts +4 -0
  304. package/fjs/types/rtti/common/proof.f.mjs +5 -2
  305. package/fjs/types/rtti/data/module.f.d.mts +120 -0
  306. package/fjs/types/rtti/data/module.f.mjs +1030 -0
  307. package/fjs/types/rtti/data/proof.f.d.mts +75 -0
  308. package/fjs/types/rtti/data/proof.f.mjs +566 -0
  309. package/fjs/types/rtti/data/types.d.ts +83 -0
  310. package/fjs/types/rtti/module.f.d.mts +12 -5
  311. package/fjs/types/rtti/module.f.mjs +7 -5
  312. package/fjs/types/rtti/parse/module.f.d.mts +38 -0
  313. package/fjs/types/rtti/parse/module.f.mjs +9 -7
  314. package/fjs/types/rtti/parse/proof.f.mjs +18 -38
  315. package/fjs/types/rtti/proof.f.d.mts +3 -1
  316. package/fjs/types/rtti/proof.f.mjs +3 -1
  317. package/fjs/types/rtti/ts/module.f.d.mts +68 -9
  318. package/fjs/types/rtti/ts/module.f.mjs +262 -30
  319. package/fjs/types/rtti/ts/proof.f.d.mts +44 -0
  320. package/fjs/types/rtti/ts/proof.f.mjs +152 -4
  321. package/fjs/types/rtti/ts/types.d.ts +11 -0
  322. package/fjs/types/rtti/types.d.ts +40 -0
  323. package/fjs/types/rtti/validate/module.f.d.mts +36 -1
  324. package/fjs/types/rtti/validate/module.f.mjs +6 -4
  325. package/fjs/types/sorted_list/module.f.d.mts +4 -1
  326. package/fjs/types/sorted_list/module.f.mjs +21 -12
  327. package/fjs/types/sorted_list/proof.f.d.mts +3 -1
  328. package/fjs/types/sorted_list/proof.f.mjs +3 -1
  329. package/fjs/types/sorted_set/module.f.d.mts +31 -1
  330. package/fjs/types/sorted_set/module.f.mjs +4 -2
  331. package/fjs/types/sorted_set/proof.f.d.mts +3 -1
  332. package/fjs/types/sorted_set/proof.f.mjs +3 -1
  333. package/fjs/types/string/module.f.d.mts +4 -0
  334. package/fjs/types/string/module.f.mjs +4 -3
  335. package/fjs/types/string_set/module.f.d.mts +3 -1
  336. package/fjs/types/string_set/module.f.mjs +3 -2
  337. package/fjs/types/ts/module.f.d.mts +2 -0
  338. package/fjs/types/ts/module.f.mjs +3 -3
  339. package/fjs/types/ts/proof.f.d.mts +1 -0
  340. package/fjs/types/ts/proof.f.mjs +5 -0
  341. package/fjs/types/ts/types.d.ts +6 -1
  342. package/fjs/types/uint8array/module.f.d.mts +13 -2
  343. package/fjs/types/uint8array/module.f.mjs +20 -15
  344. package/fjs/website/module.f.d.mts +3 -0
  345. package/fjs/website/module.f.mjs +3 -2
  346. package/package.json +3 -3
  347. package/fjs/asn.1/types.js +0 -6
  348. package/fjs/asserts/types.js +0 -6
  349. package/fjs/basen/types.js +0 -6
  350. package/fjs/bnf/data/types.js +0 -6
  351. package/fjs/bnf/descent/types.js +0 -6
  352. package/fjs/bnf/ll1/types.js +0 -6
  353. package/fjs/bnf/token_symbol/types.js +0 -6
  354. package/fjs/bnf/types.js +0 -6
  355. package/fjs/cas/evo/types.js +0 -7
  356. package/fjs/cas/types.js +0 -6
  357. package/fjs/ci/common/types.js +0 -1
  358. package/fjs/ci/nix/types.js +0 -6
  359. package/fjs/ci/types.js +0 -6
  360. package/fjs/cli/types.js +0 -6
  361. package/fjs/common/monoid/types.js +0 -6
  362. package/fjs/crypto/pow/types.js +0 -6
  363. package/fjs/crypto/secp/types.js +0 -6
  364. package/fjs/crypto/sha2/types.js +0 -6
  365. package/fjs/crypto/sign/types.js +0 -6
  366. package/fjs/crypto/vdf/types.js +0 -6
  367. package/fjs/dev/types.js +0 -6
  368. package/fjs/djs/ast/types.js +0 -8
  369. package/fjs/djs/parser/types.js +0 -7
  370. package/fjs/djs/tokenizer/types.js +0 -7
  371. package/fjs/djs/types.js +0 -7
  372. package/fjs/effects/eff/types.js +0 -6
  373. package/fjs/effects/list/types.js +0 -6
  374. package/fjs/effects/memory/types.js +0 -6
  375. package/fjs/effects/mock/types.js +0 -6
  376. package/fjs/effects/node/types.js +0 -6
  377. package/fjs/effects/node/virtual/types.js +0 -7
  378. package/fjs/effects/types.js +0 -6
  379. package/fjs/emergent_testing/all.test.d.ts +0 -1
  380. package/fjs/emergent_testing/all.test.js +0 -5
  381. package/fjs/emergent_testing/scenarios/all.d.ts +0 -1
  382. package/fjs/emergent_testing/scenarios/all.js +0 -1
  383. package/fjs/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -6
  384. package/fjs/emergent_testing/scenarios/async-subtests.fail.js +0 -9
  385. package/fjs/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -6
  386. package/fjs/emergent_testing/scenarios/async-subtests.pass.js +0 -9
  387. package/fjs/emergent_testing/scenarios/async.fail.d.ts +0 -3
  388. package/fjs/emergent_testing/scenarios/async.fail.js +0 -6
  389. package/fjs/emergent_testing/scenarios/async.pass.d.ts +0 -3
  390. package/fjs/emergent_testing/scenarios/async.pass.js +0 -5
  391. package/fjs/emergent_testing/scenarios/fail.fail.d.ts +0 -3
  392. package/fjs/emergent_testing/scenarios/fail.fail.js +0 -3
  393. package/fjs/emergent_testing/scenarios/return-value.pass.d.ts +0 -3
  394. package/fjs/emergent_testing/scenarios/return-value.pass.js +0 -4
  395. package/fjs/emergent_testing/scenarios/thenable.pass.d.ts +0 -5
  396. package/fjs/emergent_testing/scenarios/thenable.pass.js +0 -11
  397. package/fjs/emergent_testing/scenarios/thenable2.pass.d.ts +0 -5
  398. package/fjs/emergent_testing/scenarios/thenable2.pass.js +0 -3
  399. package/fjs/emergent_testing/scenarios/throw.pass.d.ts +0 -5
  400. package/fjs/emergent_testing/scenarios/throw.pass.js +0 -3
  401. package/fjs/emergent_testing/types.js +0 -6
  402. package/fjs/js/tokenizer/types.js +0 -6
  403. package/fjs/media/html/types.js +0 -6
  404. package/fjs/media/json/parser/types.js +0 -6
  405. package/fjs/media/json/tokenizer/types.js +0 -6
  406. package/fjs/media/json/types.js +0 -13
  407. package/fjs/media/nix/types.js +0 -6
  408. package/fjs/media/revision/types.js +0 -8
  409. package/fjs/media/type/types.js +0 -6
  410. package/fjs/media/types.js +0 -7
  411. package/fjs/nanvm/types.js +0 -11
  412. package/fjs/protocol/json_rpc/types.js +0 -8
  413. package/fjs/protocol/mcp/types.js +0 -8
  414. package/fjs/sul/id/types.js +0 -6
  415. package/fjs/sul/level/hash/types.js +0 -6
  416. package/fjs/sul/level/literal/types.js +0 -6
  417. package/fjs/sul/types.js +0 -6
  418. package/fjs/text/sgr/types.js +0 -6
  419. package/fjs/text/types.js +0 -6
  420. package/fjs/text/utf16/types.js +0 -6
  421. package/fjs/text/utf8/types.js +0 -6
  422. package/fjs/types/array/types.js +0 -6
  423. package/fjs/types/bigfloat/types.js +0 -6
  424. package/fjs/types/bigint/types.js +0 -6
  425. package/fjs/types/bit_vec/types.js +0 -6
  426. package/fjs/types/btree/find/types.js +0 -6
  427. package/fjs/types/btree/types/types.js +0 -6
  428. package/fjs/types/byte_set/types.js +0 -6
  429. package/fjs/types/function/compare/types.js +0 -6
  430. package/fjs/types/function/operator/types.js +0 -6
  431. package/fjs/types/function/types.js +0 -6
  432. package/fjs/types/list/types.js +0 -6
  433. package/fjs/types/nibble_set/types.js +0 -6
  434. package/fjs/types/nominal/types.js +0 -6
  435. package/fjs/types/nullable/types.js +0 -6
  436. package/fjs/types/object/types.js +0 -8
  437. package/fjs/types/option/types.js +0 -6
  438. package/fjs/types/ordered_map/types.js +0 -6
  439. package/fjs/types/patricia_trie/types.js +0 -6
  440. package/fjs/types/phantom/types.js +0 -11
  441. package/fjs/types/prime_field/types.js +0 -6
  442. package/fjs/types/range/types.js +0 -6
  443. package/fjs/types/range_map/types.js +0 -6
  444. package/fjs/types/result/types.js +0 -6
  445. package/fjs/types/rtti/common/types.js +0 -1
  446. package/fjs/types/rtti/parse/types.js +0 -1
  447. package/fjs/types/rtti/ts/types.js +0 -1
  448. package/fjs/types/rtti/types.js +0 -1
  449. package/fjs/types/rtti/validate/types.js +0 -1
  450. package/fjs/types/sorted_list/types.js +0 -6
  451. package/fjs/types/sorted_set/types.js +0 -6
  452. package/fjs/types/string_set/types.js +0 -6
  453. package/fjs/types/ts/types.js +0 -8
@@ -1,3 +1,7 @@
1
+ /**
2
+ * @import { Vec } from '../types/bit_vec/types.ts'
3
+ * @import { SupportedRecord, ObjectIdentifier } from './types.ts'
4
+ */
1
5
  export declare const proof: {
2
6
  encodeSmall: () => void;
3
7
  encode7F: () => void;
@@ -38,6 +42,7 @@ export declare const proof: {
38
42
  integer: () => void;
39
43
  sequence: () => void;
40
44
  set: () => void;
45
+ objectIdentifier: () => void;
41
46
  };
42
47
  objectIdentifier: {
43
48
  simple: () => void;
@@ -1,6 +1,9 @@
1
- /** @import { Vec } from '../types/bit_vec/types.ts' */
2
- import { empty, isVec, length, msb, uint, unpack, vec, vec8 } from '../types/bit_vec/module.f.mjs'
1
+ /**
2
+ * @import { Vec } from '../types/bit_vec/types.ts'
3
+ * @import { SupportedRecord, ObjectIdentifier } from './types.ts'
4
+ */
3
5
 
6
+ import { empty, isVec, length, msb, uint, unpack, vec, vec8 } from '../types/bit_vec/module.f.mjs'
4
7
  import { asBase } from '../types/nominal/module.f.mjs'
5
8
 
6
9
  import {
@@ -15,10 +18,10 @@ import {
15
18
  octetString,
16
19
  boolean,
17
20
  constructedSet,
21
+ objectIdentifier,
18
22
  encodeObjectIdentifier,
19
23
  decodeObjectIdentifier,
20
24
  } from './module.f.mjs'
21
- /** @import { SupportedRecord, ObjectIdentifier } from './types.ts' */
22
25
 
23
26
  import { assert, assertEq } from '../asserts/module.f.mjs'
24
27
 
@@ -252,6 +255,15 @@ export const proof = {
252
255
  ])
253
256
  )
254
257
  },
258
+ objectIdentifier: () => {
259
+ // exercises the objectIdentifier case in recordToRaw/rawToRecord
260
+ // via the generic encode/decode dispatch (the objectIdentifier
261
+ // tests below only call encodeObjectIdentifier/decodeObjectIdentifier
262
+ // directly, never through decode()).
263
+ /** @type {SupportedRecord} */
264
+ const r = [objectIdentifier, [1n, 2n, 840n, 113549n]]
265
+ ch0(r, encode(r), empty)
266
+ },
255
267
  },
256
268
  objectIdentifier: {
257
269
  simple: () => {
@@ -24,6 +24,20 @@ export declare const assert: (v: boolean, msg?: unknown) => asserts v;
24
24
  * @type {<T>(...x: readonly[T, T, unknown?]) => void}
25
25
  */
26
26
  export declare const assertEq: <T>(...x: readonly [T, T, unknown?]) => void;
27
+ /**
28
+ * Asserts that `a` and `b` are structurally the same — equal leaves under the
29
+ * same shape, property order irrelevant — throwing `x` (the `[a, b]` pair, plus
30
+ * an optional third element used as an extra message) if they differ.
31
+ *
32
+ * This is the assertion to reach for when comparing two independently
33
+ * constructed values. `assertEq` is `===`, so it only ever answers "the same
34
+ * reference?" for objects, which is why proofs fell back to comparing
35
+ * `JSON.stringify` output; see `types/object/structurally_same/README.md` for
36
+ * why that is the wrong question and what this one does *not* cover.
37
+ *
38
+ * @type {(...x: readonly[unknown, unknown, unknown?]) => void}
39
+ */
40
+ export declare const assertStructurallySame: (...x: readonly [unknown, unknown, unknown?]) => void;
27
41
  /**
28
42
  * Asserts that `a` is neither `null` nor `undefined` and returns it,
29
43
  * narrowed to `T`.
@@ -4,6 +4,8 @@
4
4
  * @module
5
5
  */
6
6
 
7
+ import { structurallySame } from '../types/object/structurally_same/module.f.mjs'
8
+
7
9
  /**
8
10
  * Marks a code path as unimplemented. Always throws.
9
11
  * @type {() => never}
@@ -33,6 +35,24 @@ export const assertEq = (...x) => {
33
35
  assert(a === b, x)
34
36
  }
35
37
 
38
+ /**
39
+ * Asserts that `a` and `b` are structurally the same — equal leaves under the
40
+ * same shape, property order irrelevant — throwing `x` (the `[a, b]` pair, plus
41
+ * an optional third element used as an extra message) if they differ.
42
+ *
43
+ * This is the assertion to reach for when comparing two independently
44
+ * constructed values. `assertEq` is `===`, so it only ever answers "the same
45
+ * reference?" for objects, which is why proofs fell back to comparing
46
+ * `JSON.stringify` output; see `types/object/structurally_same/README.md` for
47
+ * why that is the wrong question and what this one does *not* cover.
48
+ *
49
+ * @type {(...x: readonly[unknown, unknown, unknown?]) => void}
50
+ */
51
+ export const assertStructurallySame = (...x) => {
52
+ const [a, b] = x
53
+ assert(structurallySame(a, b), x)
54
+ }
55
+
36
56
  /**
37
57
  * Asserts that `a` is neither `null` nor `undefined` and returns it,
38
58
  * narrowed to `T`.
@@ -1,9 +1,12 @@
1
1
  export declare const proof: {
2
2
  assertPassesOnTrue: () => void;
3
3
  assertEqPassesOnEqual: () => void;
4
+ assertStructurallySamePassesOnSame: () => void;
4
5
  throw: {
5
6
  assertEqThrowsOnUnequal: () => void;
6
7
  assertEqThrowsOnUnequal3: () => void;
8
+ assertStructurallySameThrowsOnDifferent: () => void;
9
+ assertStructurallySameThrowsOnDifferent3: () => void;
7
10
  assertThrowsDefaultMsg: () => void;
8
11
  assertThrowsCustomMsg: () => void;
9
12
  todoThrows: () => never;
@@ -1,4 +1,9 @@
1
- import { assert, assertEq, todo } from './module.f.mjs'
1
+ import {
2
+ assert,
3
+ assertEq,
4
+ assertStructurallySame,
5
+ todo,
6
+ } from './module.f.mjs'
2
7
 
3
8
  export const proof = {
4
9
  assertPassesOnTrue: () => {
@@ -9,9 +14,18 @@ export const proof = {
9
14
  assertEq(1, 1)
10
15
  assertEq('x', 'x')
11
16
  },
17
+ assertStructurallySamePassesOnSame: () => {
18
+ // the case `assertEq` cannot do: two separately built values
19
+ assertStructurallySame({ a: 1, b: [2, { c: 3 }] }, { b: [2, { c: 3 }], a: 1 })
20
+ assertStructurallySame(1, 1, 'with message')
21
+ },
12
22
  throw: {
13
23
  assertEqThrowsOnUnequal: () => assertEq(1, 2),
14
24
  assertEqThrowsOnUnequal3: () => assertEq(1, 2, "message"),
25
+ assertStructurallySameThrowsOnDifferent:
26
+ () => assertStructurallySame({ a: 1 }, { a: 2 }),
27
+ assertStructurallySameThrowsOnDifferent3:
28
+ () => assertStructurallySame({ a: 1 }, { a: 2 }, 'message'),
15
29
  assertThrowsDefaultMsg: () => assert(false),
16
30
  assertThrowsCustomMsg: () => assert(false, 'oops'),
17
31
  todoThrows: () => todo(),
@@ -1,2 +1,4 @@
1
- /** @import { Vec } from '../../types/bit_vec/types.ts' */
1
+ /**
2
+ * @import { Vec } from '../../types/bit_vec/types.ts'
3
+ */
2
4
  export declare const proof: () => void;
@@ -1,4 +1,6 @@
1
- /** @import { Vec } from '../../types/bit_vec/types.ts' */
1
+ /**
2
+ * @import { Vec } from '../../types/bit_vec/types.ts'
3
+ */
2
4
 
3
5
  import { empty, vec, vec8 } from '../../types/bit_vec/module.f.mjs'
4
6
  import { asBase } from '../../types/nominal/module.f.mjs'
@@ -7,7 +7,7 @@
7
7
  * @import { Nullable } from '../../types/nullable/types.ts'
8
8
  */
9
9
 
10
- import { msb, length, vec, maxLength } from '../../types/bit_vec/module.f.mjs'
10
+ import { msb, length, vec } from '../../types/bit_vec/module.f.mjs'
11
11
  import { baseN } from "../module.f.mjs"
12
12
 
13
13
  const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
@@ -61,8 +61,12 @@ export const decode = input => {
61
61
  const lastChunk = stringToVec(body.slice(body.length - 1))
62
62
  if (lastChunk === null) { return null }
63
63
 
64
- if (length(head) + realBits > maxLength) { return null }
65
-
64
+ // No `head`/`realBits` overflow check is needed here: `head` is built
65
+ // from whole 6-bit chunks, so its length is always a multiple of 6, and
66
+ // the largest such length `stringToVec` can return without itself
67
+ // failing is `maxLength - (maxLength % 6)` = `maxLength - 4`. Adding
68
+ // `realBits` (at most 4, when `padChars` is 1) reaches `maxLength`
69
+ // exactly and never exceeds it.
66
70
  const [kept, pad] = popFront(realBits)(lastChunk)
67
71
  // Padding bits must be zero (RFC 4648 §3.5).
68
72
  if (pad !== vec(removeBits)(0n)) { return null }
@@ -1,4 +1,6 @@
1
- /** @import { Vec } from '../../types/bit_vec/types.ts' */
1
+ /**
2
+ * @import { Vec } from '../../types/bit_vec/types.ts'
3
+ */
2
4
  export declare const proof: {
3
5
  empty: () => void;
4
6
  oneByte: () => void;
@@ -1,4 +1,6 @@
1
- /** @import { Vec } from '../../types/bit_vec/types.ts' */
1
+ /**
2
+ * @import { Vec } from '../../types/bit_vec/types.ts'
3
+ */
2
4
 
3
5
  import { assertEq } from '../../asserts/module.f.mjs'
4
6
  import { empty, vec, repeat, vec8, maxLength } from '../../types/bit_vec/module.f.mjs'
@@ -100,9 +102,10 @@ export const proof = {
100
102
  // ...and an invalid final character (the one holding the padding
101
103
  // bits) must be rejected via the last-character decode.
102
104
  assertEq(decode('A!=='), null)
103
- // Same as `decodeOverflow`, but with a padded tail so it's the
104
- // padded branch that measures the result against `maxLength` and
105
- // rejects it.
105
+ // Same as `decodeOverflow`, but with a padded tail: `head` (all
106
+ // characters but the last) is still over `maxLength` on its own, so
107
+ // this is rejected by `head`'s own `stringToVec` overflow check, not
108
+ // by a separate `head`-plus-`realBits` measurement.
106
109
  assertEq(decode('A'.repeat(174_764) + '='), null)
107
110
  },
108
111
  encodeAtMaxLengthSucceeds: () => {
@@ -1,4 +1,6 @@
1
- /** @import { Vec } from '../../types/bit_vec/types.ts' */
1
+ /**
2
+ * @import { Vec } from '../../types/bit_vec/types.ts'
3
+ */
2
4
  export declare const proof: {
3
5
  roundtrip5x: () => void;
4
6
  roundtrip: () => void;
@@ -1,4 +1,6 @@
1
- /** @import { Vec } from '../../types/bit_vec/types.ts' */
1
+ /**
2
+ * @import { Vec } from '../../types/bit_vec/types.ts'
3
+ */
2
4
 
3
5
  import { empty, vec } from '../../types/bit_vec/module.f.mjs'
4
6
  import { cBase32ToVec, cBase32ToVec5x, vec5xToCBase32, vecToCBase32 } from './module.f.mjs'
@@ -9,7 +9,6 @@ import { sort } from '../../types/object/module.f.mjs'
9
9
  import { oneEncode, option, range, rangeDecode, repeat0Plus, set } from '../module.f.mjs'
10
10
  import { emptyTagMap, toData } from './module.f.mjs'
11
11
  import { assertEq } from '../../asserts/module.f.mjs'
12
-
13
12
  import { stringify } from '../../media/json/module.f.mjs'
14
13
  import { classic, deterministic } from '../testlib.f.mjs'
15
14
 
@@ -7,6 +7,10 @@
7
7
  * AST ({@link AstRuleMeta}). Nullability (which rule can match empty input) is
8
8
  * computed once by {@link emptyTagMap} in `fjs/bnf/data`.
9
9
  *
10
+ * The caller passes physical symbols only; the matcher synthesizes the one
11
+ * logical EOF ({@link eofSymbol}) after them, so a grammar can require the end
12
+ * of input with the `eof` terminal.
13
+ *
10
14
  * A failed result also carries a {@link DescentFailure}: the furthest position a
11
15
  * terminal was rejected at, which — unlike the result's own index — never
12
16
  * rewinds and is what diagnostics should be built from.
@@ -18,10 +22,21 @@
18
22
  * @import { TerminalRange } from '../types.ts'
19
23
  * @import { Rule as DataRule, Sequence } from '../data/types.ts'
20
24
  * @import { Rule as FRule } from '../types.ts'
21
- * @import { AstTag, AstSequenceMeta, DescentFailure, DescentMatch, DescentMatchResult, DescentMatchRule } from './types.ts'
25
+ * @import { AstRuleMeta, AstTag, AstSequenceMeta, CodePointMeta, DescentFailure, DescentMatch, DescentMatchResult, DescentMatchRule } from './types.ts'
22
26
  */
27
+ import type { TerminalRange } from '../types.ts';
23
28
  import type { Rule as FRule } from '../types.ts';
24
- import type { DescentMatch } from './types.ts';
29
+ import type { AstRuleMeta, DescentMatch } from './types.ts';
30
+ export type _Cursor = number;
31
+ export type _Failure = {
32
+ readonly pos: _Cursor;
33
+ readonly expected: readonly TerminalRange[];
34
+ };
35
+ export type _Result<T> = {
36
+ readonly ast: AstRuleMeta<T>;
37
+ readonly success: boolean;
38
+ readonly pos: _Cursor;
39
+ };
25
40
  /**
26
41
  * Creates a recursive descent parser that preserves metadata for each consumed
27
42
  * code point.
@@ -7,6 +7,10 @@
7
7
  * AST ({@link AstRuleMeta}). Nullability (which rule can match empty input) is
8
8
  * computed once by {@link emptyTagMap} in `fjs/bnf/data`.
9
9
  *
10
+ * The caller passes physical symbols only; the matcher synthesizes the one
11
+ * logical EOF ({@link eofSymbol}) after them, so a grammar can require the end
12
+ * of input with the `eof` terminal.
13
+ *
10
14
  * A failed result also carries a {@link DescentFailure}: the furthest position a
11
15
  * terminal was rejected at, which — unlike the result's own index — never
12
16
  * rewinds and is what diagnostics should be built from.
@@ -18,25 +22,89 @@
18
22
  * @import { TerminalRange } from '../types.ts'
19
23
  * @import { Rule as DataRule, Sequence } from '../data/types.ts'
20
24
  * @import { Rule as FRule } from '../types.ts'
21
- * @import { AstTag, AstSequenceMeta, DescentFailure, DescentMatch, DescentMatchResult, DescentMatchRule } from './types.ts'
25
+ * @import { AstRuleMeta, AstTag, AstSequenceMeta, CodePointMeta, DescentFailure, DescentMatch, DescentMatchResult, DescentMatchRule } from './types.ts'
22
26
  */
23
27
 
24
- import { rangeDecode } from '../module.f.mjs'
28
+ import { eofSymbol, rangeDecode } from '../module.f.mjs'
25
29
  import { contains as rangeContains } from '../../types/range/module.f.mjs'
26
30
  import { definedEntries } from '../../types/object/module.f.mjs'
27
31
  import { emptyTagMap, toData } from '../data/module.f.mjs'
28
32
 
33
+ /**
34
+ * A match position that includes EOF consumption: `0 .. cp.length` are the
35
+ * physical positions, and `cp.length + 1` is where the one synthesized EOF has
36
+ * been consumed.
37
+ *
38
+ * This is the complete cursor the design calls `(idx, eofConsumed)`, written as
39
+ * one number: `eofConsumed` can only be true at the physical end, so the pair
40
+ * and the extended position hold the same information, and comparing cursors
41
+ * compares progress — consuming EOF *is* progress even though the public index
42
+ * does not move.
43
+ *
44
+ * @typedef {number} _Cursor
45
+ */
46
+
47
+ /**
48
+ * The furthest-failure record while matching, positioned by the complete
49
+ * cursor. {@link DescentFailure} is its public, physically-positioned form.
50
+ *
51
+ * @typedef {{
52
+ * readonly pos: _Cursor
53
+ * readonly expected: readonly TerminalRange[]
54
+ * }} _Failure
55
+ */
56
+
57
+ /**
58
+ * The machine's own result: a {@link DescentMatchResult} positioned by the
59
+ * complete cursor, and with no failure record — that one is tracked per match
60
+ * rather than per frame.
61
+ *
62
+ * @template T
63
+ * @typedef {{
64
+ * readonly ast: AstRuleMeta<T>
65
+ * readonly success: boolean
66
+ * readonly pos: _Cursor
67
+ * }} _Result
68
+ */
69
+
70
+ /**
71
+ * The public, physical index of a cursor. Consuming EOF moves the cursor past
72
+ * the physical end, and both cursors report `input.length`.
73
+ *
74
+ * @type {(length: number) => (pos: _Cursor) => number}
75
+ */
76
+ const physicalIdx = length => pos => Math.min(pos, length)
77
+
78
+ /**
79
+ * The semantic symbol a cursor points at: a code point inside the physical
80
+ * input, and the synthesized {@link eofSymbol} at its end. Only meaningful
81
+ * where the cursor still has a symbol, `pos <= cp.length`.
82
+ *
83
+ * @type {<T>(cp: readonly CodePointMeta<T>[], pos: _Cursor) => number}
84
+ */
85
+ const symbolAt = (cp, pos) => pos < cp.length ? cp[pos][0] : eofSymbol
86
+
87
+ /**
88
+ * What consuming the symbol at a cursor contributes to the AST: the code point
89
+ * with its metadata, and nothing for the synthesized EOF — it has no physical
90
+ * source element.
91
+ *
92
+ * @type {<T>(cp: readonly CodePointMeta<T>[], pos: _Cursor) => AstSequenceMeta<T>}
93
+ */
94
+ const leafAt = (cp, pos) => pos < cp.length ? [cp[pos]] : []
95
+
29
96
  /**
30
97
  * Folds one rejected terminal into the furthest-failure record: further along
31
- * replaces, the same position accumulates (ignoring repeats), earlier is
32
- * discarded.
98
+ * replaces, the same cursor accumulates (ignoring repeats), earlier is
99
+ * discarded. The comparison is on the complete cursor, so a failure after EOF
100
+ * was consumed is further than one at the same physical index before it.
33
101
  *
34
- * @type {(failure: DescentFailure, idx: number, terminal: TerminalRange) => DescentFailure}
102
+ * @type {(failure: _Failure, pos: _Cursor, terminal: TerminalRange) => _Failure}
35
103
  */
36
- const recordFailure = (failure, idx, terminal) => {
37
- if (idx > failure.idx) { return { idx, expected: [terminal] } }
38
- if (idx < failure.idx || failure.expected.includes(terminal)) { return failure }
39
- return { idx, expected: [...failure.expected, terminal] }
104
+ const recordFailure = (failure, pos, terminal) => {
105
+ if (pos > failure.pos) { return { pos, expected: [terminal] } }
106
+ if (pos < failure.pos || failure.expected.includes(terminal)) { return failure }
107
+ return { pos, expected: [...failure.expected, terminal] }
40
108
  }
41
109
 
42
110
  /**
@@ -51,6 +119,11 @@ export const descentParser = fr => {
51
119
  const data = toData(fr)
52
120
  const emptyTags = emptyTagMap(data[0])
53
121
 
122
+ /** @type {(tag: AstTag, sequence: AstSequenceMeta<T>, pos: _Cursor) => _Result<T>} */
123
+ const mrSuccess = (tag, sequence, pos) => ({ ast: {tag, sequence}, success: true, pos })
124
+ /** @type {(tag: AstTag, sequence: AstSequenceMeta<T>, pos: _Cursor) => _Result<T>} */
125
+ const mrFail = (tag, sequence, pos) => ({ ast: {tag, sequence}, success: false, pos })
126
+
54
127
  // A suspended sequence match: items[itemIndex] is being matched by the current
55
128
  // task; `seq` holds the ASTs of the items already matched.
56
129
  /**
@@ -59,7 +132,7 @@ export const descentParser = fr => {
59
132
  * readonly tag: AstTag
60
133
  * readonly items: Sequence
61
134
  * readonly itemIndex: number
62
- * readonly startIdx: number
135
+ * readonly startPos: _Cursor
63
136
  * readonly seq: AstSequenceMeta<T>
64
137
  * }} _SeqFrame
65
138
  */
@@ -72,8 +145,8 @@ export const descentParser = fr => {
72
145
  * readonly kind: 'variant'
73
146
  * readonly entries: readonly (readonly [string, string])[]
74
147
  * readonly entryIndex: number
75
- * readonly idx: number
76
- * readonly emptyResult: DescentMatchResult<T>
148
+ * readonly pos: _Cursor
149
+ * readonly emptyResult: _Result<T>
77
150
  * }} _VariantFrame
78
151
  */
79
152
 
@@ -93,7 +166,7 @@ export const descentParser = fr => {
93
166
  * @typedef {{
94
167
  * readonly name: string
95
168
  * readonly tag: AstTag
96
- * readonly idx: number
169
+ * readonly pos: _Cursor
97
170
  * }} _Task
98
171
  */
99
172
 
@@ -104,29 +177,26 @@ export const descentParser = fr => {
104
177
  // grammar recursion depth — right-recursive rules (e.g. repeat0Plus chains) no longer
105
178
  // overflow on long input (see the longInput proof group).
106
179
  /** @type {DescentMatchRule<T>} */
107
- const f = (name, tag, cp, idx) => {
108
- /** @type {(tag: AstTag, sequence: AstSequenceMeta<T>, idx: number) => DescentMatchResult<T>} */
109
- const mrSuccess = (tag, sequence, idx) => ({ ast: {tag, sequence}, success: true, idx })
110
- /** @type {(tag: AstTag, sequence: AstSequenceMeta<T>, idx: number) => DescentMatchResult<T>} */
111
- const mrFail = (tag, sequence, idx) => ({ ast: {tag, sequence}, success: false, idx })
180
+ const f = (name, tag, cp, startPos) => {
181
+ const physical = physicalIdx(cp.length)
112
182
 
113
183
  /** @type {_Stack} */
114
184
  let stack = null
115
185
  /** @type {_Task | null} */
116
- let task = { name, tag, idx }
117
- /** @type {DescentMatchResult<T>} */
118
- let result = mrFail(undefined, [], idx)
186
+ let task = { name, tag, pos: startPos }
187
+ /** @type {_Result<T>} */
188
+ let result = mrFail(undefined, [], startPos)
119
189
  // High-water mark across the whole match, so it survives the rewinds a
120
190
  // failing sequence item does to `result`.
121
- /** @type {DescentFailure} */
122
- let furthest = { idx: 0, expected: [] }
191
+ /** @type {_Failure} */
192
+ let furthest = { pos: 0, expected: [] }
123
193
 
124
194
  while (true) {
125
195
  if (task !== null) {
126
196
  // The explicit annotation cuts a control-flow inference cycle (TS7022):
127
197
  // `name`'s narrowed type feeds `rule`, whose type would otherwise feed the
128
198
  // later `task` assignments that `name`'s narrowing depends on.
129
- const { name, tag, idx } = /** @type {_Task} */ (task)
199
+ const { name, tag, pos } = /** @type {_Task} */ (task)
130
200
  task = null
131
201
  /** @type {DataRule} */
132
202
  const rule = data[0][name]
@@ -134,67 +204,74 @@ export const descentParser = fr => {
134
204
  // No nullable case: `emptyTagOf` in `bnf/data` returns `undefined`
135
205
  // for every terminal, so `emptyTags[name]` here is always
136
206
  // `undefined` and a terminal either consumes one symbol or fails.
137
- if (idx < cp.length && rangeContains(...rangeDecode(rule))(cp[idx][0])) {
138
- result = mrSuccess(tag, [cp[idx]], idx + 1)
207
+ // Past the synthesized EOF there is no symbol left to consume.
208
+ if (pos <= cp.length && rangeContains(...rangeDecode(rule))(symbolAt(cp, pos))) {
209
+ result = mrSuccess(tag, leafAt(cp, pos), pos + 1)
139
210
  } else {
140
211
  // The only place a terminal is rejected, so the only place
141
212
  // the furthest failure can advance.
142
- furthest = recordFailure(furthest, idx, rule)
143
- result = mrFail(undefined, [], idx)
213
+ furthest = recordFailure(furthest, pos, rule)
214
+ result = mrFail(undefined, [], pos)
144
215
  }
145
216
  } else if (rule instanceof Array) {
146
217
  if (rule.length === 0) {
147
- result = mrSuccess(tag, [], idx)
218
+ result = mrSuccess(tag, [], pos)
148
219
  } else {
149
- stack = { top: { kind: 'seq', tag, items: rule, itemIndex: 0, startIdx: idx, seq: [] }, rest: stack }
150
- task = { name: rule[0], tag: undefined, idx }
220
+ stack = { top: { kind: 'seq', tag, items: rule, itemIndex: 0, startPos: pos, seq: [] }, rest: stack }
221
+ task = { name: rule[0], tag: undefined, pos }
151
222
  }
152
223
  } else {
153
224
  const entries = definedEntries(rule)
154
225
  const emptyTag = emptyTags[name]
155
- const emptyResult = mrFail(emptyTag, [], idx)
226
+ const emptyResult = mrFail(emptyTag, [], pos)
156
227
  if (entries.length === 0) {
157
228
  result = emptyResult
158
229
  } else {
159
- stack = { top: { kind: 'variant', entries, entryIndex: 0, idx, emptyResult }, rest: stack }
230
+ stack = { top: { kind: 'variant', entries, entryIndex: 0, pos, emptyResult }, rest: stack }
160
231
  const [entryTag, entryName] = entries[0]
161
- task = { name: entryName, tag: entryTag, idx }
232
+ task = { name: entryName, tag: entryTag, pos }
162
233
  }
163
234
  }
164
235
  continue
165
236
  }
166
237
 
167
238
  if (stack === null) {
239
+ const { ast, success, pos } = result
240
+ /** @type {DescentMatchResult<T>} */
241
+ const mr = { ast, success, idx: physical(pos) }
168
242
  // A success has nothing to diagnose; only a failure carries it.
169
- return result.success ? result : { ...result, failure: furthest }
243
+ return success
244
+ ? mr
245
+ : { ...mr, failure: { idx: physical(furthest.pos), expected: furthest.expected } }
170
246
  }
171
247
  const frame = stack.top
172
248
  stack = stack.rest
173
249
 
174
250
  if (frame.kind === 'seq') {
175
- const { ast: astRule, success, idx: nidx } = result
251
+ const { ast: astRule, success, pos } = result
176
252
  if (success === false) {
177
- result = mrFail(frame.tag, [], frame.startIdx)
253
+ result = mrFail(frame.tag, [], frame.startPos)
178
254
  } else {
179
255
  const seq = [...frame.seq, astRule]
180
256
  const itemIndex = frame.itemIndex + 1
181
257
  if (itemIndex < frame.items.length) {
182
258
  stack = { top: { ...frame, itemIndex, seq }, rest: stack }
183
- task = { name: frame.items[itemIndex], tag: undefined, idx: nidx }
259
+ task = { name: frame.items[itemIndex], tag: undefined, pos }
184
260
  } else {
185
- result = mrSuccess(frame.tag, seq, nidx)
261
+ result = mrSuccess(frame.tag, seq, pos)
186
262
  }
187
263
  }
188
264
  } else {
189
265
  // success that consumed input wins immediately: the frame stays popped and
190
266
  // `result` propagates to the frame below, matching the recursive `return m`.
191
- if (!(result.success && frame.idx !== result.idx)) {
267
+ // Consuming EOF counts as consumption, because the cursor moved.
268
+ if (!(result.success && frame.pos !== result.pos)) {
192
269
  const emptyResult = result.success ? result : frame.emptyResult
193
270
  const entryIndex = frame.entryIndex + 1
194
271
  if (entryIndex < frame.entries.length) {
195
272
  stack = { top: { ...frame, entryIndex, emptyResult }, rest: stack }
196
273
  const [entryTag, entryName] = frame.entries[entryIndex]
197
- task = { name: entryName, tag: entryTag, idx: frame.idx }
274
+ task = { name: entryName, tag: entryTag, pos: frame.pos }
198
275
  } else {
199
276
  result = emptyResult
200
277
  }
@@ -9,5 +9,6 @@ export declare const proof: {
9
9
  descentParser: (() => void)[];
10
10
  longInput: (() => void)[];
11
11
  descentParserWithMeta: (() => void)[];
12
+ logicalEof: (() => void)[];
12
13
  furthestFailure: (() => void)[];
13
14
  };