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
@@ -2,17 +2,17 @@
2
2
  * Monoids: the `Monoid<T>` algebraic structure (identity plus associative
3
3
  * binary operation), `repeat`, which applies the operation `n` times using
4
4
  * exponentiation by squaring, and `fold`, which applies it across every element
5
- * of a list.
5
+ * of a list as a balanced binary tree.
6
6
  *
7
7
  * @module
8
8
  *
9
- * @import { Fold } from '../../types/function/operator/types.ts'
10
- * @import { List } from '../../types/list/types.ts'
11
- * @import { Monoid } from './types.ts'
9
+ * @import { Fold, Reduce } from '../../types/function/operator/types.ts'
10
+ * @import { Accumulator, List } from '../../types/list/types.ts'
11
+ * @import { Absorbing, Monoid } from './types.ts'
12
12
  */
13
13
  import type { Fold } from '../../types/function/operator/types.ts';
14
14
  import type { List } from '../../types/list/types.ts';
15
- import type { Monoid } from './types.ts';
15
+ import type { Absorbing, Monoid } from './types.ts';
16
16
  /**
17
17
  * Repeats a monoid operation `n` times on the given element `a`.
18
18
  * This function efficiently performs the operation using exponentiation by squaring.
@@ -43,6 +43,12 @@ import type { Monoid } from './types.ts';
43
43
  * ```
44
44
  */
45
45
  export declare const repeat: <T>({ identity, operation }: Monoid<T>) => Fold<bigint, T>;
46
+ export type _Run<T> = {
47
+ readonly size: number;
48
+ readonly value: T;
49
+ readonly rest: _Stack<T>;
50
+ };
51
+ export type _Stack<T> = _Run<T> | null;
46
52
  /**
47
53
  * Reduces a `List<T>` with the monoid's associative `operation`, seeded at its
48
54
  * `identity`. An empty list folds to `identity`.
@@ -54,12 +60,26 @@ export declare const repeat: <T>({ identity, operation }: Monoid<T>) => Fold<big
54
60
  * so the identity paired with each operation is stated once at the call site
55
61
  * instead of hand-seeding a raw `reduce`.
56
62
  *
57
- * Like `repeat`, `fold` applies the operation **accumulator-first**:
58
- * `operation(accumulator)(element)`, seeded at `identity`, so
59
- * `[a, b, c]` folds to `((identity op a) op b) op c`. Left-to-right order is
60
- * therefore preserved and `fold` is correct for non-commutative monoids (e.g.
61
- * string concatenation as `a => b => a + b`). `list.reduce` calls its reducer
62
- * element-first, so the operation is `flip`ped before it is handed over.
63
+ * The reduction is **balanced**, not a left fold: `[a, b, c, d]` folds to
64
+ * `(a op b) op (c op d)`, not `((a op b) op c) op d`. A `Monoid`'s
65
+ * associativity is what licenses the re-grouping `list.reduce` takes an
66
+ * arbitrary operation with no such contract and therefore stays strictly
67
+ * left-to-right. Balancing matters for size-growing exact operations
68
+ * (`bigint.product`, `string`/`bit_vec` concatenation): a left fold grows the
69
+ * accumulator while every new operand stays small, so step *k* costs work
70
+ * proportional to *k* and the total is O(n²), while merging runs of comparable
71
+ * size costs O(n log n). It is the list-shaped sibling of {@link repeat}'s
72
+ * exponentiation by squaring.
73
+ *
74
+ * Only the grouping changes, never the order: each merge keeps the earlier
75
+ * operand on the left, so `fold` stays correct for non-commutative monoids
76
+ * (e.g. string concatenation as `a => b => a + b`).
77
+ *
78
+ * Re-grouping does move the rounding of an inexact operation. IEEE-754 addition
79
+ * is not truly associative, so `number.sum` returns a (marginally more
80
+ * accurate — O(log n · ε) instead of O(n · ε)) different value than a left fold
81
+ * for some inputs. That is a consequence of the uniform treatment, not a goal:
82
+ * a `Monoid` promises associativity, and every monoid folds the same way.
63
83
  *
64
84
  * @template T The type of the elements in the monoid.
65
85
  * @param {Monoid<T>} monoid The monoid structure, including the identity and binary operation.
@@ -84,4 +104,42 @@ export declare const repeat: <T>({ identity, operation }: Monoid<T>) => Fold<big
84
104
  * fold(concat)(['a', 'b', 'c']) // 'abc' — order preserved
85
105
  * ```
86
106
  */
