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
package/README.md CHANGED
@@ -5,13 +5,15 @@
5
5
  FunctionalScript is a safe, purely functional programming language and a strict subset of
6
6
  [ECMAScript](https://en.wikipedia.org/wiki/ECMAScript)/[JavaScript](https://en.wikipedia.org/wiki/JavaScript). It's inspired by
7
7
 
8
- - [JSON](https://en.wikipedia.org/wiki/JSON) and [JSON5](https://json5.org/) as subsets of JavaScript.
9
- JSON is also a subset of FunctionalScript.
8
+ - [JSON](https://en.wikipedia.org/wiki/JSON) and [JSON5](https://json5.org/) as subsets of JavaScript values.
9
+ JSON is also a subset of FunctionalScript values.
10
10
  - [asm.JS](https://en.wikipedia.org/wiki/Asm.js) (a precursor of [WebAssembly](https://en.wikipedia.org/wiki/WebAssembly)),
11
11
  as a subset of JavaScript.
12
12
  - [TypeScript](https://en.wikipedia.org/wiki/TypeScript), as a superset of JavaScript.
13
13
 
14
- [A working draft of the FunctionalScript specification](./todo/lang/README.md).
14
+ [The FunctionalScript specification](./spec/README.md) describes the language
15
+ the compiler accepts today; features not implemented yet are in
16
+ [`spec/todo/`](./spec/todo/README.md).
15
17
 
16
18
  Learn more about
17
19
 
@@ -19,6 +19,7 @@ import {
19
19
  vec,
20
20
  vec8,
21
21
  } from '../types/bit_vec/module.f.mjs'
22
+ import { assert } from '../asserts/module.f.mjs'
22
23
  import { identity } from '../types/function/module.f.mjs'
23
24
  import { max } from '../types/function/compare/module.f.mjs'
24
25
  import { encode as b128encode, decode as b128decode } from '../basen/base128/module.f.mjs'
@@ -65,7 +66,13 @@ const parsedTagEncode = ([classPc, number]) => {
65
66
  /** @type {(v: Vec) => readonly[_ParsedTag, Vec]} */
66
67
  const parsedTagDecode = v => {
67
68
  const [firstByte, rest] = pop8(v)
68
- const classPc = /** @type {_ClassPc} */(firstByte & classPcMask)
69
+ const classPc = firstByte & classPcMask
70
+ // `classPcMask` is the top three bits, so the result is one of eight values;
71
+ // the assert is what narrows `bigint` to `_ClassPc`.
72
+ assert(classPc === 0b000_00000n || classPc === 0b001_00000n
73
+ || classPc === 0b010_00000n || classPc === 0b011_00000n
74
+ || classPc === 0b100_00000n || classPc === 0b101_00000n
75
+ || classPc === 0b110_00000n || classPc === 0b111_00000n, classPc)
69
76
  const firstByteNumber = firstByte & tagNumberMask
70
77
  const [number, rest1] = firstByteNumber < tagNumberMask
71
78
  ? [firstByteNumber, rest]
@@ -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,11 +42,22 @@ 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;
44
49
  withArc: () => void;
45
50
  };
46
51
  unknownTag: () => void;
52
+ tagClass: {
53
+ universalPrimitive: () => void;
54
+ universalConstructed: () => void;
55
+ applicationPrimitive: () => void;
56
+ applicationConstructed: () => void;
57
+ contextPrimitive: () => void;
58
+ contextConstructed: () => void;
59
+ privatePrimitive: () => void;
60
+ privateConstructed: () => void;
61
+ };
47
62
  raw: (() => void)[];
48
63
  };
@@ -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: () => {
@@ -284,6 +296,22 @@ export const proof = {
284
296
  // Re-encoding an UnsupportedRecord returns it unchanged (it is already the TLV bytes)
285
297
  assertEq(encode(decoded), raw, 'encode should round-trip UnsupportedRecord')
286
298
  },
299
+ // parsedTagDecode narrows the top three bits of the tag's first byte
300
+ // (class + primitive/constructed) to one of exactly eight values via an
301
+ // 8-way `||` assert. Every other test in this file only ever exercises
302
+ // the universal-primitive tag (top bits 000), so each of the other seven
303
+ // comparisons has never had a case where it's the one that turns the
304
+ // assert true — one round trip per class×P/C combination covers them all.
305
+ tagClass: {
306
+ universalPrimitive: () => check(0x02n, vec8(0x42n), empty),
307
+ universalConstructed: () => check(0x22n, vec8(0x42n), empty),
308
+ applicationPrimitive: () => check(0x42n, vec8(0x42n), empty),
309
+ applicationConstructed: () => check(0x62n, vec8(0x42n), empty),
310
+ contextPrimitive: () => check(0x82n, vec8(0x42n), empty),
311
+ contextConstructed: () => check(0xA2n, vec8(0x42n), empty),
312
+ privatePrimitive: () => check(0xC2n, vec8(0x42n), empty),
313
+ privateConstructed: () => check(0xE2n, vec8(0x42n), empty),
314
+ },
287
315
  raw: [
288
316
  () => {
289
317
  const e = encodeRaw([0x00n, vec8(0x23n)])
@@ -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(),
@@ -6,12 +6,27 @@
6
6
  * @import { Vec } from '../../types/bit_vec/types.ts'
7
7
  */
8
8
 
9
+ import { mask } from '../../types/bigint/module.f.mjs'
9
10
  import { vec8, msb, empty } from '../../types/bit_vec/module.f.mjs'
10
11
 
11
12
  const { concat, popFront } = msb
12
13
 
13
14
  const pop8 = popFront(8n)
14
15
 
16
+ /**
17
+ * The varint layout both halves below agree on, stated once: each byte carries
18
+ * seven payload bits in its low end, and its top bit is set on every byte
19
+ * except the last.
20
+ *
21
+ * `encode` and `decode` are exact inverses, so the two must agree bit for bit.
22
+ * The masks are derived from `payloadBits` rather than written as `0x7f` and
23
+ * `0x80` so that agreement is structural rather than a pair of literals a
24
+ * reader has to match up.
25
+ */
26
+ const payloadBits = 7n
27
+ const payloadMask = mask(payloadBits)
28
+ const continuationFlag = 1n << payloadBits
29
+
15
30
  /**
16
31
  * Encodes a bigint into an MSB Base128 vector.
17
32
  *
@@ -22,10 +37,12 @@ export const encode = uint => {
22
37
  /** @type {Vec} */
23
38
  let result = empty
24
39
  while (true) {
25
- const item = uint & 0x7Fn
26
- const flag = result === empty ? 0n : 0x80n
40
+ const item = uint & payloadMask
41
+ // The first byte built is the last one emitted, so it is the only one
42
+ // without the continuation flag.
43
+ const flag = result === empty ? 0n : continuationFlag
27
44
  result = concat(vec8(flag | item))(result)
28
- uint >>= 7n
45
+ uint >>= payloadBits
29
46
  if (uint === 0n) {
30
47
  return result
31
48
  }
@@ -42,8 +59,8 @@ export const decode = v => {
42
59
  let result = 0n
43
60
  while (true) {
44
61
  const [byte, rest] = pop8(v)
45
- result = (result << 7n) | (byte & 0x7Fn)
46
- if (byte < 0x80n) {
62
+ result = (result << payloadBits) | (byte & payloadMask)
63
+ if ((byte & continuationFlag) === 0n) {
47
64
  return [result, rest]
48
65
  }
49
66
  v = rest
@@ -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'
@@ -3,10 +3,11 @@
3
3
  * {@link toData} conversion from the functional grammar.
4
4
  *
5
5
  * This module is the pure, parser-agnostic substrate: it defines the
6
- * {@link RuleSet} data form (`Rule = Variant | Sequence | TerminalRange`) and
7
- * converts a functional grammar into it. The automaton builders that consume a
8
- * {@link RuleSet} live in their own sibling modules (`fjs/bnf/ll1`,
9
- * `fjs/bnf/descent`, …), so the IR stays free of any one parser's machinery.
6
+ * {@link RuleSet} data form (`Rule = Variant | Sequence | TerminalRange |
7
+ * Repeat`) and converts a functional grammar into it. The automaton builders
8
+ * that consume a {@link RuleSet} live in their own sibling modules
9
+ * (`fjs/bnf/ll1`, `fjs/bnf/descent`, …), so the IR stays free of any one
10
+ * parser's machinery.
10
11
  *
11
12
  * See `./types.ts` for the type-level API.
12
13
  *
@@ -14,11 +15,23 @@
14
15
  *
15
16
  * @import { DataRule, Rule as FRule, Sequence as FSequence } from '../types.ts'
16
17
  * @import { StringMap } from '../../types/object/types.ts'
17
- * @import { EmptyTag, Rule, RuleSet, Sequence, Variant } from './types.ts'
18
+ * @import { StringSet } from '../../types/string_set/types.ts'
19
+ * @import { EmptyTag, Repeat, Rule, RuleSet, Sequence, Variant } from './types.ts'
18
20
  */
19
21
  import type { Rule as FRule } from '../types.ts';
20
22
  import type { StringMap } from '../../types/object/types.ts';
21
- import type { EmptyTag, Rule, RuleSet } from './types.ts';
23
+ import type { EmptyTag, Repeat, Rule, RuleSet } from './types.ts';
24
+ /**
25
+ * Whether a data rule is a {@link Repeat}.
26
+ *
27
+ * Every rule-dispatch site asks this instead of testing for a string inline, so
28
+ * the repetition rule kind has exactly one discriminator to move when the
29
+ * surrounding rule model changes.
30
+ *
31
+ * @param {Rule} rule
32
+ * @returns {rule is Repeat}
33
+ */
34
+ export declare const isRepeat: (rule: Rule) => rule is Repeat;
22
35
  export type _EmptyTagMap = StringMap<EmptyTag>;
23
36
  /**
24
37
  * Computes, for every rule in the set, whether it can match empty input, by
@@ -38,6 +51,19 @@ export type _EmptyTagMap = StringMap<EmptyTag>;
38
51
  export declare const emptyTagMap: (ruleSet: RuleSet) => _EmptyTagMap;
39
52
  export type _FRuleMap = StringMap<FRule>;
40
53
  export type _NewRule = (m: _FRuleMap) => readonly [_FRuleMap, RuleSet, Rule];
54
+ /**
55
+ * Rewrites every right-recursive 0-or-more rule of a {@link RuleSet} into a
56
+ * {@link Repeat}, and drops the rules that the rewrite orphans.
57
+ *
58
+ * The dropped rules are the recursive branch and, unless something else still
59
+ * refers to it, the empty one: both are reachable only through the variant that
60
+ * the {@link Repeat} replaces. Pruning them keeps the invariant that every rule
61
+ * of a generated set is reachable from its entry, so the serialized form holds
62
+ * no dead grammar.
63
+ *
64
+ * @type {(ruleSet: RuleSet, entry: string) => RuleSet}
65
+ */
66
+ export declare const detectRepeat: (ruleSet: RuleSet, entry: string) => RuleSet;
41
67
  /**
42
68
  * Converts a functional grammar rule into serializable BNF data and returns
43
69
  * the generated rule set with the entry rule identifier.
@@ -3,10 +3,11 @@
3
3
  * {@link toData} conversion from the functional grammar.
4
4
  *
5
5
  * This module is the pure, parser-agnostic substrate: it defines the
6
- * {@link RuleSet} data form (`Rule = Variant | Sequence | TerminalRange`) and
7
- * converts a functional grammar into it. The automaton builders that consume a
8
- * {@link RuleSet} live in their own sibling modules (`fjs/bnf/ll1`,
9
- * `fjs/bnf/descent`, …), so the IR stays free of any one parser's machinery.
6
+ * {@link RuleSet} data form (`Rule = Variant | Sequence | TerminalRange |
7
+ * Repeat`) and converts a functional grammar into it. The automaton builders
8
+ * that consume a {@link RuleSet} live in their own sibling modules
9
+ * (`fjs/bnf/ll1`, `fjs/bnf/descent`, …), so the IR stays free of any one
10
+ * parser's machinery.
10
11
  *
11
12
  * See `./types.ts` for the type-level API.
12
13
  *
@@ -14,13 +15,27 @@
14
15
  *
15
16
  * @import { DataRule, Rule as FRule, Sequence as FSequence } from '../types.ts'
16
17
  * @import { StringMap } from '../../types/object/types.ts'
17
- * @import { EmptyTag, Rule, RuleSet, Sequence, Variant } from './types.ts'
18
+ * @import { StringSet } from '../../types/string_set/types.ts'
19
+ * @import { EmptyTag, Repeat, Rule, RuleSet, Sequence, Variant } from './types.ts'
18
20
  */
19
21
 
20
22
  import { stringToCodePointList } from '../../text/utf16/module.f.mjs'
21
23
  import { map, toArray } from '../../types/list/module.f.mjs'
22
24
  import { oneEncode } from '../module.f.mjs'
23
- import { definedEntries } from '../../types/object/module.f.mjs'
25
+ import { definedEntries, definedValues } from '../../types/object/module.f.mjs'
26
+ import { contains, set } from '../../types/string_set/module.f.mjs'
27
+
28
+ /**
29
+ * Whether a data rule is a {@link Repeat}.
30
+ *
31
+ * Every rule-dispatch site asks this instead of testing for a string inline, so
32
+ * the repetition rule kind has exactly one discriminator to move when the
33
+ * surrounding rule model changes.
34
+ *
35
+ * @param {Rule} rule
36
+ * @returns {rule is Repeat}
37
+ */
38
+ export const isRepeat = rule => typeof rule === 'string'
24
39
 
25
40
  /** @typedef {StringMap<EmptyTag>} _EmptyTagMap */
26
41
 
@@ -30,6 +45,10 @@ const emptyTagOf = map => rule => {
30
45
  return undefined
31
46
  } else if (rule instanceof Array) {
32
47
  return rule.every(item => map[item] !== undefined) ? true : undefined
48
+ } else if (isRepeat(rule)) {
49
+ // Zero repetitions is a match whatever the body does, and it carries no
50
+ // tag of its own — a repetition is a sequence of items, not a choice.
51
+ return true
33
52
  } else {
34
53
  /** @type {EmptyTag} */
35
54
  let tag = undefined
@@ -176,6 +195,92 @@ const toDataAdd = map => fr => {
176
195
  return [map2, { ...set, [id]: rule }, id]
177
196
  }
178
197
 
198
+ //
199
+
200
+ const { fromEntries } = Object
201
+
202
+ /** @type {(rule: Rule) => Sequence} */
203
+ const refs = rule => {
204
+ if (typeof rule === 'number') {
205
+ return []
206
+ } else if (rule instanceof Array) {
207
+ return rule
208
+ } else if (isRepeat(rule)) {
209
+ return [rule]
210
+ } else {
211
+ return definedValues(rule)
212
+ }
213
+ }
214
+
215
+ /** @type {(ruleSet: RuleSet) => (visited: StringSet, name: string) => StringSet} */
216
+ const visit = ruleSet => (visited, name) =>
217
+ contains(name)(visited)
218
+ ? visited
219
+ : refs(ruleSet[name]).reduce(visit(ruleSet), set(name)(visited))
220
+
221
+ /**
222
+ * Every rule the entry rule can reach, itself included.
223
+ *
224
+ * @type {(ruleSet: RuleSet) => (entry: string) => StringSet}
225
+ */
226
+ const reachable = ruleSet => entry => visit(ruleSet)(null, entry)
227
+
228
+ /** @type {(rule: Rule) => boolean} */
229
+ const isNone = rule => rule instanceof Array && rule.length === 0
230
+
231
+ /**
232
+ * The {@link Repeat} — the name of the item to repeat — that `name` encodes as
233
+ * right-recursion, or `undefined` when it encodes something else.
234
+ *
235
+ * The shape recognized is exactly the unambiguous 0-or-more list: a two-branch
236
+ * variant whose branches are an empty sequence and `[item, name]`, in either
237
+ * order. Everything looser stays as it is — an operator-style tree, a separated
238
+ * list, or a 1-or-more chain all reach `name` again, but their extra items make
239
+ * the grouping a real choice rather than a list, so folding them into a flat
240
+ * sequence would discard structure no rule name is left to recover.
241
+ *
242
+ * Two further conditions keep the fold sound rather than merely plausible:
243
+ * `item` must not lead back to `name`, so `name`'s only self-reference is the
244
+ * tail one, and `item` must not match empty, since a body that can consume
245
+ * nothing has infinitely many parses of the same input.
246
+ *
247
+ * @type {(ruleSet: RuleSet, emptyTags: _EmptyTagMap) => (name: string) => Repeat | undefined}
248
+ */
249
+ const repeatOf = (ruleSet, emptyTags) => name => {
250
+ const rule = ruleSet[name]
251
+ if (typeof rule === 'number' || rule instanceof Array || isRepeat(rule)) { return undefined }
252
+ const branches = definedValues(rule)
253
+ if (branches.length !== 2) { return undefined }
254
+ const [a, b] = branches
255
+ const step = isNone(ruleSet[a]) ? b : isNone(ruleSet[b]) ? a : undefined
256
+ if (step === undefined) { return undefined }
257
+ const stepRule = ruleSet[step]
258
+ if (!(stepRule instanceof Array) || stepRule.length !== 2 || stepRule[1] !== name) { return undefined }
259
+ const [item] = stepRule
260
+ if (emptyTags[item] !== undefined || contains(name)(reachable(ruleSet)(item))) { return undefined }
261
+ return item
262
+ }
263
+
264
+ /**
265
+ * Rewrites every right-recursive 0-or-more rule of a {@link RuleSet} into a
266
+ * {@link Repeat}, and drops the rules that the rewrite orphans.
267
+ *
268
+ * The dropped rules are the recursive branch and, unless something else still
269
+ * refers to it, the empty one: both are reachable only through the variant that
270
+ * the {@link Repeat} replaces. Pruning them keeps the invariant that every rule
271
+ * of a generated set is reachable from its entry, so the serialized form holds
272
+ * no dead grammar.
273
+ *
274
+ * @type {(ruleSet: RuleSet, entry: string) => RuleSet}
275
+ */
276
+ export const detectRepeat = (ruleSet, entry) => {
277
+ const repeat = repeatOf(ruleSet, emptyTagMap(ruleSet))
278
+ /** @type {RuleSet} */
279
+ const next = fromEntries(entries(ruleSet).map(([k, v]) => [k, repeat(k) ?? v]))
280
+ const live = reachable(next)(entry)
281
+ return fromEntries(entries(next).filter(([k]) => contains(k)(live)))
282
+ }
283
+
179
284
  /**
180
285
  * Converts a functional grammar rule into serializable BNF data and returns
181
286
  * the generated rule set with the entry rule identifier.
@@ -184,5 +289,5 @@ const toDataAdd = map => fr => {
184
289
  */
185
290
  export const toData = fr => {
186
291
  const [, ruleSet, id] = toDataAdd({})(fr)
187
- return [ruleSet, id]
292
+ return [detectRepeat(ruleSet, id), id]
188
293
  }
@@ -7,6 +7,8 @@ export declare const proof: {
7
7
  rangeDecode: () => void;
8
8
  rangeEncode: () => void;
9
9
  toData: (() => void)[];
10
+ isRepeat: () => void;
11
+ detectRepeat: (() => void)[];
10
12
  variantTest: () => void;
11
13
  emptyTagMap: (() => void)[];
12
14
  example: () => void;