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
@@ -4,6 +4,10 @@
4
4
  * `stateScan` operations.
5
5
  *
6
6
  * @module
7
+ *
8
+ * @import { List, Result, Thunk } from '../../types/list/types.ts'
9
+ * @import { StateScan } from '../../types/function/operator/types.ts'
10
+ * @import { CodePoint, U16 } from './types.ts'
7
11
  */
8
12
 
9
13
  import {
@@ -12,17 +16,14 @@ import {
12
16
  flatMap,
13
17
  empty,
14
18
  } from '../../types/list/module.f.mjs'
15
- /** @import { List, Result, Thunk } from '../../types/list/types.ts' */
16
19
 
17
20
  import { concat } from '../../types/function/operator/module.f.mjs'
18
- /** @import { StateScan } from '../../types/function/operator/types.ts' */
19
-
20
21
  import { contains } from '../../types/range/module.f.mjs'
21
-
22
22
  import { fn } from '../../types/function/module.f.mjs'
23
23
 
24
24
  import {
25
25
  decoder,
26
+ eofFlush,
26
27
  errorMask,
27
28
  isBmpCodePoint,
28
29
  isHighSurrogate,
@@ -37,8 +38,6 @@ import {
37
38
  * @typedef {number | null} _Utf16State
38
39
  */
39
40
 
40
- /** @import { CodePoint, U16 } from './types.ts' */
41
-
42
41
  /**
43
42
  * The BMP / surrogate / supplementary-plane predicates used below live in
44
43
  * `code_point`, the shared Unicode contract; see that module for their ranges.
@@ -85,7 +84,6 @@ const codePointToUtf16 = codePoint => {
85
84
  return [codePoint & 0xffff]
86
85
  }
87
86
 
88
-
89
87
  /**
90
88
  * Converts a UTF-16 sequence to its corresponding Unicode code points.
91
89
  *
@@ -119,6 +117,8 @@ const codePointToUtf16 = codePoint => {
119
117
  export const fromCodePointList
120
118
  = flatMap(codePointToUtf16)
121
119
 
120
+ const isInU16Range = contains(0x0000, 0xFFFF)
121
+
122
122
  /**
123
123
  * Validates whether a given 16-bit unsigned integer (U16) falls within the valid range for UTF-16 code units.
124
124
  *
@@ -134,10 +134,14 @@ export const fromCodePointList
134
134
  * const edgeCaseHigh = u16(0xFFFF) // true: Maximum valid value for UTF-16
135
135
  * ```
136
136
  *
137
+ * `U16` is just `number`, so this also rejects non-integers — `isBmpCodePoint`,
138
+ * `isHighSurrogate`, and `isLowSurrogate` only partition the *integers* in
139
+ * `0x0000`–`0xFFFF` with no gap; a fractional value would fall between two of
140
+ * those ranges and be misclassified downstream if it were let through here.
141
+ *
137
142
  * @type {(i: U16) => boolean}
138
143
  */
139
- const u16 = contains(0x0000, 0xFFFF)
140
-
144
+ const u16 = i => Number.isInteger(i) && isInU16Range(i)
141
145
 
142
146
  /**
143
147
  * A stateful operation that converts a UTF-16 word (U16) to a list of Unicode code points (CodePoint),
@@ -156,7 +160,9 @@ const u16 = contains(0x0000, 0xFFFF)
156
160
  * This can be either `null` (no state) or the previous high surrogate value.
157
161
  * @param word - The current UTF-16 word (U16) to process.
158
162
  * @returns A tuple where the first element is a list of decoded Unicode code points (`CodePoint`), and
159
- * the second element is the updated state. If the word is invalid, an error code `0xffffffff` is returned.
163
+ * the second element is the updated state. A word outside the `U16`
164
+ * domain is reported as one bare `errorMask` unit, the same shape the
165
+ * UTF-8 decoder's out-of-range guard emits.
160
166
  *
161
167
  * @example
162
168
  *
@@ -178,7 +184,10 @@ const u16 = contains(0x0000, 0xFFFF)
178
184
  */
179
185
  const utf16ByteToCodePointOp = (word, state) => {
180
186
  if (!u16(word)) {
181
- return [[0xffffffff], state]
187
+ // Out of domain, so there is no payload to tag: emit the bare mask,
188
+ // matching `utf8ByteToCodePointOp`'s guard. Every other error path
189
+ // below tags a real code unit with `| errorMask`.
190
+ return [[errorMask], state]
182
191
  }
183
192
  if (state === null) {
184
193
  if (isBmpCodePoint(word)) { return [[word], null] }
@@ -190,39 +199,33 @@ const utf16ByteToCodePointOp = (word, state) => {
190
199
  const low = word - 0xdc00
191
200
  return [[(high << 10) + low + 0x10000], null]
192
201
  }
202
+ // `isLowSurrogate`, `isBmpCodePoint`, and `isHighSurrogate` partition the
203
+ // full `u16` range with no gap, and `isLowSurrogate` was already ruled out
204
+ // above, so a non-BMP `word` here is always a high surrogate.
193
205
  if (isBmpCodePoint(word)) { return [[state | errorMask, word], null] }
194
- if (isHighSurrogate(word)) { return [[state | errorMask], word] }
195
- return [[state | errorMask, word | errorMask], null]
206
+ return [[state | errorMask], word]
196
207
  }
197
208
 
209
+ /**
210
+ * Converts a pending UTF-16 decoding state — an unpaired high surrogate
211
+ * (0xD800–0xDBFF) left from an earlier input — to an error code.
212
+ *
213
+ * @type {(state: number) => CodePoint}
214
+ */
215
+ const utf16StateToError = state => state | errorMask
198
216
 
199
217
  /**
200
218
  * Handles the EOF (end-of-file) condition during UTF-16 decoding.
201
219
  *
202
- * If there is no pending state (`state === null`), it simply returns an empty list
203
- * of code points, indicating no further input to process. If there is a pending state,
204
- * it is treated as an unpaired surrogate, and the `errorMask` is applied to flag
205
- * the invalid sequence.
206
- *
207
- * @param {_Utf16State} state - The current UTF-16 decoding state. This can be:
208
- * - `null`: No pending surrogate to process.
209
- * - A high surrogate (0xD800–0xDBFF) left from an earlier input, waiting for a low surrogate.
210
- * @returns {readonly[List<CodePoint>, _Utf16State]} A tuple:
211
- * - The first element is a list of code points. If there’s a pending state, it is returned
212
- * with the `errorMask` applied.
213
- * - The second element is the next state, which will always be `null` because EOF means no
214
- * further processing.
215
- *
216
- * @example
220
+ * If there is no pending state (`state === null`), it returns an empty list of
221
+ * code points, indicating no further input to process. If there is a pending
222
+ * state, it is treated as an unpaired surrogate and the `errorMask` is applied
223
+ * to flag the invalid sequence. The flush itself is `eofFlush` from
224
+ * `code_point`, shared with UTF-8.
217
225
  *
218
- * ```js
219
- * const eofState = utf16EofToCodePointOp(0xD800) // Unpaired high surrogate
220
- * const validState = utf16EofToCodePointOp(null) // No pending state
221
- * ```
226
+ * @type {(state: _Utf16State) => readonly[List<CodePoint>, _Utf16State]}
222
227
  */
223
- const utf16EofToCodePointOp = state =>
224
- [state === null ? empty : [state | errorMask], null]
225
-
228
+ const utf16EofToCodePointOp = eofFlush(utf16StateToError)
226
229
 
227
230
  /**
228
231
  * Converts a list of UTF-16 code units to a list of Unicode code points (CodePoint).
@@ -1,4 +1,6 @@
1
- /** @import { Unknown } from '../../media/json/types.ts' */
1
+ /**
2
+ * @import { Unknown } from '../../media/json/types.ts'
3
+ */
2
4
  export declare const proof: {
3
5
  toCodePointList: (() => void)[];
4
6
  fromCodePointList: (() => void)[];
@@ -1,4 +1,6 @@
1
- /** @import { Unknown } from '../../media/json/types.ts' */
1
+ /**
2
+ * @import { Unknown } from '../../media/json/types.ts'
3
+ */
2
4
 
3
5
  import {
4
6
  toCodePointList,
@@ -22,7 +24,7 @@ export const proof = {
22
24
  toCodePointList: [
23
25
  () => {
24
26
  const result = stringify(toArray(toCodePointList([-1, 65536])))
25
- assertEq(result, '[4294967295,4294967295]')
27
+ assertEq(result, '[2147483648,2147483648]')
26
28
  },
27
29
  () => {
28
30
  const result = stringify(toArray(toCodePointList([0, 36, 8364, 55295, 57344, 65535])))
@@ -51,6 +53,21 @@ export const proof = {
51
53
  () => {
52
54
  const result = stringify(toArray(toCodePointList([56320, 0])))
53
55
  assertEq(result, '[-2147427328,0]')
56
+ },
57
+ // `U16` is just `number`, so a non-integer in [0x0000, 0xFFFF] is a
58
+ // possible (if malformed) input. It must be rejected as invalid, not
59
+ // misclassified by the surrogate/BMP range checks, which only
60
+ // partition the integers in that range.
61
+ () => {
62
+ const result = stringify(toArray(toCodePointList([56319.5])))
63
+ assertEq(result, '[2147483648]')
64
+ },
65
+ // A non-integer word doesn't disturb a pending high surrogate: it is
66
+ // reported invalid on its own, and the surrogate is still flagged
67
+ // unpaired at EOF.
68
+ () => {
69
+ const result = stringify(toArray(toCodePointList([55296, 56319.5])))
70
+ assertEq(result, '[2147483648,-2147428352]')
54
71
  }
55
72
  ],
56
73
  fromCodePointList: [
@@ -2,6 +2,11 @@
2
2
  * UTF-8 byte-level encoding and decoding utilities for FunctionalScript streams.
3
3
  *
4
4
  * @module
5
+ *
6
+ * @import { List, Thunk } from '../../types/list/types.ts'
7
+ * @import { StateScan } from '../../types/function/operator/types.ts'
8
+ * @import { Vec } from '../../types/bit_vec/types.ts'
9
+ * @import { ByteOrEof, I32, U8, Utf8NonEmptyState, Utf8State, } from './types.ts'
5
10
  */
6
11
  import type { List, Thunk } from '../../types/list/types.ts';
7
12
  import type { StateScan } from '../../types/function/operator/types.ts';
@@ -42,12 +47,11 @@ export declare const utf8StateToError: (state: Utf8NonEmptyState) => I32;
42
47
  */
43
48
  export declare const utf8ByteToCodePointOp: StateScan<number, Utf8State, readonly I32[]>;
44
49
  /**
45
- * Handles the end-of-file (EOF) case for UTF-8 decoding.
50
+ * Handles the end-of-file (EOF) case for UTF-8 decoding: a leftover incomplete
51
+ * sequence is flushed as a single error code and the state resets to `null`.
52
+ * The flush itself is `eofFlush` from `code_point`, shared with UTF-16.
46
53
  *
47
- * @param {Utf8State} state The current UTF-8 decoding state.
48
- * @returns {readonly [List<I32>, Utf8State]} A tuple containing:
49
- * - A list of decoded Unicode code points or error codes.
50
- * - The reset UTF-8 state (`null`).
54
+ * @type {(state: Utf8State) => readonly [List<I32>, Utf8State]}
51
55
  */
52
56
  export declare const utf8EofToCodePointOp: (state: Utf8State) => readonly [List<I32>, Utf8State];
53
57
  /**
@@ -2,20 +2,24 @@
2
2
  * UTF-8 byte-level encoding and decoding utilities for FunctionalScript streams.
3
3
  *
4
4
  * @module
5
+ *
6
+ * @import { List, Thunk } from '../../types/list/types.ts'
7
+ * @import { StateScan } from '../../types/function/operator/types.ts'
8
+ * @import { Vec } from '../../types/bit_vec/types.ts'
9
+ * @import { ByteOrEof, I32, U8, Utf8NonEmptyState, Utf8State, } from './types.ts'
5
10
  */
6
11
 
7
12
  import { flatMap, toArray } from '../../types/list/module.f.mjs'
8
- /** @import { List, Thunk } from '../../types/list/types.ts' */
9
- /** @import { StateScan } from '../../types/function/operator/types.ts' */
10
- import { decoder, errorMask, isValidCodePoint } from '../code_point/module.f.mjs'
13
+ import {
14
+ bmpMax,
15
+ decoder,
16
+ eofFlush,
17
+ errorMask,
18
+ isSupplementaryPlane,
19
+ isValidCodePoint,
20
+ } from '../code_point/module.f.mjs'
11
21
  import { msb, u8List, length } from '../../types/bit_vec/module.f.mjs'
12
- /** @import { Vec } from '../../types/bit_vec/types.ts' */
13
22
  import { codePointListToString } from '../utf16/module.f.mjs'
14
- /**
15
- * @import {
16
- * ByteOrEof, I32, U8, Utf8NonEmptyState, Utf8State,
17
- * } from './types.ts'
18
- */
19
23
 
20
24
  /**
21
25
  * UTF-8 byte-format constants. Each byte kind is defined by a tag — the fixed
@@ -92,14 +96,14 @@ const codePointToUtf8 = input => {
92
96
  if (input >= 0x0080 && input <= 0x07ff) {
93
97
  return [input >> 6 | lead2Tag, contByte(input)]
94
98
  }
95
- if (input >= 0x0800 && input <= 0xffff) {
99
+ if (input >= 0x0800 && input <= bmpMax) {
96
100
  return [
97
101
  input >> 12 | lead3Tag,
98
102
  contByte(input >> 6),
99
103
  contByte(input),
100
104
  ]
101
105
  }
102
- if (input >= 0x10000 && input <= 0x10ffff) {
106
+ if (isSupplementaryPlane(input)) {
103
107
  return [
104
108
  input >> 18 | lead4Tag,
105
109
  contByte(input >> 12),
@@ -240,17 +244,13 @@ export const utf8ByteToCodePointOp = (byte, state) => {
240
244
  }
241
245
 
242
246
  /**
243
- * Handles the end-of-file (EOF) case for UTF-8 decoding.
247
+ * Handles the end-of-file (EOF) case for UTF-8 decoding: a leftover incomplete
248
+ * sequence is flushed as a single error code and the state resets to `null`.
249
+ * The flush itself is `eofFlush` from `code_point`, shared with UTF-16.
244
250
  *
245
- * @param {Utf8State} state The current UTF-8 decoding state.
246
- * @returns {readonly [List<I32>, Utf8State]} A tuple containing:
247
- * - A list of decoded Unicode code points or error codes.
248
- * - The reset UTF-8 state (`null`).
251
+ * @type {(state: Utf8State) => readonly [List<I32>, Utf8State]}
249
252
  */
250
- export const utf8EofToCodePointOp = state => [
251
- state === null ? null : [utf8StateToError(state)],
252
- null,
253
- ]
253
+ export const utf8EofToCodePointOp = eofFlush(utf8StateToError)
254
254
 
255
255
  /**
256
256
  * Converts a list of UTF-8 bytes into a list of Unicode code points.
@@ -2,9 +2,10 @@
2
2
  * JavaScript immutable arrays.
3
3
  *
4
4
  * @module
5
+ *
6
+ * @import { Tuple } from './types.ts'
5
7
  */
6
8
  import type { Tuple } from './types.ts';
7
- /** @import { Tuple } from './types.ts' */
8
9
  /**
9
10
  * @type {(value: unknown) => value is readonly unknown[]}
10
11
  */
@@ -2,12 +2,12 @@
2
2
  * JavaScript immutable arrays.
3
3
  *
4
4
  * @module
5
+ *
6
+ * @import { Tuple } from './types.ts'
5
7
  */
6
8
 
7
9
  import { fromUndefined, map } from '../nullable/module.f.mjs'
8
10
 
9
- /** @import { Tuple } from './types.ts' */
10
-
11
11
  /**
12
12
  * @type {(value: unknown) => value is readonly unknown[]}
13
13
  */
@@ -53,10 +53,22 @@ export const first = at(0)
53
53
  */
54
54
  export const last = a => at(a.length - 1)(a)
55
55
 
56
+ /**
57
+ * Applies `f` to a non-empty array, answering `null` for an empty one — the
58
+ * shared shape of the whole-array accessors below.
59
+ *
60
+ * The guard is `a.length === 0` and not `first(a) === null`: `first` goes
61
+ * through `fromUndefined`, so it reads a *stored* `null` or `undefined`
62
+ * element as absence. `[null]` is not empty, but `first` says it is.
63
+ *
64
+ * @type {<T, R>(f: (a: readonly T[]) => R) => (a: readonly T[]) => R | null}
65
+ */
66
+ const onNonEmpty = f => a => a.length === 0 ? null : f(a)
67
+
56
68
  /**
57
69
  * @type {<T>(a: readonly T[]) => readonly T[] | null}
58
70
  */
59
- export const tail = a => a.length === 0 ? null : uncheckTail(a)
71
+ export const tail = onNonEmpty(uncheckTail)
60
72
 
61
73
  /**
62
74
  * @type {<T>(a: readonly T[]) => readonly [T, readonly T[]] | null}
@@ -69,7 +81,7 @@ export const splitFirst = a => {
69
81
  }
70
82
 
71
83
  /** @type {<T>(a: readonly T[]) => readonly T[] | null} */
72
- export const head = a => a.length === 0 ? null : uncheckHead(a)
84
+ export const head = onNonEmpty(uncheckHead)
73
85
 
74
86
  /** @type {<T>(a: readonly T[]) => readonly [readonly T[], T] | null} */
75
87
  export const splitLast = a => {
@@ -2,12 +2,32 @@
2
2
  * Big-float helpers built from bigint mantissa and exponent parts.
3
3
  *
4
4
  * @module
5
+ *
6
+ * @import { BigFloat } from './types.ts'
5
7
  */
6
8
  import type { BigFloat } from './types.ts';
7
9
  export type _BigFloatWithRemainder = readonly [BigFloat, bigint];
8
10
  /** @type {(_: BigFloat) => (mul: bigint) => BigFloat} */
9
11
  export declare const multiply: (_: BigFloat) => (mul: bigint) => BigFloat;
10
- /** @type {(dec: BigFloat) => BigFloat} */
12
+ /**
13
+ * Converts a decimal big-float `m * 10^e` into the nearest binary big-float,
14
+ * rounding ties to even.
15
+ *
16
+ * A zero input returns `[0n, 0]`; every other input returns a mantissa of
17
+ * exactly 53 significant bits, `2^52 <= abs(m) < 2^53`. The upper bound holds
18
+ * even when rounding carries out of the top bit.
19
+ *
20
+ * The **exponent is unbounded**: this is the correctly-rounded 53-bit value,
21
+ * not a `number`. Nothing here knows binary64's exponent range, so a result
22
+ * is neither turned into an infinity when it is too large for a `double` nor
23
+ * cut down to the fewer-than-53 bits a subnormal actually carries. A consumer
24
+ * that rounds one of these results onto the subnormal grid therefore rounds
25
+ * twice and can land an ulp away from the correctly-rounded `double`: reaching
26
+ * the subnormal range needs a single rounding to a precision chosen from the
27
+ * target exponent, which this function does not offer yet.
28
+ *
29
+ * @type {(dec: BigFloat) => BigFloat}
30
+ */
11
31
  export declare const decToBin: (dec: BigFloat) => BigFloat;
12
32
  export declare const proof: {
13
33
  normalizeMantissaZero: () => void;
@@ -2,10 +2,11 @@
2
2
  * Big-float helpers built from bigint mantissa and exponent parts.
3
3
  *
4
4
  * @module
5
+ *
6
+ * @import { BigFloat } from './types.ts'
5
7
  */
6
8
 
7
9
  import { abs, sign } from '../bigint/module.f.mjs'
8
- /** @import { BigFloat } from './types.ts' */
9
10
 
10
11
  /** @typedef {readonly [BigFloat, bigint]} _BigFloatWithRemainder */
11
12
 
@@ -61,6 +62,16 @@ const divide = ([m, e]) => div => [[m / div, e], m % div]
61
62
  */
62
63
  const withSign = (m, e) => f => multiply(f([abs(m), e]))(BigInt(sign(m)))
63
64
 
65
+ /**
66
+ * Re-normalizes a magnitude that rounding carried out of 53 bits: rounding
67
+ * `2^53 - 1` up yields exactly `2^53`, one bit wider than `round53` promises.
68
+ * The bit shifted out is always 0 there, so the value is unchanged and no
69
+ * second rounding decision is needed.
70
+ *
71
+ * @type {(magnitude: BigFloat) => BigFloat}
72
+ */
73
+ const renormalize53 = ([m, e]) => m === twoPow53 ? [m >> 1n, e + 1] : [m, e]
74
+
64
75
  /** @type {(_: _BigFloatWithRemainder) => BigFloat} */
65
76
  const round53 = ([[m, e], r]) =>
66
77
  withSign(m, e)(([mAbs]) => {
@@ -68,14 +79,29 @@ const round53 = ([[m, e], r]) =>
68
79
  const o54 = m54 & 1n
69
80
  const m53 = m54 >> 1n
70
81
  const e53 = e54 + 1
71
- if (o54 === 1n && r === 0n && mAbs === m54 >> BigInt(e - e54)) {
72
- const odd = m53 & 1n
73
- return [m53 + odd, e53]
74
- }
75
- return [m53 + o54, e53]
82
+ const tie = o54 === 1n && r === 0n && mAbs === m54 >> BigInt(e - e54)
83
+ return renormalize53([m53 + (tie ? m53 & 1n : o54), e53])
76
84
  })
77
85
 
78
- /** @type {(dec: BigFloat) => BigFloat} */
86
+ /**
87
+ * Converts a decimal big-float `m * 10^e` into the nearest binary big-float,
88
+ * rounding ties to even.
89
+ *
90
+ * A zero input returns `[0n, 0]`; every other input returns a mantissa of
91
+ * exactly 53 significant bits, `2^52 <= abs(m) < 2^53`. The upper bound holds
92
+ * even when rounding carries out of the top bit.
93
+ *
94
+ * The **exponent is unbounded**: this is the correctly-rounded 53-bit value,
95
+ * not a `number`. Nothing here knows binary64's exponent range, so a result
96
+ * is neither turned into an infinity when it is too large for a `double` nor
97
+ * cut down to the fewer-than-53 bits a subnormal actually carries. A consumer
98
+ * that rounds one of these results onto the subnormal grid therefore rounds
99
+ * twice and can land an ulp away from the correctly-rounded `double`: reaching
100
+ * the subnormal range needs a single rounding to a precision chosen from the
101
+ * target exponent, which this function does not offer yet.
102
+ *
103
+ * @type {(dec: BigFloat) => BigFloat}
104
+ */
79
105
  export const decToBin = dec => {
80
106
  if (dec[0] === 0n) {
81
107
  return [0n, 0]
@@ -2,4 +2,5 @@ export declare const proof: {
2
2
  decToBin: (() => void)[];
3
3
  roundingPositive: (() => void)[];
4
4
  roundingNegative: (() => void)[];
5
+ roundingCarry: (() => void)[];
5
6
  };
@@ -1,5 +1,21 @@
1
1
  import { decToBin } from './module.f.mjs'
2
2
  import { assertEq } from '../../asserts/module.f.mjs'
3
+ import { bitLength } from '../bigint/module.f.mjs'
4
+
5
+ /**
6
+ * Checks `decToBin`'s postcondition on a non-zero result: the mantissa holds
7
+ * exactly 53 significant bits, and `m * 2^e` is the value it should be.
8
+ * `bitLength` measures the magnitude, so a negative mantissa is checked as
9
+ * strictly as a positive one. The value is recovered with a shift, so every
10
+ * `dec` passed here must round to a whole number (a non-negative `e`).
11
+ *
12
+ * @type {(dec: readonly [bigint, number]) => (value: bigint) => void}
13
+ */
14
+ const assertRounded = dec => value => {
15
+ const [m, e] = decToBin(dec)
16
+ assertEq(bitLength(m), 53n, m.toString(2))
17
+ assertEq(m << BigInt(e), value, m.toString(2))
18
+ }
3
19
 
4
20
  export const proof = {
5
21
  decToBin: [
@@ -214,5 +230,35 @@ export const proof = {
214
230
  assertEq(result[0], -0b1_1001_1001_1001_1001_1001_1001_1001_1001_1001_1001_1001_1001_1100n, result[0].toString(2))
215
231
  assertEq(result[1], 2)
216
232
  }
233
+ ],
234
+ // Rounding up a mantissa of all ones carries into a 54th bit; the result
235
+ // has to come back as 53 bits without changing the value.
236
+ roundingCarry: [
237
+ () => {
238
+ // 54 ones: an exact tie (nothing below the dropped bit, remainder
239
+ // 0) whose round-to-even goes up because 2^53 - 1 is odd.
240
+ assertRounded([0b11_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111n, 0])(
241
+ 0b100_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000n) // 2^54
242
+ },
243
+ () => {
244
+ assertRounded([-0b11_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111n, 0])(
245
+ -0b100_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000n) // -2^54
246
+ },
247
+ () => {
248
+ // 55 ones: not a tie — the dropped bits are 11 — so the carry comes
249
+ // from the plain round-up path instead.
250
+ assertRounded([0b111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111n, 0])(
251
+ 0b1000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000n) // 2^55
252
+ },
253
+ () => {
254
+ assertRounded([-0b111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111n, 0])(
255
+ -0b1000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000n) // -2^55
256
+ },
257
+ () => {
258
+ // A neighbour that doesn't carry: also a tie, but 2^53 - 2 is even,
259
+ // so round-to-even goes down and the mantissa stays 53 bits wide.
260
+ assertRounded([0b11_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1101n, 0])(
261
+ 0b11_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1100n)
262
+ },
217
263
  ]
218
264
  }
@@ -15,6 +15,10 @@
15
15
  * const bitmask = mask(5n) // 31n
16
16
  * const c = combination([3n, 2n, 1n]) // 60n
17
17
  * ```
18
+ *
19
+ * @import { Sign } from '../function/compare/types.ts'
20
+ * @import { List } from '../list/types.ts'
21
+ * @import { Reduce, Unary } from './types.ts'
18
22
  */
19
23
  import type { Sign } from '../function/compare/types.ts';
20
24
  import type { List } from '../list/types.ts';
@@ -15,12 +15,13 @@
15
15
  * const bitmask = mask(5n) // 31n
16
16
  * const c = combination([3n, 2n, 1n]) // 60n
17
17
  * ```
18
+ *
19
+ * @import { Sign } from '../function/compare/types.ts'
20
+ * @import { List } from '../list/types.ts'
21
+ * @import { Reduce, Unary } from './types.ts'
18
22
  */
19
23
 
20
24
  import { cmp } from '../function/compare/module.f.mjs'
21
- /** @import { Sign } from '../function/compare/types.ts' */
22
- /** @import { List } from '../list/types.ts' */
23
- /** @import { Reduce, Unary } from './types.ts' */
24
25
  import { fold } from '../../common/monoid/module.f.mjs'
25
26
 
26
27
  /**
@@ -20,20 +20,21 @@
20
20
  * ```
21
21
  *
22
22
  * @module
23
+ *
24
+ * @import { Reduce as BigintReduce } from '../bigint/types.ts'
25
+ * @import { Fold } from '../function/operator/types.ts'
26
+ * @import { List, Thunk } from '../list/types.ts'
27
+ * @import { Absorbing } from '../../common/monoid/types.ts'
28
+ * @import { Sign } from '../function/compare/types.ts'
29
+ * @import { Nullable } from '../nullable/types.ts'
30
+ * @import { BitOrder, PopFront, Reduce, Unpacked, Vec, _NormOp, _UnpackConcat, } from './types.ts'
23
31
  */
24
- import { maxLength } from '../bigint/module.f.mjs';
25
32
  import type { Fold } from '../function/operator/types.ts';
26
- import type { Accumulator, List, Thunk } from '../list/types.ts';
33
+ import type { List, Thunk } from '../list/types.ts';
27
34
  import type { Sign } from '../function/compare/types.ts';
28
35
  import type { Nullable } from '../nullable/types.ts';
29
36
  import type { BitOrder, Unpacked, Vec, _NormOp } from './types.ts';
30
- /** @import { Nullable } from '../nullable/types.ts' */
31
- /**
32
- * @import {
33
- * BitOrder, PopFront, Reduce, Unpacked, Vec,
34
- * _NormOp, _UnpackConcat,
35
- * } from './types.ts'
36
- */
37
+ import { maxLength } from '../bigint/module.f.mjs';
37
38
  /**
38
39
  * Maximum length of a bit vector in bits (1_048_576 = 0x10_0000).
39
40
  * This limit is enforced by Bun's `bigint` size constraint, the minimal limit
@@ -119,18 +120,11 @@ export declare const pack: ({ length, uint }: Unpacked) => Vec;
119
120
  /** @type {({ uint }: Unpacked) => bigint} */
120
121
  export declare const unpackedUint: ({ uint }: Unpacked) => bigint;
121
122
  export type _Base = {
122
- readonly front: (len: bigint) => (v: Vec) => bigint;
123
- readonly removeFront: (len: bigint) => (v: Vec) => Vec;
124
123
  readonly norm: _NormOp;
125
124
  readonly uintCmp: (a: bigint) => (b: bigint) => Sign;
126
125
  readonly unpackSplit: (len: bigint) => (u: Unpacked) => readonly [bigint, bigint];
127
126
  readonly unpackConcatUint: (a: Unpacked) => (b: Unpacked) => bigint;
128
127
  };
129
- export type _ListToVecState = {
130
- readonly len: bigint;
131
- readonly stack: readonly Unpacked[];
132
- };
133
- export type _ListToVecOp = Accumulator<Unpacked, _ListToVecState, Vec>;
134
128
  /**
135
129
  * Implements operations for handling vectors in a least-significant-bit (LSb) first order.
136
130
  *