87
- export declare const fold: <T>({ identity, operation }: Monoid<T>) => (list: List<T>) => T;
107
+ export declare const fold: <T>(monoid: Monoid<T>) => (list: List<T>) => T;
108
+ /**
109
+ * {@link fold} for a monoid with an absorbing element, stopping at the first
110
+ * element that reaches it.
111
+ *
112
+ * The result is the same as `fold`'s — combining `absorbing` with the rest of
113
+ * the list is `absorbing` again — but the rest of the list is never read. That
114
+ * is what makes it usable on an unbounded lazy `List`, where `fold` keeps
115
+ * pulling elements forever after the answer is already decided.
116
+ *
117
+ * It stops as soon as a **run** reaches `absorbing`: immediately when an element
118
+ * is absorbing on its own (`0` in a product), otherwise at the merge that first
119
+ * produces it. When only a combination is absorbing — `bit_vec`'s length cap —
120
+ * that merge can lag the element that actually decided the answer, because runs
121
+ * merge at power-of-two boundaries: at most one doubling, so under twice as many
122
+ * elements as a left fold's per-element check would read. Bounded either way,
123
+ * which is the property that matters against an unbounded list.
124
+ *
125
+ * Grouping, order, and the `log2(n)` stack bound are `fold`'s; only the walk
126
+ * gains an exit. `foldAbsorbing(a)(list)` and `fold(a.monoid)(list)` agree on
127
+ * every finite list, including one whose folded value is itself `null`.
128
+ *
129
+ * @template T The type of the elements in the monoid.
130
+ * @param {Absorbing<T>} absorbing The monoid together with its absorbing element.
131
+ * @returns {(list: List<T>) => T} A function that reduces a `List<T>` to a single `T`.
132
+ *
133
+ * @example
134
+ *
135
+ * ```ts
136
+ * const multiply: Absorbing<number> = {
137
+ * monoid: { identity: 1, operation: a => b => a * b },
138
+ * absorbing: 0,
139
+ * }
140
+ *
141
+ * foldAbsorbing(multiply)([2, 3, 4]) // 24
142
+ * foldAbsorbing(multiply)([2, 0, 4]) // 0 — `4` is never read
143
+ * ```
144
+ */
145
+ export declare const foldAbsorbing: <T>({ monoid, absorbing }: Absorbing<T>) => (list: List<T>) => T;
@@ -2,17 +2,17 @@
2
2
  * Monoids: the `Monoid<T>` algebraic structure (identity plus associative
3
3
  * binary operation), `repeat`, which applies the operation `n` times using
4
4
  * exponentiation by squaring, and `fold`, which applies it across every element
5
- * of a list.
5
+ * of a list as a balanced binary tree.
6
6
  *
7
7
  * @module
8
8
  *
9
- * @import { Fold } from '../../types/function/operator/types.ts'
10
- * @import { List } from '../../types/list/types.ts'
11
- * @import { Monoid } from './types.ts'
9
+ * @import { Fold, Reduce } from '../../types/function/operator/types.ts'
10
+ * @import { Accumulator, List } from '../../types/list/types.ts'
11
+ * @import { Absorbing, Monoid } from './types.ts'
12
12
  */
13
13
 
14
- import { reduce } from '../../types/list/module.f.mjs'
15
- import { flip } from '../../types/function/module.f.mjs'
14
+ import { fold as listFold, tryFold } from '../../types/list/module.f.mjs'
15
+ import { compose } from '../../types/function/module.f.mjs'
16
16
 
17
17
  /**
18
18
  * Repeats a monoid operation `n` times on the given element `a`.
@@ -59,6 +59,72 @@ export const repeat = ({ identity, operation }) => n => a => {
59
59
  }
60
60
  }
61
61
 
62
+ /**
63
+ * A run of `size` already-combined elements. Runs live on a stack whose top is
64
+ * the most recent — and smallest — run, so `rest` holds everything to the left
65
+ * of `value`.
66
+ *
67
+ * @template T
68
+ * @typedef {{
69
+ * readonly size: number
70
+ * readonly value: T
71
+ * readonly rest: _Stack<T>
72
+ * }} _Run
73
+ */
74
+
75
+ /**
76
+ * A stack of runs, `null` when empty.
77
+ *
78
+ * @template T
79
+ * @typedef {_Run<T> | null} _Stack
80
+ */
81
+
82
+ /**
83
+ * Pushes a run of `size` combined elements onto the stack, merging while the
84
+ * top run has the same size — exactly the carry of incrementing a binary
85
+ * counter, so every merge joins two runs of equal size and the stack never
86
+ * holds more than `log2(n)` runs.
87
+ *
88
+ * The merge keeps the earlier run on the left (`operation(stack.value)(value)`),
89
+ * so re-associating never re-orders.
90
+ *
91
+ * The result is always a run, never the empty stack — which is what lets
92
+ * {@link absorbingAccumulator} read `null` as a stop signal rather than a state.
93
+ *
94
+ * @type {<T>(operation: Reduce<T>) => (size: number) => (value: T) => (stack: _Stack<T>) => _Run<T>}
95
+ */
96
+ const push = operation => size => value => stack =>
97
+ stack === null || stack.size !== size
98
+ ? { size, value, rest: stack }
99
+ : push(operation)(size * 2)(operation(stack.value)(value))(stack.rest)
100
+
101
+ /**
102
+ * `push` seeded for a single element — the step both {@link fold} and
103
+ * {@link absorbingAccumulator} walk a list with.
104
+ *
105
+ * @type {<T>(operation: Reduce<T>) => (value: T) => (stack: _Stack<T>) => _Run<T>}
106
+ */
107
+ const step = operation => push(operation)(1)
108
+
109
+ /**
110
+ * {@link step} seen as the {@link Fold} `list.fold` takes: the same function,
111
+ * with its result widened from a run to the stack `list.fold` threads.
112
+ *
113
+ * @type {<T>(operation: Reduce<T>) => Fold<T, _Stack<T>>}
114
+ */
115
+ const foldStep = step
116
+
117
+ /**
118
+ * Combines the stack's runs into one value, earliest (bottom, largest) first,
119
+ * seeded at `identity`.
120
+ *
121
+ * @type {<T>(monoid: Monoid<T>) => (stack: _Stack<T>) => T}
122
+ */
123
+ const combine = monoid => stack =>
124
+ stack === null
125
+ ? monoid.identity
126
+ : monoid.operation(combine(monoid)(stack.rest))(stack.value)
127
+
62
128
  /**
63
129
  * Reduces a `List<T>` with the monoid's associative `operation`, seeded at its
64
130
  * `identity`. An empty list folds to `identity`.
@@ -70,12 +136,26 @@ export const repeat = ({ identity, operation }) => n => a => {
70
136
  * so the identity paired with each operation is stated once at the call site
71
137
  * instead of hand-seeding a raw `reduce`.
72
138
  *
73
- * Like `repeat`, `fold` applies the operation **accumulator-first**:
74
- * `operation(accumulator)(element)`, seeded at `identity`, so
75
- * `[a, b, c]` folds to `((identity op a) op b) op c`. Left-to-right order is
76
- * therefore preserved and `fold` is correct for non-commutative monoids (e.g.
77
- * string concatenation as `a => b => a + b`). `list.reduce` calls its reducer
78
- * element-first, so the operation is `flip`ped before it is handed over.
139
+ * The reduction is **balanced**, not a left fold: `[a, b, c, d]` folds to
140
+ * `(a op b) op (c op d)`, not `((a op b) op c) op d`. A `Monoid`'s
141
+ * associativity is what licenses the re-grouping `list.reduce` takes an
142
+ * arbitrary operation with no such contract and therefore stays strictly
143
+ * left-to-right. Balancing matters for size-growing exact operations
144
+ * (`bigint.product`, `string`/`bit_vec` concatenation): a left fold grows the
145
+ * accumulator while every new operand stays small, so step *k* costs work
146
+ * proportional to *k* and the total is O(n²), while merging runs of comparable
147
+ * size costs O(n log n). It is the list-shaped sibling of {@link repeat}'s
148
+ * exponentiation by squaring.
149
+ *
150
+ * Only the grouping changes, never the order: each merge keeps the earlier
151
+ * operand on the left, so `fold` stays correct for non-commutative monoids
152
+ * (e.g. string concatenation as `a => b => a + b`).
153
+ *
154
+ * Re-grouping does move the rounding of an inexact operation. IEEE-754 addition
155
+ * is not truly associative, so `number.sum` returns a (marginally more
156
+ * accurate — O(log n · ε) instead of O(n · ε)) different value than a left fold
157
+ * for some inputs. That is a consequence of the uniform treatment, not a goal:
158
+ * a `Monoid` promises associativity, and every monoid folds the same way.
79
159
  *
80
160
  * @template T The type of the elements in the monoid.
81
161
  * @param {Monoid<T>} monoid The monoid structure, including the identity and binary operation.
@@ -100,5 +180,88 @@ export const repeat = ({ identity, operation }) => n => a => {
100
180
  * fold(concat)(['a', 'b', 'c']) // 'abc' — order preserved
101
181
  * ```
102
182
  */
103
- export const fold = ({ identity, operation }) =>
104
- reduce(flip(operation))(identity)
183
+ export const fold = monoid =>
184
+ compose(listFold(foldStep(monoid.operation))(null))(combine(monoid))
185
+
186
+ /**
187
+ * The run stack as a short-circuiting {@link Accumulator}: `update` returns
188
+ * `null` — `tryFold`'s stop signal — as soon as a merge produces the absorbing
189
+ * element.
190
+ *
191
+ * Only the newest run can be `absorbing`: an earlier one would have stopped the
192
+ * walk already.
193
+ *
194
+ * `end` wraps the folded value in a one-element tuple because `tryFold` reports
195
+ * both "stopped" and "finished with this result" through the same
196
+ * `Nullable<R>`: a monoid whose `T` includes `null` would otherwise be unable to
197
+ * tell a completed fold that produced `null` from an abandoned walk. The tuple
198
+ * costs one allocation per fold, not per element.
199
+ */
200
+ const absorbingAccumulator =
201
+ /**
202
+ * @template T
203
+ * @param {Monoid<T>} monoid
204
+ */
205
+ monoid => {
206
+ const p = step(monoid.operation)
207
+ const c = combine(monoid)
208
+ /**
209
+ * @param {T} absorbing
210
+ * @returns {Accumulator<T, _Stack<T>, readonly[T]>}
211
+ */
212
+ return absorbing => ({
213
+ init: null,
214
+ update: (value, stack) => {
215
+ const next = p(value)(stack)
216
+ return next.value === absorbing ? null : next
217
+ },
218
+ end: stack => [c(stack)],
219
+ })
220
+ }
221
+
222
+ /**
223
+ * {@link fold} for a monoid with an absorbing element, stopping at the first
224
+ * element that reaches it.
225
+ *
226
+ * The result is the same as `fold`'s — combining `absorbing` with the rest of
227
+ * the list is `absorbing` again — but the rest of the list is never read. That
228
+ * is what makes it usable on an unbounded lazy `List`, where `fold` keeps
229
+ * pulling elements forever after the answer is already decided.
230
+ *
231
+ * It stops as soon as a **run** reaches `absorbing`: immediately when an element
232
+ * is absorbing on its own (`0` in a product), otherwise at the merge that first
233
+ * produces it. When only a combination is absorbing — `bit_vec`'s length cap —
234
+ * that merge can lag the element that actually decided the answer, because runs
235
+ * merge at power-of-two boundaries: at most one doubling, so under twice as many
236
+ * elements as a left fold's per-element check would read. Bounded either way,
237
+ * which is the property that matters against an unbounded list.
238
+ *
239
+ * Grouping, order, and the `log2(n)` stack bound are `fold`'s; only the walk
240
+ * gains an exit. `foldAbsorbing(a)(list)` and `fold(a.monoid)(list)` agree on
241
+ * every finite list, including one whose folded value is itself `null`.
242
+ *
243
+ * @template T The type of the elements in the monoid.
244
+ * @param {Absorbing<T>} absorbing The monoid together with its absorbing element.
245
+ * @returns {(list: List<T>) => T} A function that reduces a `List<T>` to a single `T`.
246
+ *
247
+ * @example
248
+ *
249
+ * ```ts
250
+ * const multiply: Absorbing<number> = {
251
+ * monoid: { identity: 1, operation: a => b => a * b },
252
+ * absorbing: 0,
253
+ * }
254
+ *
255
+ * foldAbsorbing(multiply)([2, 3, 4]) // 24
256
+ * foldAbsorbing(multiply)([2, 0, 4]) // 0 — `4` is never read
257
+ * ```
258
+ */
259
+ export const foldAbsorbing = ({ monoid, absorbing }) => {
260
+ const f = tryFold(absorbingAccumulator(monoid)(absorbing))
261
+ return list => {
262
+ const result = f(list)
263
+ if (result === null) { return absorbing }
264
+ const [value] = result
265
+ return value
266
+ }
267
+ }
@@ -1,4 +1,8 @@
1
- /** @import { Monoid } from './types.ts' */
1
+ /**
2
+ * @import { List } from '../../types/list/types.ts'
3
+ * @import { Nullable } from '../../types/nullable/types.ts'
4
+ * @import { Absorbing, Monoid } from './types.ts'
5
+ */
2
6
  export declare const proof: {
3
7
  numberAdd: () => void;
4
8
  stringConcat: () => void;
@@ -6,5 +10,12 @@ export declare const proof: {
6
10
  nonEmpty: () => void;
7
11
  order: () => void;
8
12
  empty: () => void;
13
+ balanced: () => void;
14
+ };
15
+ foldAbsorbing: {
16
+ plain: () => void;
17
+ absorbed: () => void;
18
+ nullValued: () => void;
19
+ stopsEarly: () => void;
9
20
  };
10
21
  };
@@ -1,7 +1,20 @@
1
- /** @import { Monoid } from './types.ts' */
1
+ /**
2
+ * @import { List } from '../../types/list/types.ts'
3
+ * @import { Nullable } from '../../types/nullable/types.ts'
4
+ * @import { Absorbing, Monoid } from './types.ts'
5
+ */
2
6
 
3
- import { repeat, fold } from './module.f.mjs'
4
- import { assertEq } from '../../asserts/module.f.mjs'
7
+ import { repeat, fold, foldAbsorbing } from './module.f.mjs'
8
+ import { assert, assertEq } from '../../asserts/module.f.mjs'
9
+
10
+ /** @type {Absorbing<number>} */
11
+ const multiply = {
12
+ monoid: {
13
+ identity: 1,
14
+ operation: a => b => a * b,
15
+ },
16
+ absorbing: 0,
17
+ }
5
18
 
6
19
  export const proof = {
7
20
  numberAdd: () => {
@@ -54,5 +67,76 @@ export const proof = {
54
67
  // an empty list folds to the identity
55
68
  assertEq(fold(concat)([]), '')
56
69
  },
57
- }
70
+ balanced: () => {
71
+ // `operation` brackets each combination so the *grouping* `fold`
72
+ // chose is visible in the result. It is deliberately **not**
73
+ // associative — a lawful monoid could not observe the grouping at
74
+ // all, which is exactly why re-associating is allowed. The identity
75
+ // still behaves as one (both branches return the other operand
76
+ // unchanged), so `fold`'s contract is respected.
77
+ /** @type {Monoid<string>} */
78
+ const bracket = {
79
+ identity: '',
80
+ operation: a => b => a === '' ? b : b === '' ? a : `(${a}${b})`,
81
+ }
82
+ const f = fold(bracket)
83
+ assertEq(f(['a']), 'a')
84
+ assertEq(f(['a', 'b']), '(ab)')
85
+ // three elements keep the trailing run separate: `c` merges with
86
+ // nothing, so it combines against `(ab)` only at the end.
87
+ assertEq(f(['a', 'b', 'c']), '((ab)c)')
88
+ // four is where balancing separates from a left fold, which would
89
+ // give `(((ab)c)d)`.
90
+ assertEq(f(['a', 'b', 'c', 'd']), '((ab)(cd))')
91
+ assertEq(f(['a', 'b', 'c', 'd', 'e']), '(((ab)(cd))e)')
92
+ },
93
+ },
94
+ foldAbsorbing: {
95
+ plain: () => {
96
+ // with no absorbing element in the list, it is `fold`
97
+ assertEq(foldAbsorbing(multiply)([2, 3, 4]), 24)
98
+ assertEq(foldAbsorbing(multiply)([]), 1)
99
+ assertEq(foldAbsorbing(multiply)([2, 3, 4]), fold(multiply.monoid)([2, 3, 4]))
100
+ },
101
+ absorbed: () => {
102
+ assertEq(foldAbsorbing(multiply)([2, 0, 4]), 0)
103
+ },
104
+ nullValued: () => {
105
+ // `min` over non-negative numbers, where `null` is the identity
106
+ // (+infinity) and `0` is the absorbing element. `T` therefore
107
+ // includes `null` without `null` being the stop condition — and
108
+ // `tryFold` signals "stopped" and "finished" through one
109
+ // `Nullable`, so a completed fold whose value is `null` must not be
110
+ // read as an abandoned walk.
111
+ /** @type {Absorbing<Nullable<number>>} */
112
+ const min = {
113
+ monoid: {
114
+ identity: null,
115
+ operation: a => b =>
116
+ a === null ? b : b === null ? a : a <= b ? a : b,
117
+ },
118
+ absorbing: 0,
119
+ }
120
+ assertEq(foldAbsorbing(min)([]), null)
121
+ assertEq(foldAbsorbing(min)([3, null, 5]), 3)
122
+ assertEq(foldAbsorbing(min)([3, 0, 5]), 0)
123
+ },
124
+ stopsEarly: () => {
125
+ // `List` includes `Thunk`, so this list is unbounded: `fold` would
126
+ // pull from it forever. The elements past the absorbing one assert
127
+ // that they are never read.
128
+ /** @type {(n: number) => List<number>} */
129
+ const rest = n => () => {
130
+ assert(false)
131
+ return { first: n, tail: rest(n + 1) }
132
+ }
133
+ // `0` is absorbing on its own, so the walk stops at the element
134
+ // itself...
135
+ assertEq(foldAbsorbing(multiply)({ first: 0, tail: rest(1) }), 0)
136
+ // ...and here only the merge of `2` and `0` reaches it.
137
+ assertEq(
138
+ foldAbsorbing(multiply)({ first: 2, tail: { first: 0, tail: rest(1) } }),
139
+ 0)
140
+ },
141
+ },
58
142
  }
@@ -48,3 +48,26 @@ export type Monoid<T> = {
48
48
  readonly identity: T;
49
49
  readonly operation: Reduce<T>;
50
50
  };
51
+ /**
52
+ * A monoid that additionally has an
53
+ * {@link https://en.wikipedia.org/wiki/Absorbing_element absorbing element}
54
+ * (also called a zero or annihilator): a value that swallows the operation
55
+ * from either side.
56
+ *
57
+ * For all `a`: `operation(absorbing)(a) = operation(a)(absorbing) = absorbing`.
58
+ *
59
+ * Once a fold reaches `absorbing`, the result is decided — every remaining
60
+ * element combines to `absorbing` again — so `foldAbsorbing` may stop reading
61
+ * the list there instead of walking to its end. That is the difference between
62
+ * answering and not returning at all when the list is an unbounded `Thunk`.
63
+ *
64
+ * Multiplication over numbers has `0`; `bit_vec`'s length-capped concatenation
65
+ * has `null`, meaning "longer than `maxLength`".
66
+ *
67
+ * The monoid is carried as a field rather than intersected in, so it stays
68
+ * independently constructed and consumed (`fjs/AGENTS.md` §3.2).
69
+ */
70
+ export type Absorbing<T> = {
71
+ readonly monoid: Monoid<T>;
72
+ readonly absorbing: T;
73
+ };
@@ -44,8 +44,8 @@ const iPad = vec8(0x36n)
44
44
  * that takes a message and computes the HMAC.
45
45
  */
46
46
  export const hmac = hashFunc => {
47
- const { blockLength } = hashFunc
48
- const p = repeat(blockLength >> 3n)
47
+ const { blockLength, blockBytes } = hashFunc
48
+ const p = repeat(blockBytes)
49
49
  const ip = p(iPad)
50
50
  const op = p(oPad)
51
51
  const c = computeSync(hashFunc)
@@ -1,4 +1,6 @@
1
- /** @import { Point, Curve, Init } from './types.ts' */
1
+ /**
2
+ * @import { Point, Curve, Init } from './types.ts'
3
+ */
2
4
  export declare const proof: {
3
5
  example: () => void;
4
6
  test: () => void;
@@ -1,4 +1,6 @@
1
- /** @import { Point, Curve, Init } from './types.ts' */
1
+ /**
2
+ * @import { Point, Curve, Init } from './types.ts'
3
+ */
2
4
 
3
5
  import { assert, assertEq, assertNotNullish } from '../../asserts/module.f.mjs'
4
6
  import { prime_field } from '../../types/prime_field/module.f.mjs'
@@ -11,7 +11,7 @@
11
11
  * @import { Base, Sha2, State, V16, V8 } from './types.ts'
12
12
  */
13
13
 
14
- import { mask } from '../../types/bigint/module.f.mjs'
14
+ import { divUp8, mask } from '../../types/bigint/module.f.mjs'
15
15
  import {
16
16
  vec,
17
17
  length,
@@ -257,6 +257,8 @@ const base = ({ logBitLen, k, bs0, bs1, ss0, ss1 }) => {
257
257
  const sha2 = ({ append, end, chunkLength }, hash, hashLength) => ({
258
258
  hashLength,
259
259
  blockLength: chunkLength,
260
+ hashBytes: divUp8(hashLength),
261
+ blockBytes: divUp8(chunkLength),
260
262
  init: {
261
263
  hash,
262
264
  len: 0n,
@@ -1,4 +1,6 @@
1
- /** @import { Sha2 } from './types.ts' */
1
+ /**
2
+ * @import { Sha2 } from './types.ts'
3
+ */
2
4
  export declare const proof: {
3
5
  base: {
4
6
  b32: () => {
@@ -20,6 +22,7 @@ export declare const proof: {
20
22
  sha512x256: () => void;
21
23
  sha512x224: () => void;
22
24
  };
25
+ byteLengths: (() => void)[];
23
26
  utf8: (() => void)[];
24
27
  fill: () => {
25
28
  8: () => void;
@@ -1,4 +1,6 @@
1
- /** @import { Sha2 } from './types.ts' */
1
+ /**
2
+ * @import { Sha2 } from './types.ts'
3
+ */
2
4
 
3
5
  import { utf8 } from '../../text/module.f.mjs'
4
6
  import { repeat, uint, vec } from '../../types/bit_vec/module.f.mjs'
@@ -7,6 +9,19 @@ import { assertEq } from '../../asserts/module.f.mjs'
7
9
  import { map } from '../../types/list/module.f.mjs'
8
10
  import { base32, base64, computeSync, sha224, sha256, sha384, sha512, sha512x224, sha512x256 } from './module.f.mjs'
9
11
 
12
+ /**
13
+ * Every SHA-2 length is a whole number of bytes, so the rounded-up byte count
14
+ * and the exact division agree — this pins both that identity and the values.
15
+ *
16
+ * @type {(sha2: Sha2) => (hashBytes: bigint, blockBytes: bigint) => void}
17
+ */
18
+ const checkBytes = ({ hashLength, blockLength, hashBytes, blockBytes }) => (h, b) => {
19
+ assertEq(hashBytes, h)
20
+ assertEq(blockBytes, b)
21
+ assertEq(hashBytes, hashLength >> 3n)
22
+ assertEq(blockBytes, blockLength >> 3n)
23
+ }
24
+
10
25
  /** @type {(sha2: Sha2) => (x: bigint) => void} */
11
26
  const checkEmpty = ({ init, end, hashLength }) => x => {
12
27
  const result = end(init)
@@ -69,6 +84,17 @@ export const proof = {
69
84
  sha512x256: () => checkEmpty(sha512x256)(0xc672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967an),
70
85
  sha512x224: () => checkEmpty(sha512x224)(0x6ed0dd02806fa89e25de060c19d3ac86cabb87d6a0ddd05c333b84f4n),
71
86
  },
87
+ // The byte counts consumers read instead of converting bit lengths
88
+ // themselves. Asserted against the bit length each is derived from, not
89
+ // against a hand-written number, so the pairing is what is pinned.
90
+ byteLengths: [
91
+ () => checkBytes(sha224)(28n, 64n),
92
+ () => checkBytes(sha256)(32n, 64n),
93
+ () => checkBytes(sha384)(48n, 128n),
94
+ () => checkBytes(sha512)(64n, 128n),
95
+ () => checkBytes(sha512x224)(28n, 128n),
96
+ () => checkBytes(sha512x256)(32n, 128n),
97
+ ],
72
98
  utf8: [
73
99
  () => {
74
100
  const e = 0x730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525n
@@ -51,6 +51,17 @@ export type Base = {
51
51
  export type Sha2 = {
52
52
  readonly hashLength: bigint;
53
53
  readonly blockLength: bigint;
54
+ /**
55
+ * `hashLength` and `blockLength` in whole bytes, rounded up. Consumers
56
+ * that size a byte buffer read these instead of converting: `hmac` and
57
+ * `sign` each used to do it themselves, with two different spellings
58
+ * (`>> 3n` and `divUp8`), leaving a reader to work out per site whether
59
+ * the two roundings agree. They do for every SHA-2 variant, whose lengths
60
+ * are byte multiples — which is exactly why the decision belongs here
61
+ * once rather than at each call site.
62
+ */
63
+ readonly hashBytes: bigint;
64
+ readonly blockBytes: bigint;
54
65
  readonly init: State;
55
66
  readonly append: Fold<Vec, State>;
56
67
  readonly end: (state: State) => Vec;
@@ -12,7 +12,7 @@
12
12
  */
13
13
 
14
14
  import { assertNotNullish } from '../../asserts/module.f.mjs'
15
- import { bitLength, divUp8, roundUp8 } from '../../types/bigint/module.f.mjs'
15
+ import { bitLength, roundUp8 } from '../../types/bigint/module.f.mjs'
16
16
  import { empty, length, msb, repeat, unpack, vec, vec8 } from '../../types/bit_vec/module.f.mjs'
17
17
  import { hmac } from '../hmac/module.f.mjs'
18
18
  import { computeSync } from '../sha2/module.f.mjs'
@@ -75,7 +75,7 @@ export const computeK =
75
75
  // step and all subsequent steps, we use the same H function as the
76
76
  // one used in step 'a' to process the input message; this choice
77
77
  // will be discussed in more detail in Section 3.6.
78
- const rep = repeat(divUp8(hf.hashLength))
78
+ const rep = repeat(hf.hashBytes)
79
79
  const v0 = rep(x01)
80
80
  // c. Set:
81
81
  // K = 0x00 0x00 0x00 ... 0x00
@@ -1,8 +1,27 @@
1
+ /**
2
+ * Sloth verifiable delay function over a fixed 3072-bit safe prime.
3
+ *
4
+ * See `./types.ts` for the `Sloth` type-level API.
5
+ *
6
+ * @module
7
+ *
8
+ * @example
9
+ *
10
+ * ```js
11
+ * import { sloth } from './module.f.mjs'
12
+ *
13
+ * const steps = 4n
14
+ * const x = 42n
15
+ * const y = sloth.eval(steps)(x)
16
+ * if (y === null || !sloth.verify(steps)(x)(y)) { throw y }
17
+ * ```
18
+ *
19
+ * @import { PrimeField } from '../../types/prime_field/types.ts'
20
+ * @import { Nullable } from '../../types/nullable/types.ts'
21
+ * @import { Unary } from '../../types/bigint/types.ts'
22
+ * @import { Sloth } from './types.ts'
23
+ */
1
24
  import type { Sloth } from './types.ts';
2
- /** @import { PrimeField } from '../../types/prime_field/types.ts' */
3
- /** @import { Nullable } from '../../types/nullable/types.ts' */
4
- /** @import { Unary } from '../../types/bigint/types.ts' */
5
- /** @import { Sloth } from './types.ts' */
6
25
  /** Sloth VDF modulus (3072-bit safe prime, same as reference implementations). */
7
26
  export declare const p = 170082004324204494273811327264862981553264701145937538369570764779791492622392118654022654452947093285873855529044371650895045691292912712699015605832276411308653107069798639938826015099738961427172366594187783204437869906954750443653318078358839409699824714551430573905637228307966826784684174483831608534979n;
8
27
  /**