functionalscript 0.37.0 → 0.39.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 (517) hide show
  1. package/README.md +1 -1
  2. package/{fs → fjs}/asn.1/proof.f.js +32 -94
  3. package/fjs/asserts/module.f.d.ts +36 -0
  4. package/fjs/asserts/module.f.js +39 -0
  5. package/fjs/asserts/proof.f.d.ts +11 -0
  6. package/fjs/asserts/proof.f.js +18 -0
  7. package/{fs → fjs}/base_n/proof.f.js +12 -36
  8. package/{fs → fjs}/basen/base64/proof.f.d.ts +1 -0
  9. package/{fs → fjs}/basen/base64/proof.f.js +15 -1
  10. package/{fs → fjs}/basen/cbase32/proof.f.js +15 -42
  11. package/fjs/bnf/data/module.f.d.ts +52 -0
  12. package/{fs → fjs}/bnf/data/module.f.js +53 -3
  13. package/{fs → fjs}/bnf/data/proof.f.d.ts +1 -0
  14. package/{fs → fjs}/bnf/data/proof.f.js +54 -19
  15. package/{fs → fjs}/bnf/descent/module.f.d.ts +4 -14
  16. package/fjs/bnf/descent/module.f.js +124 -0
  17. package/{fs → fjs}/bnf/descent/proof.f.d.ts +1 -0
  18. package/{fs → fjs}/bnf/descent/proof.f.js +55 -24
  19. package/{fs → fjs}/bnf/ll1/module.f.d.ts +4 -4
  20. package/{fs → fjs}/bnf/ll1/module.f.js +7 -5
  21. package/{fs → fjs}/bnf/ll1/proof.f.d.ts +1 -0
  22. package/{fs → fjs}/bnf/ll1/proof.f.js +27 -10
  23. package/{fs → fjs}/bnf/module.f.d.ts +19 -5
  24. package/{fs → fjs}/bnf/module.f.js +10 -11
  25. package/fjs/bnf/proof.f.js +69 -0
  26. package/{fs → fjs}/bnf/testlib.f.js +2 -2
  27. package/fjs/bnf/token_symbol/module.f.d.ts +38 -0
  28. package/fjs/bnf/token_symbol/module.f.js +48 -0
  29. package/fjs/bnf/token_symbol/proof.f.d.ts +10 -0
  30. package/fjs/bnf/token_symbol/proof.f.js +37 -0
  31. package/{fs → fjs}/cas/cli/module.f.js +6 -9
  32. package/{fs → fjs}/cas/cli/proof.f.d.ts +4 -1
  33. package/{fs → fjs}/cas/cli/proof.f.js +29 -66
  34. package/fjs/cas/evo/mcp/module.f.d.ts +27 -0
  35. package/fjs/cas/evo/mcp/module.f.js +94 -0
  36. package/fjs/cas/evo/mcp/proof.f.d.ts +11 -0
  37. package/fjs/cas/evo/mcp/proof.f.js +126 -0
  38. package/fjs/cas/evo/module.f.d.ts +202 -0
  39. package/fjs/cas/evo/module.f.js +421 -0
  40. package/fjs/cas/evo/proof.f.d.ts +39 -0
  41. package/fjs/cas/evo/proof.f.js +572 -0
  42. package/fjs/cas/mcp/module.f.d.ts +49 -0
  43. package/{fs → fjs}/cas/mcp/module.f.js +61 -81
  44. package/{fs → fjs}/cas/mcp/proof.f.d.ts +4 -1
  45. package/{fs → fjs}/cas/mcp/proof.f.js +45 -17
  46. package/{fs → fjs}/cas/module.f.d.ts +10 -0
  47. package/{fs → fjs}/cas/module.f.js +89 -36
  48. package/fjs/cas/proof.f.d.ts +18 -0
  49. package/fjs/cas/proof.f.js +305 -0
  50. package/{fs → fjs}/ci/bun/module.f.js +3 -3
  51. package/{fs → fjs}/ci/common/module.f.d.ts +1 -2
  52. package/{fs → fjs}/ci/common/module.f.js +1 -5
  53. package/{fs → fjs}/ci/config/module.f.d.ts +8 -8
  54. package/{fs → fjs}/ci/config/module.f.js +8 -8
  55. package/{fs → fjs}/ci/deno/module.f.js +3 -3
  56. package/{fs → fjs}/ci/module.f.js +3 -4
  57. package/{fs → fjs}/ci/node/module.f.js +11 -9
  58. package/{fs → fjs}/ci/proof.f.js +16 -9
  59. package/{fs → fjs}/ci/rust/module.f.js +9 -1
  60. package/{fs → fjs}/cli/module.f.js +2 -2
  61. package/{fs → fjs}/cli/proof.f.js +22 -63
  62. package/{fs → fjs}/common/monoid/module.f.d.ts +46 -2
  63. package/fjs/common/monoid/module.f.js +88 -0
  64. package/fjs/common/monoid/proof.f.d.ts +9 -0
  65. package/fjs/common/monoid/proof.f.js +48 -0
  66. package/{fs → fjs}/crypto/hmac/proof.f.js +4 -12
  67. package/fjs/crypto/pow/proof.f.js +111 -0
  68. package/{fs → fjs}/crypto/secp/proof.f.js +12 -33
  69. package/{fs → fjs}/crypto/sha2/proof.f.js +18 -49
  70. package/{fs → fjs}/crypto/sign/module.f.d.ts +0 -5
  71. package/{fs → fjs}/crypto/sign/module.f.js +7 -4
  72. package/{fs → fjs}/crypto/sign/proof.f.js +36 -105
  73. package/{fs → fjs}/crypto/vdf/proof.f.js +22 -63
  74. package/{fs → fjs}/dev/module.f.js +25 -25
  75. package/{fs → fjs}/dev/package_json/proof.f.js +7 -7
  76. package/{fs → fjs}/dev/proof.f.js +2 -4
  77. package/{fs → fjs}/djs/ast/proof.f.js +4 -12
  78. package/{fs → fjs}/djs/module.f.js +5 -8
  79. package/{fs → fjs}/djs/parser/module.f.d.ts +8 -0
  80. package/{fs → fjs}/djs/parser/module.f.js +37 -0
  81. package/{fs → fjs}/djs/parser/proof.f.js +138 -400
  82. package/{fs → fjs}/djs/proof.f.js +13 -36
  83. package/{fs → fjs}/djs/serializer/proof.f.js +14 -39
  84. package/fjs/djs/tokenizer/module.f.d.ts +24 -0
  85. package/fjs/djs/tokenizer/module.f.js +472 -0
  86. package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.d.ts +4 -3
  87. package/{fs/djs/tokenizer-new → fjs/djs/tokenizer}/proof.f.js +446 -445
  88. package/{fs → fjs}/djs/transpiler/module.f.js +6 -6
  89. package/{fs → fjs}/djs/transpiler/proof.f.d.ts +3 -0
  90. package/{fs → fjs}/djs/transpiler/proof.f.js +29 -30
  91. package/fjs/effects/eff/module.f.d.ts +72 -0
  92. package/fjs/effects/eff/module.f.js +46 -0
  93. package/fjs/effects/eff/proof.f.d.ts +11 -0
  94. package/fjs/effects/eff/proof.f.js +58 -0
  95. package/{fs → fjs}/effects/list/module.f.d.ts +11 -5
  96. package/{fs → fjs}/effects/list/module.f.js +2 -1
  97. package/{fs → fjs}/effects/memory/proof.f.js +15 -29
  98. package/fjs/effects/module.f.d.ts +388 -0
  99. package/fjs/effects/module.f.js +288 -0
  100. package/{fs → fjs}/effects/node/memory/proof.js +7 -13
  101. package/{fs → fjs}/effects/node/module.d.ts +1 -1
  102. package/{fs → fjs}/effects/node/module.f.d.ts +2 -2
  103. package/{fs → fjs}/effects/node/module.f.js +9 -11
  104. package/{fs → fjs}/effects/node/module.js +3 -3
  105. package/{fs → fjs}/effects/node/proof.f.d.ts +1 -0
  106. package/{fs → fjs}/effects/node/proof.f.js +121 -299
  107. package/{fs → fjs}/effects/node/virtual/proof.f.d.ts +1 -0
  108. package/{fs → fjs}/effects/node/virtual/proof.f.js +36 -29
  109. package/fjs/effects/proof.f.d.ts +51 -0
  110. package/fjs/effects/proof.f.js +178 -0
  111. package/{fs → fjs}/emergent_testing/module.f.js +55 -39
  112. package/{fs → fjs}/emergent_testing/proof.f.d.ts +4 -0
  113. package/{fs → fjs}/emergent_testing/proof.f.js +60 -27
  114. package/{fs → fjs}/fsc/proof.f.js +12 -34
  115. package/{fs → fjs}/fsm/proof.f.js +5 -12
  116. package/{fs → fjs}/mcp/module.f.d.ts +7 -0
  117. package/{fs → fjs}/mcp/module.f.js +17 -10
  118. package/{fs → fjs}/mcp/proof.f.js +17 -16
  119. package/{fs → fjs}/mcp/stdio/module.f.d.ts +4 -4
  120. package/{fs → fjs}/mcp/stdio/module.f.js +14 -14
  121. package/{fs → fjs}/media/html/proof.f.js +12 -33
  122. package/{fs → fjs}/media/json/parser/module.f.d.ts +5 -0
  123. package/{fs → fjs}/media/json/parser/module.f.js +14 -0
  124. package/{fs → fjs}/media/json/parser/proof.f.js +39 -114
  125. package/{fs → fjs}/media/json/rpc/module.f.js +1 -1
  126. package/{fs → fjs}/media/json/schema/module.f.d.ts +2 -2
  127. package/{fs → fjs}/media/json/schema/module.f.js +23 -39
  128. package/{fs → fjs}/media/json/schema/proof.f.js +3 -6
  129. package/{fs → fjs}/media/json/serializer/proof.f.js +10 -27
  130. package/{fs → fjs}/media/module.f.d.ts +6 -6
  131. package/{fs → fjs}/media/module.f.js +3 -4
  132. package/{fs → fjs}/media/proof.f.js +5 -4
  133. package/{fs → fjs}/media/revision/module.f.d.ts +31 -4
  134. package/{fs → fjs}/media/revision/module.f.js +35 -23
  135. package/{fs → fjs}/media/revision/proof.f.d.ts +10 -8
  136. package/fjs/media/revision/proof.f.js +140 -0
  137. package/{fs → fjs}/media/type/module.f.js +2 -2
  138. package/{fs → fjs}/media/type/proof.f.js +8 -15
  139. package/{fs → fjs}/module.f.js +5 -9
  140. package/{fs → fjs}/path/proof.f.js +27 -78
  141. package/{fs → fjs}/proof.f.js +2 -0
  142. package/{fs → fjs}/sul/id/proof.f.js +7 -21
  143. package/{fs → fjs}/sul/level/hash/proof.f.js +5 -5
  144. package/{fs → fjs}/sul/level/literal/proof.f.js +12 -26
  145. package/fjs/text/ascii/proof.f.d.ts +6 -0
  146. package/{fs → fjs}/text/ascii/proof.f.js +4 -14
  147. package/{fs → fjs}/text/code_point/module.f.js +10 -10
  148. package/{fs → fjs}/text/proof.f.js +4 -9
  149. package/{fs → fjs}/text/sgr/proof.f.js +6 -15
  150. package/{fs → fjs}/text/utf16/module.f.js +1 -1
  151. package/{fs → fjs}/text/utf16/proof.f.js +23 -66
  152. package/{fs → fjs}/text/utf8/proof.f.js +56 -125
  153. package/{fs → fjs}/types/array/proof.f.js +18 -52
  154. package/fjs/types/bigfloat/proof.f.js +217 -0
  155. package/{fs → fjs}/types/bigint/module.f.js +4 -3
  156. package/{fs → fjs}/types/bigint/proof.f.js +49 -145
  157. package/{fs → fjs}/types/bit_vec/module.f.js +5 -15
  158. package/{fs → fjs}/types/bit_vec/proof.f.js +72 -214
  159. package/{fs → fjs}/types/btree/find/proof.f.js +23 -66
  160. package/{fs → fjs}/types/btree/proof.f.js +5 -12
  161. package/{fs → fjs}/types/btree/remove/module.f.d.ts +5 -0
  162. package/{fs → fjs}/types/btree/remove/module.f.js +12 -0
  163. package/{fs → fjs}/types/btree/remove/proof.f.d.ts +2 -0
  164. package/{fs → fjs}/types/btree/remove/proof.f.js +83 -230
  165. package/{fs → fjs}/types/btree/set/module.f.js +5 -2
  166. package/{fs → fjs}/types/btree/set/proof.f.js +35 -24
  167. package/{fs → fjs}/types/byte_set/proof.f.js +22 -63
  168. package/{fs → fjs}/types/function/compare/proof.f.js +13 -36
  169. package/{fs → fjs}/types/function/operator/proof.f.js +17 -48
  170. package/{fs → fjs}/types/function/proof.f.js +2 -3
  171. package/{fs → fjs}/types/list/module.f.d.ts +21 -0
  172. package/{fs → fjs}/types/list/module.f.js +17 -0
  173. package/{fs → fjs}/types/list/proof.f.d.ts +1 -0
  174. package/{fs → fjs}/types/list/proof.f.js +79 -164
  175. package/{fs → fjs}/types/map/proof.f.js +4 -12
  176. package/{fs → fjs}/types/nibble_set/proof.f.js +16 -45
  177. package/{fs → fjs}/types/nominal/proof.f.js +5 -10
  178. package/fjs/types/nullable/proof.f.js +29 -0
  179. package/{fs → fjs}/types/number/module.f.js +2 -1
  180. package/{fs → fjs}/types/number/proof.f.js +9 -24
  181. package/{fs → fjs}/types/object/proof.f.js +3 -6
  182. package/{fs → fjs}/types/patricia_trie/proof.f.js +21 -21
  183. package/{fs → fjs}/types/prime_field/module.f.js +2 -7
  184. package/{fs → fjs}/types/range/module.f.d.ts +1 -1
  185. package/fjs/types/range/module.f.js +2 -0
  186. package/fjs/types/range/proof.f.js +9 -0
  187. package/{fs → fjs}/types/range_map/proof.f.js +28 -81
  188. package/{fs → fjs}/types/result/proof.f.d.ts +3 -2
  189. package/fjs/types/result/proof.f.js +31 -0
  190. package/{fs → fjs}/types/rtti/common/module.f.d.ts +36 -1
  191. package/{fs → fjs}/types/rtti/common/module.f.js +44 -0
  192. package/fjs/types/rtti/common/proof.f.d.ts +8 -0
  193. package/fjs/types/rtti/common/proof.f.js +51 -0
  194. package/{fs → fjs}/types/rtti/parse/module.f.js +13 -22
  195. package/{fs → fjs}/types/rtti/parse/proof.f.js +7 -18
  196. package/{fs → fjs}/types/rtti/ts/module.f.d.ts +10 -4
  197. package/{fs → fjs}/types/rtti/validate/module.f.js +8 -29
  198. package/{fs → fjs}/types/rtti/validate/proof.f.js +4 -9
  199. package/{fs → fjs}/types/sorted_list/proof.f.js +8 -21
  200. package/{fs → fjs}/types/sorted_set/proof.f.js +14 -39
  201. package/{fs → fjs}/types/string/module.f.js +10 -2
  202. package/fjs/types/string/proof.f.js +77 -0
  203. package/fjs/types/string_set/proof.f.js +43 -0
  204. package/{fs → fjs}/types/ts/proof.f.js +15 -42
  205. package/{fs → fjs}/types/uint8array/module.f.js +7 -7
  206. package/{fs → fjs}/types/uint8array/proof.f.d.ts +4 -1
  207. package/{fs → fjs}/types/uint8array/proof.f.js +7 -7
  208. package/{fs → fjs}/website/module.f.js +2 -3
  209. package/{fs → fjs}/website/proof.f.js +3 -6
  210. package/package.json +8 -8
  211. package/fs/asserts/module.f.d.ts +0 -4
  212. package/fs/asserts/module.f.js +0 -9
  213. package/fs/asserts/proof.f.d.ts +0 -8
  214. package/fs/asserts/proof.f.js +0 -51
  215. package/fs/bnf/data/module.f.d.ts +0 -30
  216. package/fs/bnf/descent/module.f.js +0 -119
  217. package/fs/bnf/proof.f.js +0 -104
  218. package/fs/cas/mcp/module.f.d.ts +0 -36
  219. package/fs/cas/proof.f.d.ts +0 -20
  220. package/fs/cas/proof.f.js +0 -294
  221. package/fs/common/monoid/module.f.js +0 -44
  222. package/fs/common/monoid/proof.f.d.ts +0 -4
  223. package/fs/common/monoid/proof.f.js +0 -27
  224. package/fs/crypto/pow/proof.f.js +0 -161
  225. package/fs/djs/tokenizer/module.f.d.ts +0 -12
  226. package/fs/djs/tokenizer/module.f.js +0 -62
  227. package/fs/djs/tokenizer/proof.f.d.ts +0 -7
  228. package/fs/djs/tokenizer/proof.f.js +0 -543
  229. package/fs/djs/tokenizer-new/module.f.d.ts +0 -3
  230. package/fs/djs/tokenizer-new/module.f.js +0 -155
  231. package/fs/effects/module.f.d.ts +0 -106
  232. package/fs/effects/module.f.js +0 -80
  233. package/fs/effects/proof.f.d.ts +0 -25
  234. package/fs/effects/proof.f.js +0 -115
  235. package/fs/media/revision/proof.f.js +0 -119
  236. package/fs/text/ascii/proof.f.d.ts +0 -4
  237. package/fs/types/bigfloat/proof.f.js +0 -348
  238. package/fs/types/nullable/proof.f.js +0 -50
  239. package/fs/types/range/module.f.js +0 -2
  240. package/fs/types/range/proof.f.js +0 -18
  241. package/fs/types/result/proof.f.js +0 -52
  242. package/fs/types/string/proof.f.js +0 -118
  243. package/fs/types/string_set/proof.f.js +0 -82
  244. /package/{fs → fjs}/asn.1/module.f.d.ts +0 -0
  245. /package/{fs → fjs}/asn.1/module.f.js +0 -0
  246. /package/{fs → fjs}/asn.1/proof.f.d.ts +0 -0
  247. /package/{fs → fjs}/base_n/module.f.d.ts +0 -0
  248. /package/{fs → fjs}/base_n/module.f.js +0 -0
  249. /package/{fs → fjs}/base_n/proof.f.d.ts +0 -0
  250. /package/{fs → fjs}/basen/base128/module.f.d.ts +0 -0
  251. /package/{fs → fjs}/basen/base128/module.f.js +0 -0
  252. /package/{fs → fjs}/basen/base128/proof.f.d.ts +0 -0
  253. /package/{fs → fjs}/basen/base128/proof.f.js +0 -0
  254. /package/{fs → fjs}/basen/base64/module.f.d.ts +0 -0
  255. /package/{fs → fjs}/basen/base64/module.f.js +0 -0
  256. /package/{fs → fjs}/basen/cbase32/module.f.d.ts +0 -0
  257. /package/{fs → fjs}/basen/cbase32/module.f.js +0 -0
  258. /package/{fs → fjs}/basen/cbase32/proof.f.d.ts +0 -0
  259. /package/{fs → fjs}/bnf/proof.f.d.ts +0 -0
  260. /package/{fs → fjs}/bnf/testlib.f.d.ts +0 -0
  261. /package/{fs → fjs}/cas/cli/module.f.d.ts +0 -0
  262. /package/{fs → fjs}/ci/bun/module.f.d.ts +0 -0
  263. /package/{fs → fjs}/ci/deno/module.f.d.ts +0 -0
  264. /package/{fs → fjs}/ci/module.f.d.ts +0 -0
  265. /package/{fs → fjs}/ci/node/module.f.d.ts +0 -0
  266. /package/{fs → fjs}/ci/playwright/module.f.d.ts +0 -0
  267. /package/{fs → fjs}/ci/playwright/module.f.js +0 -0
  268. /package/{fs → fjs}/ci/proof.f.d.ts +0 -0
  269. /package/{fs → fjs}/ci/rust/module.f.d.ts +0 -0
  270. /package/{fs → fjs}/cli/module.f.d.ts +0 -0
  271. /package/{fs → fjs}/cli/proof.f.d.ts +0 -0
  272. /package/{fs → fjs}/crypto/hmac/module.f.d.ts +0 -0
  273. /package/{fs → fjs}/crypto/hmac/module.f.js +0 -0
  274. /package/{fs → fjs}/crypto/hmac/proof.f.d.ts +0 -0
  275. /package/{fs → fjs}/crypto/pow/module.f.d.ts +0 -0
  276. /package/{fs → fjs}/crypto/pow/module.f.js +0 -0
  277. /package/{fs → fjs}/crypto/pow/proof.f.d.ts +0 -0
  278. /package/{fs → fjs}/crypto/secp/module.f.d.ts +0 -0
  279. /package/{fs → fjs}/crypto/secp/module.f.js +0 -0
  280. /package/{fs → fjs}/crypto/secp/proof.f.d.ts +0 -0
  281. /package/{fs → fjs}/crypto/sha2/module.f.d.ts +0 -0
  282. /package/{fs → fjs}/crypto/sha2/module.f.js +0 -0
  283. /package/{fs → fjs}/crypto/sha2/proof.f.d.ts +0 -0
  284. /package/{fs → fjs}/crypto/sign/proof.f.d.ts +0 -0
  285. /package/{fs → fjs}/crypto/vdf/module.f.d.ts +0 -0
  286. /package/{fs → fjs}/crypto/vdf/module.f.js +0 -0
  287. /package/{fs → fjs}/crypto/vdf/proof.f.d.ts +0 -0
  288. /package/{fs → fjs}/dev/module.f.d.ts +0 -0
  289. /package/{fs → fjs}/dev/package_json/module.f.d.ts +0 -0
  290. /package/{fs → fjs}/dev/package_json/module.f.js +0 -0
  291. /package/{fs → fjs}/dev/package_json/proof.f.d.ts +0 -0
  292. /package/{fs → fjs}/dev/proof.f.d.ts +0 -0
  293. /package/{fs → fjs}/djs/ast/module.f.d.ts +0 -0
  294. /package/{fs → fjs}/djs/ast/module.f.js +0 -0
  295. /package/{fs → fjs}/djs/ast/proof.f.d.ts +0 -0
  296. /package/{fs → fjs}/djs/examples/input.f.d.ts +0 -0
  297. /package/{fs → fjs}/djs/examples/input.f.js +0 -0
  298. /package/{fs → fjs}/djs/examples/m.f.d.ts +0 -0
  299. /package/{fs → fjs}/djs/examples/m.f.js +0 -0
  300. /package/{fs → fjs}/djs/module.f.d.ts +0 -0
  301. /package/{fs → fjs}/djs/parser/proof.f.d.ts +0 -0
  302. /package/{fs → fjs}/djs/proof.f.d.ts +0 -0
  303. /package/{fs → fjs}/djs/serializer/module.f.d.ts +0 -0
  304. /package/{fs → fjs}/djs/serializer/module.f.js +0 -0
  305. /package/{fs → fjs}/djs/serializer/proof.f.d.ts +0 -0
  306. /package/{fs → fjs}/djs/transpiler/module.f.d.ts +0 -0
  307. /package/{fs → fjs}/effects/memory/module.f.d.ts +0 -0
  308. /package/{fs → fjs}/effects/memory/module.f.js +0 -0
  309. /package/{fs → fjs}/effects/memory/proof.f.d.ts +0 -0
  310. /package/{fs → fjs}/effects/mock/module.f.d.ts +0 -0
  311. /package/{fs → fjs}/effects/mock/module.f.js +0 -0
  312. /package/{fs → fjs}/effects/module.d.ts +0 -0
  313. /package/{fs → fjs}/effects/module.js +0 -0
  314. /package/{fs → fjs}/effects/node/memory/module.d.ts +0 -0
  315. /package/{fs → fjs}/effects/node/memory/module.js +0 -0
  316. /package/{fs → fjs}/effects/node/memory/proof.d.ts +0 -0
  317. /package/{fs → fjs}/effects/node/virtual/module.f.d.ts +0 -0
  318. /package/{fs → fjs}/effects/node/virtual/module.f.js +0 -0
  319. /package/{fs → fjs}/emergent_testing/all.test.d.ts +0 -0
  320. /package/{fs → fjs}/emergent_testing/all.test.js +0 -0
  321. /package/{fs → fjs}/emergent_testing/example.f.d.ts +0 -0
  322. /package/{fs → fjs}/emergent_testing/example.f.js +0 -0
  323. /package/{fs → fjs}/emergent_testing/module.f.d.ts +0 -0
  324. /package/{fs → fjs}/emergent_testing/scenarios/all.d.ts +0 -0
  325. /package/{fs → fjs}/emergent_testing/scenarios/all.js +0 -0
  326. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -0
  327. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.fail.js +0 -0
  328. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -0
  329. /package/{fs → fjs}/emergent_testing/scenarios/async-subtests.pass.js +0 -0
  330. /package/{fs → fjs}/emergent_testing/scenarios/async.fail.d.ts +0 -0
  331. /package/{fs → fjs}/emergent_testing/scenarios/async.fail.js +0 -0
  332. /package/{fs → fjs}/emergent_testing/scenarios/async.pass.d.ts +0 -0
  333. /package/{fs → fjs}/emergent_testing/scenarios/async.pass.js +0 -0
  334. /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.d.ts +0 -0
  335. /package/{fs → fjs}/emergent_testing/scenarios/fail.fail.js +0 -0
  336. /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.d.ts +0 -0
  337. /package/{fs → fjs}/emergent_testing/scenarios/return-value.pass.js +0 -0
  338. /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.d.ts +0 -0
  339. /package/{fs → fjs}/emergent_testing/scenarios/thenable.pass.js +0 -0
  340. /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.d.ts +0 -0
  341. /package/{fs → fjs}/emergent_testing/scenarios/thenable2.pass.js +0 -0
  342. /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.d.ts +0 -0
  343. /package/{fs → fjs}/emergent_testing/scenarios/throw.pass.js +0 -0
  344. /package/{fs → fjs}/fsc/bnf.f.d.ts +0 -0
  345. /package/{fs → fjs}/fsc/bnf.f.js +0 -0
  346. /package/{fs → fjs}/fsc/json.f.d.ts +0 -0
  347. /package/{fs → fjs}/fsc/json.f.js +0 -0
  348. /package/{fs → fjs}/fsc/module.f.d.ts +0 -0
  349. /package/{fs → fjs}/fsc/module.f.js +0 -0
  350. /package/{fs → fjs}/fsc/proof.f.d.ts +0 -0
  351. /package/{fs → fjs}/fsm/module.f.d.ts +0 -0
  352. /package/{fs → fjs}/fsm/module.f.js +0 -0
  353. /package/{fs → fjs}/fsm/proof.f.d.ts +0 -0
  354. /package/{fs → fjs}/js/tokenizer/module.f.d.ts +0 -0
  355. /package/{fs → fjs}/js/tokenizer/module.f.js +0 -0
  356. /package/{fs → fjs}/js/tokenizer/proof.f.d.ts +0 -0
  357. /package/{fs → fjs}/js/tokenizer/proof.f.js +0 -0
  358. /package/{fs → fjs}/mcp/proof.f.d.ts +0 -0
  359. /package/{fs → fjs}/mcp/stdio/proof.f.d.ts +0 -0
  360. /package/{fs → fjs}/mcp/stdio/proof.f.js +0 -0
  361. /package/{fs → fjs}/media/html/module.f.d.ts +0 -0
  362. /package/{fs → fjs}/media/html/module.f.js +0 -0
  363. /package/{fs → fjs}/media/html/proof.f.d.ts +0 -0
  364. /package/{fs → fjs}/media/json/module.f.d.ts +0 -0
  365. /package/{fs → fjs}/media/json/module.f.js +0 -0
  366. /package/{fs → fjs}/media/json/parser/proof.f.d.ts +0 -0
  367. /package/{fs → fjs}/media/json/proof.f.d.ts +0 -0
  368. /package/{fs → fjs}/media/json/proof.f.js +0 -0
  369. /package/{fs → fjs}/media/json/rpc/module.f.d.ts +0 -0
  370. /package/{fs → fjs}/media/json/rpc/proof.f.d.ts +0 -0
  371. /package/{fs → fjs}/media/json/rpc/proof.f.js +0 -0
  372. /package/{fs → fjs}/media/json/schema/proof.f.d.ts +0 -0
  373. /package/{fs → fjs}/media/json/serializer/module.f.d.ts +0 -0
  374. /package/{fs → fjs}/media/json/serializer/module.f.js +0 -0
  375. /package/{fs → fjs}/media/json/serializer/proof.f.d.ts +0 -0
  376. /package/{fs → fjs}/media/json/tokenizer/module.f.d.ts +0 -0
  377. /package/{fs → fjs}/media/json/tokenizer/module.f.js +0 -0
  378. /package/{fs → fjs}/media/json/tokenizer/proof.f.d.ts +0 -0
  379. /package/{fs → fjs}/media/json/tokenizer/proof.f.js +0 -0
  380. /package/{fs → fjs}/media/proof.f.d.ts +0 -0
  381. /package/{fs → fjs}/media/type/module.f.d.ts +0 -0
  382. /package/{fs → fjs}/media/type/proof.f.d.ts +0 -0
  383. /package/{fs → fjs}/module.d.ts +0 -0
  384. /package/{fs → fjs}/module.f.d.ts +0 -0
  385. /package/{fs → fjs}/module.js +0 -0
  386. /package/{fs → fjs}/path/module.f.d.ts +0 -0
  387. /package/{fs → fjs}/path/module.f.js +0 -0
  388. /package/{fs → fjs}/path/proof.f.d.ts +0 -0
  389. /package/{fs → fjs}/proof.f.d.ts +0 -0
  390. /package/{fs → fjs}/sul/id/module.f.d.ts +0 -0
  391. /package/{fs → fjs}/sul/id/module.f.js +0 -0
  392. /package/{fs → fjs}/sul/id/proof.f.d.ts +0 -0
  393. /package/{fs → fjs}/sul/level/hash/module.f.d.ts +0 -0
  394. /package/{fs → fjs}/sul/level/hash/module.f.js +0 -0
  395. /package/{fs → fjs}/sul/level/hash/proof.f.d.ts +0 -0
  396. /package/{fs → fjs}/sul/level/literal/module.f.d.ts +0 -0
  397. /package/{fs → fjs}/sul/level/literal/module.f.js +0 -0
  398. /package/{fs → fjs}/sul/level/literal/proof.f.d.ts +0 -0
  399. /package/{fs → fjs}/sul/module.f.d.ts +0 -0
  400. /package/{fs → fjs}/sul/module.f.js +0 -0
  401. /package/{fs → fjs}/sul/proof.f.d.ts +0 -0
  402. /package/{fs → fjs}/sul/proof.f.js +0 -0
  403. /package/{fs → fjs}/text/ascii/module.f.d.ts +0 -0
  404. /package/{fs → fjs}/text/ascii/module.f.js +0 -0
  405. /package/{fs → fjs}/text/code_point/module.f.d.ts +0 -0
  406. /package/{fs → fjs}/text/code_point/proof.f.d.ts +0 -0
  407. /package/{fs → fjs}/text/code_point/proof.f.js +0 -0
  408. /package/{fs → fjs}/text/module.f.d.ts +0 -0
  409. /package/{fs → fjs}/text/module.f.js +0 -0
  410. /package/{fs → fjs}/text/proof.f.d.ts +0 -0
  411. /package/{fs → fjs}/text/sgr/module.f.d.ts +0 -0
  412. /package/{fs → fjs}/text/sgr/module.f.js +0 -0
  413. /package/{fs → fjs}/text/sgr/proof.f.d.ts +0 -0
  414. /package/{fs → fjs}/text/utf16/module.f.d.ts +0 -0
  415. /package/{fs → fjs}/text/utf16/proof.f.d.ts +0 -0
  416. /package/{fs → fjs}/text/utf8/module.f.d.ts +0 -0
  417. /package/{fs → fjs}/text/utf8/module.f.js +0 -0
  418. /package/{fs → fjs}/text/utf8/proof.f.d.ts +0 -0
  419. /package/{fs → fjs}/types/array/module.f.d.ts +0 -0
  420. /package/{fs → fjs}/types/array/module.f.js +0 -0
  421. /package/{fs → fjs}/types/array/proof.f.d.ts +0 -0
  422. /package/{fs → fjs}/types/bigfloat/module.f.d.ts +0 -0
  423. /package/{fs → fjs}/types/bigfloat/module.f.js +0 -0
  424. /package/{fs → fjs}/types/bigfloat/proof.f.d.ts +0 -0
  425. /package/{fs → fjs}/types/bigint/module.f.d.ts +0 -0
  426. /package/{fs → fjs}/types/bigint/proof.f.d.ts +0 -0
  427. /package/{fs → fjs}/types/bit_vec/module.f.d.ts +0 -0
  428. /package/{fs → fjs}/types/bit_vec/proof.f.d.ts +0 -0
  429. /package/{fs → fjs}/types/btree/find/module.f.d.ts +0 -0
  430. /package/{fs → fjs}/types/btree/find/module.f.js +0 -0
  431. /package/{fs → fjs}/types/btree/find/proof.f.d.ts +0 -0
  432. /package/{fs → fjs}/types/btree/module.f.d.ts +0 -0
  433. /package/{fs → fjs}/types/btree/module.f.js +0 -0
  434. /package/{fs → fjs}/types/btree/proof.f.d.ts +0 -0
  435. /package/{fs → fjs}/types/btree/set/module.f.d.ts +0 -0
  436. /package/{fs → fjs}/types/btree/set/proof.f.d.ts +0 -0
  437. /package/{fs → fjs}/types/btree/types/module.f.d.ts +0 -0
  438. /package/{fs → fjs}/types/btree/types/module.f.js +0 -0
  439. /package/{fs → fjs}/types/byte_set/module.f.d.ts +0 -0
  440. /package/{fs → fjs}/types/byte_set/module.f.js +0 -0
  441. /package/{fs → fjs}/types/byte_set/proof.f.d.ts +0 -0
  442. /package/{fs → fjs}/types/function/compare/module.f.d.ts +0 -0
  443. /package/{fs → fjs}/types/function/compare/module.f.js +0 -0
  444. /package/{fs → fjs}/types/function/compare/proof.f.d.ts +0 -0
  445. /package/{fs → fjs}/types/function/module.f.d.ts +0 -0
  446. /package/{fs → fjs}/types/function/module.f.js +0 -0
  447. /package/{fs → fjs}/types/function/operator/module.f.d.ts +0 -0
  448. /package/{fs → fjs}/types/function/operator/module.f.js +0 -0
  449. /package/{fs → fjs}/types/function/operator/proof.f.d.ts +0 -0
  450. /package/{fs → fjs}/types/function/proof.f.d.ts +0 -0
  451. /package/{fs → fjs}/types/map/module.f.d.ts +0 -0
  452. /package/{fs → fjs}/types/map/module.f.js +0 -0
  453. /package/{fs → fjs}/types/map/proof.f.d.ts +0 -0
  454. /package/{fs → fjs}/types/nibble_set/module.f.d.ts +0 -0
  455. /package/{fs → fjs}/types/nibble_set/module.f.js +0 -0
  456. /package/{fs → fjs}/types/nibble_set/proof.f.d.ts +0 -0
  457. /package/{fs → fjs}/types/nominal/module.f.d.ts +0 -0
  458. /package/{fs → fjs}/types/nominal/module.f.js +0 -0
  459. /package/{fs → fjs}/types/nominal/proof.f.d.ts +0 -0
  460. /package/{fs → fjs}/types/nullable/module.f.d.ts +0 -0
  461. /package/{fs → fjs}/types/nullable/module.f.js +0 -0
  462. /package/{fs → fjs}/types/nullable/proof.f.d.ts +0 -0
  463. /package/{fs → fjs}/types/number/module.f.d.ts +0 -0
  464. /package/{fs → fjs}/types/number/proof.f.d.ts +0 -0
  465. /package/{fs → fjs}/types/object/module.f.d.ts +0 -0
  466. /package/{fs → fjs}/types/object/module.f.js +0 -0
  467. /package/{fs → fjs}/types/object/proof.f.d.ts +0 -0
  468. /package/{fs → fjs}/types/option/module.f.d.ts +0 -0
  469. /package/{fs → fjs}/types/option/module.f.js +0 -0
  470. /package/{fs → fjs}/types/ordered_map/module.f.d.ts +0 -0
  471. /package/{fs → fjs}/types/ordered_map/module.f.js +0 -0
  472. /package/{fs → fjs}/types/ordered_map/proof.f.d.ts +0 -0
  473. /package/{fs → fjs}/types/ordered_map/proof.f.js +0 -0
  474. /package/{fs → fjs}/types/patricia_trie/module.f.d.ts +0 -0
  475. /package/{fs → fjs}/types/patricia_trie/module.f.js +0 -0
  476. /package/{fs → fjs}/types/patricia_trie/proof.f.d.ts +0 -0
  477. /package/{fs → fjs}/types/phantom/module.f.d.ts +0 -0
  478. /package/{fs → fjs}/types/phantom/module.f.js +0 -0
  479. /package/{fs → fjs}/types/prime_field/module.f.d.ts +0 -0
  480. /package/{fs → fjs}/types/prime_field/proof.f.d.ts +0 -0
  481. /package/{fs → fjs}/types/prime_field/proof.f.js +0 -0
  482. /package/{fs → fjs}/types/range/proof.f.d.ts +0 -0
  483. /package/{fs → fjs}/types/range_map/module.f.d.ts +0 -0
  484. /package/{fs → fjs}/types/range_map/module.f.js +0 -0
  485. /package/{fs → fjs}/types/range_map/proof.f.d.ts +0 -0
  486. /package/{fs → fjs}/types/result/module.d.ts +0 -0
  487. /package/{fs → fjs}/types/result/module.f.d.ts +0 -0
  488. /package/{fs → fjs}/types/result/module.f.js +0 -0
  489. /package/{fs → fjs}/types/result/module.js +0 -0
  490. /package/{fs → fjs}/types/rtti/module.f.d.ts +0 -0
  491. /package/{fs → fjs}/types/rtti/module.f.js +0 -0
  492. /package/{fs → fjs}/types/rtti/parse/module.f.d.ts +0 -0
  493. /package/{fs → fjs}/types/rtti/parse/proof.f.d.ts +0 -0
  494. /package/{fs → fjs}/types/rtti/proof.f.d.ts +0 -0
  495. /package/{fs → fjs}/types/rtti/proof.f.js +0 -0
  496. /package/{fs → fjs}/types/rtti/ts/module.f.js +0 -0
  497. /package/{fs → fjs}/types/rtti/ts/proof.f.d.ts +0 -0
  498. /package/{fs → fjs}/types/rtti/ts/proof.f.js +0 -0
  499. /package/{fs → fjs}/types/rtti/validate/module.f.d.ts +0 -0
  500. /package/{fs → fjs}/types/rtti/validate/proof.f.d.ts +0 -0
  501. /package/{fs → fjs}/types/sorted_list/module.f.d.ts +0 -0
  502. /package/{fs → fjs}/types/sorted_list/module.f.js +0 -0
  503. /package/{fs → fjs}/types/sorted_list/proof.f.d.ts +0 -0
  504. /package/{fs → fjs}/types/sorted_set/module.f.d.ts +0 -0
  505. /package/{fs → fjs}/types/sorted_set/module.f.js +0 -0
  506. /package/{fs → fjs}/types/sorted_set/proof.f.d.ts +0 -0
  507. /package/{fs → fjs}/types/string/module.f.d.ts +0 -0
  508. /package/{fs → fjs}/types/string/proof.f.d.ts +0 -0
  509. /package/{fs → fjs}/types/string_set/module.f.d.ts +0 -0
  510. /package/{fs → fjs}/types/string_set/module.f.js +0 -0
  511. /package/{fs → fjs}/types/string_set/proof.f.d.ts +0 -0
  512. /package/{fs → fjs}/types/ts/module.f.d.ts +0 -0
  513. /package/{fs → fjs}/types/ts/module.f.js +0 -0
  514. /package/{fs → fjs}/types/ts/proof.f.d.ts +0 -0
  515. /package/{fs → fjs}/types/uint8array/module.f.d.ts +0 -0
  516. /package/{fs → fjs}/website/module.f.d.ts +0 -0
  517. /package/{fs → fjs}/website/proof.f.d.ts +0 -0
@@ -24,13 +24,13 @@ export const images = {
24
24
  // published FunctionalScript release; do not tie it to package.json's current
25
25
  // in-repo version.
26
26
  // https://www.npmjs.com/package/functionalscript
27
- export const functionalscript = '0.36.0';
27
+ export const functionalscript = '0.38.0';
28
28
  // https://bun.sh/
29
29
  export const bun = '1.3.14';
30
30
  // https://deno.com/
31
- export const deno = '2.9.2';
31
+ export const deno = '2.9.4';
32
32
  // https://www.npmjs.com/package/playwright
33
- export const playwright = '1.61.1';
33
+ export const playwright = '1.62.0';
34
34
  // https://nodejs.org/en/download
35
35
  export const node = {
36
36
  default: '26.5.0',
@@ -38,18 +38,18 @@ export const node = {
38
38
  node24: '24.18.0',
39
39
  };
40
40
  // https://github.com/bytecodealliance/wasmtime/releases
41
- export const wasmtime = '46.0.1';
41
+ export const wasmtime = '47.0.2';
42
42
  // https://github.com/wasmerio/wasmer/releases
43
- export const wasmer = '7.2.0';
43
+ export const wasmer = '7.2.1';
44
44
  // GitHub Action versions used by CI step builders. The key is the action
45
45
  // `owner/name`; call sites compose the full ref as
46
46
  // `` `${name}@${actions[name]}` ``.
47
47
  // Note: dtolnay/rust-toolchain value is a Rust version, not an action version.
48
48
  export const actions = {
49
49
  // https://github.com/marketplace/actions/checkout
50
- 'actions/checkout': 'v7',
50
+ 'actions/checkout': 'v7.0.1',
51
51
  // https://github.com/marketplace/actions/setup-node-js-environment
52
- 'actions/setup-node': 'v6.4.0',
52
+ 'actions/setup-node': 'v7.0.0',
53
53
  // https://github.com/marketplace/actions/cache
54
54
  'actions/cache': 'v6.1.0',
55
55
  // https://github.com/marketplace/actions/setup-deno
@@ -61,5 +61,5 @@ export const actions = {
61
61
  // https://github.com/wasmerio/setup-wasmer
62
62
  'wasmerio/setup-wasmer': 'v3.1',
63
63
  // https://rust-lang.org/ - value is Rust version, not action version
64
- 'dtolnay/rust-toolchain': '1.96.1',
64
+ 'dtolnay/rust-toolchain': '1.97.1',
65
65
  };
@@ -5,9 +5,9 @@
5
5
  * @module
6
6
  */
7
7
  import { deno } from '../config/module.f.js';
8
- import { clean, install, test, uses } from '../common/module.f.js';
8
+ import { install, test, uses } from '../common/module.f.js';
9
9
  const denoTest = 'deno test --allow-read --allow-env --allow-sys';
10
- export const denoSteps = (version) => clean([
10
+ export const denoSteps = (version) => [
11
11
  install(uses('denoland/setup-deno', { 'deno-version': deno })),
12
12
  // We need --minimum-dependency-age=0 for functionalscript because we would like to use
13
13
  // the latest version of the package even if it is not yet 24 hours old,
@@ -17,4 +17,4 @@ export const denoSteps = (version) => clean([
17
17
  test({ run: `deno run -A --minimum-dependency-age=0 npm:functionalscript@${version} t` }),
18
18
  test({ run: 'deno install --frozen' }),
19
19
  test({ run: `${denoTest} --coverage && deno coverage --include='.*module\\.f\\.ts'` }),
20
- ]);
20
+ ];
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import { pure } from '../effects/module.f.js';
6
+ import { pure, step } from '../effects/module.f.js';
7
7
  import { access, writeUtf8File } from '../effects/node/module.f.js';
8
8
  import { functionalscript, images } from './config/module.f.js';
9
9
  import { architecture, os, toSteps, ubuntuArm } from './common/module.f.js';
@@ -29,7 +29,7 @@ const canonicalJobs = (rust) => ({
29
29
  ...nodeVersionJobs(functionalscript),
30
30
  playwright: playwrightJob,
31
31
  });
32
- export const ci = ({ nodeExtra }) => access('Cargo.toml').step(result => {
32
+ export const ci = ({ nodeExtra }) => step(access('Cargo.toml'), result => {
33
33
  const rust = result[0] === 'ok';
34
34
  const jobs = {
35
35
  ...Object.fromEntries(os.flatMap(o => architecture.map(job(rust, nodeExtra(o))(o)))),
@@ -46,7 +46,6 @@ export const ci = ({ nodeExtra }) => access('Cargo.toml').step(result => {
46
46
  },
47
47
  jobs,
48
48
  };
49
- return writeUtf8File('.github/workflows/ci.yml', JSON.stringify(gha, null, ' '))
50
- .step(() => pure(0));
49
+ return step(writeUtf8File('.github/workflows/ci.yml', JSON.stringify(gha, null, ' ')), () => pure(0));
51
50
  });
52
51
  export const main = () => ci({ nodeExtra: () => [] });
@@ -5,38 +5,40 @@
5
5
  * @module
6
6
  */
7
7
  import { node } from '../config/module.f.js';
8
- import { clean, install, test, ubuntuArm, uses } from '../common/module.f.js';
8
+ import { install, test, ubuntuArm, uses } from '../common/module.f.js';
9
9
  export const major = (v) => v.split('.')[0];
10
10
  const installNode = (version) => uses('actions/setup-node', { 'node-version': version });
11
11
  const nodeInstall = (v) => [
12
12
  install(installNode(v)),
13
13
  test({ run: 'npm ci' }),
14
14
  ];
15
- export const basicNode = (version) => (extra) => clean([
15
+ export const basicNode = (version) => (extra) => [
16
16
  ...nodeInstall(version),
17
17
  ...extra,
18
- ]);
18
+ ];
19
19
  const fjsGlobalInstall = (version) => install({ run: `npm install -g functionalscript@${version}` });
20
20
  export const platformNodeSteps = (version) => [
21
21
  ...nodeInstall(node.default),
22
22
  fjsGlobalInstall(version),
23
23
  test({ run: 'fjs t' }),
24
24
  ];
25
- const node22Steps = (version) => clean([
25
+ const node22Steps = (version) => [
26
26
  ...nodeInstall(node.node22),
27
27
  fjsGlobalInstall(version),
28
28
  test({ run: 'fjs t' }),
29
- ]);
30
- const node24Steps = clean([
29
+ ];
30
+ const node24Steps = [
31
31
  ...nodeInstall(node.node24),
32
32
  test({ run: 'node --test' }),
33
- ]);
34
- const node26Steps = clean([
33
+ ];
34
+ const node26Steps = [
35
35
  ...nodeInstall(node.default),
36
+ test({ run: 'npm run ci-update' }),
37
+ test({ run: 'git add -A && git diff --cached --exit-code' }),
36
38
  test({ run: 'npx tsc' }),
37
39
  test({ run: 'npm run cov' }),
38
40
  test({ run: 'npm pack' }),
39
- ]);
41
+ ];
40
42
  const nodeJob = (steps) => ubuntuArm(steps);
41
43
  export const nodeVersionJobs = (version) => ({
42
44
  [`node${major(node.node22)}`]: nodeJob(node22Steps(version)),
@@ -3,13 +3,14 @@ import { functionalscript } from './config/module.f.js';
3
3
  import { utf8, utf8ToString } from '../text/module.f.js';
4
4
  import { empty as emptyVec, isVec } from '../types/bit_vec/module.f.js';
5
5
  import { test, ubuntu, parseGitHubAction } from './common/module.f.js';
6
- import { assert } from '../asserts/module.f.js';
6
+ import { assert, assertEq } from '../asserts/module.f.js';
7
7
  import { emptyState, virtual } from '../effects/node/virtual/module.f.js';
8
8
  import { parse as jsonParse } from '../media/json/module.f.js';
9
9
  import { unwrap } from '../types/result/module.f.js';
10
10
  import { definedValues } from '../types/object/module.f.js';
11
11
  const hasRun = (cmd) => (gha) => definedValues(gha.jobs).some(job => job.steps.some(step => step.run?.includes(cmd)));
12
12
  const hasRunInJob = (jobId, cmd) => (gha) => gha.jobs[jobId]?.steps.some(step => step.run?.includes(cmd)) ?? false;
13
+ const hasExactRunInJob = (jobId, cmd) => (gha) => gha.jobs[jobId]?.steps.some(step => step.run === cmd) ?? false;
13
14
  const makeState = (rust, packageJson) => ({
14
15
  ...emptyState,
15
16
  root: {
@@ -24,27 +25,25 @@ const workflow = (state) => {
24
25
  const workflows = dotGithub['workflows'];
25
26
  assert(typeof workflows === 'object' && !Array.isArray(workflows), workflows);
26
27
  const file = workflows['ci.yml'];
27
- if (!Array.isArray(file) || file.length === 0) {
28
- throw file;
29
- }
28
+ assert(!(!Array.isArray(file) || file.length === 0), file);
30
29
  return unwrap(parseGitHubAction(jsonParse(utf8ToString(file[0]))));
31
30
  };
32
31
  const run = (rust, nodeExtra = () => []) => {
33
32
  const [state, result] = virtual(makeState(rust))(ci({ nodeExtra }));
34
- assert(result === 0, result);
33
+ assertEq(result, 0);
35
34
  return workflow(state);
36
35
  };
37
36
  const runDefault = (packageJson) => {
38
37
  const [state, result] = virtual(makeState(false, packageJson))(main());
39
- assert(result === 0, result);
38
+ assertEq(result, 0);
40
39
  return workflow(state);
41
40
  };
42
41
  export const proof = {
43
42
  matrixShape: () => {
44
43
  const gha = run(true);
45
- assert(Object.keys(gha.jobs).length === 13, 'expected 13 CI jobs');
46
- assert(gha.permissions.contents === 'read', 'expected read-only contents permission');
47
- assert(Object.keys(gha.permissions).length === 1, 'expected least-privilege workflow permissions');
44
+ assertEq(Object.keys(gha.jobs).length, 13, 'expected 13 CI jobs');
45
+ assertEq(gha.permissions.contents, 'read', 'expected read-only contents permission');
46
+ assertEq(Object.keys(gha.permissions).length, 1, 'expected least-privilege workflow permissions');
48
47
  assert(hasRunInJob('ubuntu-intel', 'cargo test --target i686-unknown-linux-gnu')(gha), 'expected Ubuntu Intel i686 check');
49
48
  assert(hasRunInJob('ubuntu-intel', 'cargo test --target i686-unknown-linux-gnu --release')(gha), 'expected Ubuntu Intel i686 release check');
50
49
  assert(hasRunInJob('ubuntu-intel', 'cargo clippy --target i686-unknown-linux-gnu -- -D warnings')(gha), 'expected Ubuntu Intel i686 lint');
@@ -55,8 +54,16 @@ export const proof = {
55
54
  assert(hasRunInJob('wasm', 'cargo test --target wasm32-wasip1 --release')(gha), 'expected target-specific WASM release check');
56
55
  assert(hasRunInJob('wasm', 'cargo clippy --target wasm32-wasip1 -- -D warnings')(gha), 'expected target-specific WASM Rust lint');
57
56
  assert(hasRunInJob('wasm', 'cargo clippy --target wasm32-wasip1 --release -- -D warnings')(gha), 'expected target-specific WASM release lint');
57
+ // Wasmtime 47 removed wasi-threads: the threads target must run under
58
+ // Wasmer only, while Clippy (no runner) stays.
59
+ assert(hasRunInJob('wasm', 'cargo test --target wasm32-wasip1-threads --config .cargo/config.wasmer.toml')(gha), 'expected Wasmer WASM threads check');
60
+ assert(hasRunInJob('wasm', 'cargo clippy --target wasm32-wasip1-threads -- -D warnings')(gha), 'expected WASM threads lint');
61
+ assert(!hasExactRunInJob('wasm', 'cargo test --target wasm32-wasip1-threads')(gha), 'unexpected Wasmtime WASM threads check');
62
+ assert(!hasExactRunInJob('wasm', 'cargo test --target wasm32-wasip1-threads --release')(gha), 'unexpected Wasmtime WASM threads release check');
58
63
  assert(hasRunInJob('node22', 'fjs t')(gha), 'expected Node 22 FunctionalScript smoke test');
59
64
  assert(hasRunInJob('node26', 'npm pack')(gha), 'expected Node 26 package check');
65
+ assert(hasRunInJob('node26', 'npm run ci-update')(gha), 'expected Node 26 workflow regeneration');
66
+ assert(hasRunInJob('node26', 'git add -A && git diff --cached --exit-code')(gha), 'expected Node 26 generated-file drift check');
60
67
  assert(!hasRun('npm publish --dry-run')(gha), 'unexpected npm publish dry-run');
61
68
  for (const id of [
62
69
  'ubuntu-intel',
@@ -39,6 +39,14 @@ const wasmTarget = (target) => [
39
39
  ...targetChecks(target),
40
40
  ...cargoTestPair(target, '.cargo/config.wasmer.toml')
41
41
  ];
42
+ // Wasmtime 47 removed wasi-threads, so the threads target runs under Wasmer
43
+ // only; Clippy needs no runner and stays. See todo/blocked/wasmtime-threads.md.
44
+ const wasmerOnlyTarget = (target) => [
45
+ { type: 'rust', target },
46
+ cargoClippy(target),
47
+ cargoReleaseClippy(target),
48
+ ...cargoTestPair(target, '.cargo/config.wasmer.toml')
49
+ ];
42
50
  const i686 = (a, v) => {
43
51
  if (a === 'intel') {
44
52
  switch (v) {
@@ -63,5 +71,5 @@ export const rustWasmSteps = [
63
71
  ...wasmTarget('wasm32-wasip1'),
64
72
  ...wasmTarget('wasm32-wasip2'),
65
73
  ...wasmTarget('wasm32-unknown-unknown'),
66
- ...wasmTarget('wasm32-wasip1-threads'),
74
+ ...wasmerOnlyTarget('wasm32-wasip1-threads'),
67
75
  ];
@@ -1,5 +1,5 @@
1
1
  import { errorExit, log } from '../effects/node/module.f.js';
2
- import { pure } from '../effects/module.f.js';
2
+ import { pure, step } from '../effects/module.f.js';
3
3
  import { at, fromEntries } from '../types/object/module.f.js';
4
4
  const helpMeta = { names: ['help', 'h', '?'], description: 'Print this help message' };
5
5
  export const dispatch = (commands) => (options) => {
@@ -23,7 +23,7 @@ export const dispatch = (commands) => (options) => {
23
23
  return dispatch(targetCmd.handler)({ ...options, args: ['help'] });
24
24
  }
25
25
  }
26
- return log(helpText).step(() => pure(0));
26
+ return step(log(helpText), () => pure(0));
27
27
  }
28
28
  const found = at(cmd)(map);
29
29
  if (found === null) {
@@ -1,6 +1,7 @@
1
1
  import { pure } from '../effects/module.f.js';
2
2
  import { defaultNodeProgramOptions, emptyState, virtual } from '../effects/node/virtual/module.f.js';
3
3
  import { dispatch } from './module.f.js';
4
+ import { assert, assertEq } from '../asserts/module.f.js';
4
5
  const makeOptions = (args) => ({ ...defaultNodeProgramOptions, args });
5
6
  const echoCommands = [
6
7
  {
@@ -13,51 +14,31 @@ const run = (commands) => (args) => virtual(emptyState)(dispatch(commands)(makeO
13
14
  export const proof = {
14
15
  knownCommand: () => {
15
16
  const [, code] = run(echoCommands)(['echo', 'hello']);
16
- if (code !== 5) {
17
- throw ['expected length 5', code];
18
- }
17
+ assertEq(code, 5, ['expected length 5', code]);
19
18
  },
20
19
  alias: () => {
21
20
  const [, code] = run(echoCommands)(['e', 'hi']);
22
- if (code !== 2) {
23
- throw ['expected length 2', code];
24
- }
21
+ assertEq(code, 2, ['expected length 2', code]);
25
22
  },
26
23
  noArgs: () => {
27
24
  const [state, code] = run(echoCommands)([]);
28
- if (code !== 1) {
29
- throw ['expected exit 1', code];
30
- }
31
- if (state.stderr.length === 0) {
32
- throw 'expected error in stderr';
33
- }
25
+ assertEq(code, 1, ['expected exit 1', code]);
26
+ assert(state.stderr.length !== 0, 'expected error in stderr');
34
27
  },
35
28
  unknownCommand: () => {
36
29
  const [state, code] = run(echoCommands)(['bogus']);
37
- if (code !== 1) {
38
- throw ['expected exit 1', code];
39
- }
40
- if (state.stderr.length === 0) {
41
- throw 'expected error in stderr';
42
- }
30
+ assertEq(code, 1, ['expected exit 1', code]);
31
+ assert(state.stderr.length !== 0, 'expected error in stderr');
43
32
  },
44
33
  help: () => {
45
34
  const [state, code] = run(echoCommands)(['help']);
46
- if (code !== 0) {
47
- throw ['expected exit 0', code];
48
- }
49
- if (!state.stdout.includes('echo')) {
50
- throw 'expected command name in stdout';
51
- }
52
- if (!state.stdout.includes('help')) {
53
- throw 'expected help entry in stdout';
54
- }
35
+ assertEq(code, 0, ['expected exit 0', code]);
36
+ assert(state.stdout.includes('echo'), 'expected command name in stdout');
37
+ assert(state.stdout.includes('help'), 'expected help entry in stdout');
55
38
  },
56
39
  errorIncludesAvailable: () => {
57
40
  const [state] = run(echoCommands)(['bogus']);
58
- if (!state.stderr.includes('echo')) {
59
- throw 'expected available commands in error';
60
- }
41
+ assert(state.stderr.includes('echo'), 'expected available commands in error');
61
42
  },
62
43
  handlerReceivesRemainingArgs: () => {
63
44
  const captured = [];
@@ -70,9 +51,7 @@ export const proof = {
70
51
  },
71
52
  }];
72
53
  run(commands)(['grab', 'a', 'b', 'c']);
73
- if (captured.join(',') !== 'a,b,c') {
74
- throw ['unexpected args', captured];
75
- }
54
+ assertEq(captured.join(','), 'a,b,c', ['unexpected args', captured]);
76
55
  },
77
56
  nestedCommands: () => {
78
57
  const inner = [{
@@ -86,9 +65,7 @@ export const proof = {
86
65
  handler: inner,
87
66
  }];
88
67
  const [, code] = run(outer)(['sub', 'ping']);
89
- if (code !== 42) {
90
- throw ['expected 42', code];
91
- }
68
+ assertEq(code, 42, ['expected 42', code]);
92
69
  },
93
70
  nestedHelp: () => {
94
71
  const inner = [{
@@ -102,30 +79,18 @@ export const proof = {
102
79
  handler: inner,
103
80
  }];
104
81
  const [state, code] = run(outer)(['sub', 'help']);
105
- if (code !== 0) {
106
- throw ['expected exit 0', code];
107
- }
108
- if (!state.stdout.includes('ping')) {
109
- throw 'expected inner command in help';
110
- }
82
+ assertEq(code, 0, ['expected exit 0', code]);
83
+ assert(state.stdout.includes('ping'), 'expected inner command in help');
111
84
  },
112
85
  prototypeNameIsUnknownCommand: () => {
113
86
  const [state, code] = run(echoCommands)(['toString']);
114
- if (code !== 1) {
115
- throw ['expected exit 1 for prototype-name command', code];
116
- }
117
- if (!state.stderr.includes('unknown command')) {
118
- throw 'expected unknown-command error in stderr';
119
- }
87
+ assertEq(code, 1, ['expected exit 1 for prototype-name command', code]);
88
+ assert(state.stderr.includes('unknown command'), 'expected unknown-command error in stderr');
120
89
  },
121
90
  helpPrototypeSafe: () => {
122
91
  const [state, code] = run(echoCommands)(['help', 'toString']);
123
- if (code !== 0) {
124
- throw ['expected exit 0, not a throw', code];
125
- }
126
- if (!state.stdout.includes('echo')) {
127
- throw 'expected top-level help for unknown target';
128
- }
92
+ assertEq(code, 0, ['expected exit 0, not a throw', code]);
93
+ assert(state.stdout.includes('echo'), 'expected top-level help for unknown target');
129
94
  },
130
95
  helpWithTarget: () => {
131
96
  const inner = [{
@@ -139,14 +104,8 @@ export const proof = {
139
104
  handler: inner,
140
105
  }];
141
106
  const [state, code] = run(outer)(['help', 'sub']);
142
- if (code !== 0) {
143
- throw ['expected exit 0', code];
144
- }
145
- if (!state.stdout.includes('ping')) {
146
- throw 'expected inner command in help';
147
- }
148
- if (state.stdout.includes('Subcommand group')) {
149
- throw 'expected inner help, not outer';
150
- }
107
+ assertEq(code, 0, ['expected exit 0', code]);
108
+ assert(state.stdout.includes('ping'), 'expected inner command in help');
109
+ assert(!(state.stdout.includes('Subcommand group')), 'expected inner help, not outer');
151
110
  },
152
111
  };
@@ -1,11 +1,13 @@
1
1
  /**
2
2
  * Monoids: the `Monoid<T>` algebraic structure (identity plus associative
3
- * binary operation) and `repeat`, which applies the operation `n` times using
4
- * exponentiation by squaring.
3
+ * binary operation), `repeat`, which applies the operation `n` times using
4
+ * exponentiation by squaring, and `fold`, which applies it across every element
5
+ * of a list.
5
6
  *
6
7
  * @module
7
8
  */
8
9
  import type { Fold, Reduce } from '../../types/function/operator/module.f.ts';
10
+ import { type List } from '../../types/list/module.f.ts';
9
11
  /**
10
12
  * Represents a monoid, an algebraic structure with a binary operation
11
13
  * and an identity (neutral) element.
@@ -80,3 +82,45 @@ export type Monoid<T> = {
80
82
  * ```
81
83
  */
82
84
  export declare const repeat: <T>({ identity, operation }: Monoid<T>) => Fold<bigint, T>;
85
+ /**
86
+ * Reduces a `List<T>` with the monoid's associative `operation`, seeded at its
87
+ * `identity`. An empty list folds to `identity`.
88
+ *
89
+ * `fold` is the reduction companion of {@link repeat}: where `repeat` applies
90
+ * the operation a fixed number of times to a single element, `fold` applies it
91
+ * across every element of a list. Together they let list reductions such as
92
+ * `sum`, `product`, and string `concat` be expressed directly as monoid folds,
93
+ * so the identity paired with each operation is stated once at the call site
94
+ * instead of hand-seeding a raw `reduce`.
95
+ *
96
+ * Like `repeat`, `fold` applies the operation **accumulator-first**:
97
+ * `operation(accumulator)(element)`, seeded at `identity`, so
98
+ * `[a, b, c]` folds to `((identity op a) op b) op c`. Left-to-right order is
99
+ * therefore preserved and `fold` is correct for non-commutative monoids (e.g.
100
+ * string concatenation as `a => b => a + b`). `list.reduce` calls its reducer
101
+ * element-first, so the operation is `flip`ped before it is handed over.
102
+ *
103
+ * @template T The type of the elements in the monoid.
104
+ * @param monoid The monoid structure, including the identity and binary operation.
105
+ * @returns A function that reduces a `List<T>` to a single `T`.
106
+ *
107
+ * @example
108
+ *
109
+ * ```ts
110
+ * const add: Monoid<number> = {
111
+ * identity: 0,
112
+ * operation: a => b => a + b,
113
+ * };
114
+ *
115
+ * fold(add)([1, 2, 3, 4]) // 10
116
+ * fold(add)([]) // 0
117
+ *
118
+ * const concat: Monoid<string> = {
119
+ * identity: '',
120
+ * operation: a => b => a + b,
121
+ * };
122
+ *
123
+ * fold(concat)(['a', 'b', 'c']) // 'abc' — order preserved
124
+ * ```
125
+ */
126
+ export declare const fold: <T>({ identity, operation }: Monoid<T>) => (list: List<T>) => T;
@@ -0,0 +1,88 @@
1
+ import { reduce } from '../../types/list/module.f.js';
2
+ import { flip } from '../../types/function/module.f.js';
3
+ /**
4
+ * Repeats a monoid operation `n` times on the given element `a`.
5
+ * This function efficiently performs the operation using exponentiation by squaring.
6
+ *
7
+ * @template T The type of the elements in the monoid.
8
+ * @param monoid The monoid structure, including the identity and binary operation.
9
+ * @returns A function that takes an element `a` and a repetition count `n`,
10
+ * and returns the result of applying the operation `n` times.
11
+ *
12
+ * See also {@link https://en.wikipedia.org/wiki/Exponentiation_by_squaring}.
13
+ *
14
+ * @example
15
+ *
16
+ * ```ts
17
+ * const add: Monoid<number> = {
18
+ * identity: 0,
19
+ * operation: a => b => a + b,
20
+ * };
21
+ *
22
+ * const resultAdd = repeat(add)(10n)(2) // 20
23
+ *
24
+ * const concat: Monoid<string> = {
25
+ * identity: '',
26
+ * operation: a => b => a + b,
27
+ * };
28
+ *
29
+ * const resultConcat = repeat(concat)(3n)('ha') // 'hahaha'
30
+ * ```
31
+ */
32
+ export const repeat = ({ identity, operation }) => n => a => {
33
+ let ai = a;
34
+ let ni = n;
35
+ let result = identity;
36
+ while (true) {
37
+ if ((ni & 1n) !== 0n) {
38
+ result = operation(result)(ai);
39
+ }
40
+ ni >>= 1n;
41
+ if (ni === 0n) {
42
+ return result;
43
+ }
44
+ ai = operation(ai)(ai);
45
+ }
46
+ };
47
+ /**
48
+ * Reduces a `List<T>` with the monoid's associative `operation`, seeded at its
49
+ * `identity`. An empty list folds to `identity`.
50
+ *
51
+ * `fold` is the reduction companion of {@link repeat}: where `repeat` applies
52
+ * the operation a fixed number of times to a single element, `fold` applies it
53
+ * across every element of a list. Together they let list reductions such as
54
+ * `sum`, `product`, and string `concat` be expressed directly as monoid folds,
55
+ * so the identity paired with each operation is stated once at the call site
56
+ * instead of hand-seeding a raw `reduce`.
57
+ *
58
+ * Like `repeat`, `fold` applies the operation **accumulator-first**:
59
+ * `operation(accumulator)(element)`, seeded at `identity`, so
60
+ * `[a, b, c]` folds to `((identity op a) op b) op c`. Left-to-right order is
61
+ * therefore preserved and `fold` is correct for non-commutative monoids (e.g.
62
+ * string concatenation as `a => b => a + b`). `list.reduce` calls its reducer
63
+ * element-first, so the operation is `flip`ped before it is handed over.
64
+ *
65
+ * @template T The type of the elements in the monoid.
66
+ * @param monoid The monoid structure, including the identity and binary operation.
67
+ * @returns A function that reduces a `List<T>` to a single `T`.
68
+ *
69
+ * @example
70
+ *
71
+ * ```ts
72
+ * const add: Monoid<number> = {
73
+ * identity: 0,
74
+ * operation: a => b => a + b,
75
+ * };
76
+ *
77
+ * fold(add)([1, 2, 3, 4]) // 10
78
+ * fold(add)([]) // 0
79
+ *
80
+ * const concat: Monoid<string> = {
81
+ * identity: '',
82
+ * operation: a => b => a + b,
83
+ * };
84
+ *
85
+ * fold(concat)(['a', 'b', 'c']) // 'abc' — order preserved
86
+ * ```
87
+ */
88
+ export const fold = ({ identity, operation }) => reduce(flip(operation))(identity);
@@ -0,0 +1,9 @@
1
+ export declare const proof: {
2
+ numberAdd: () => void;
3
+ stringConcat: () => void;
4
+ fold: {
5
+ nonEmpty: () => void;
6
+ order: () => void;
7
+ empty: () => void;
8
+ };
9
+ };
@@ -0,0 +1,48 @@
1
+ import { repeat, fold } from "./module.f.js";
2
+ import { assertEq } from '../../asserts/module.f.js';
3
+ export const proof = {
4
+ numberAdd: () => {
5
+ const add = {
6
+ identity: 0,
7
+ operation: a => b => a + b,
8
+ };
9
+ const resultAdd = repeat(add)(10n)(2); // 20
10
+ assertEq(resultAdd, 20);
11
+ const id = repeat(add)(0n)(42);
12
+ assertEq(id, 0);
13
+ },
14
+ stringConcat: () => {
15
+ const concat = {
16
+ identity: '',
17
+ operation: a => b => a + b,
18
+ };
19
+ const resultConcat = repeat(concat)(3n)('ha'); // 'hahaha'
20
+ assertEq(resultConcat, 'hahaha');
21
+ },
22
+ fold: {
23
+ nonEmpty: () => {
24
+ const add = {
25
+ identity: 0,
26
+ operation: a => b => a + b,
27
+ };
28
+ assertEq(fold(add)([1, 2, 3, 4]), 10);
29
+ },
30
+ order: () => {
31
+ // a non-commutative monoid: `fold` must preserve left-to-right order
32
+ // (`((('' + 'a') + 'b') + 'c')`), not reverse it to `'cba'`.
33
+ const concat = {
34
+ identity: '',
35
+ operation: a => b => a + b,
36
+ };
37
+ assertEq(fold(concat)(['a', 'b', 'c']), 'abc');
38
+ },
39
+ empty: () => {
40
+ const concat = {
41
+ identity: '',
42
+ operation: a => b => a + b,
43
+ };
44
+ // an empty list folds to the identity
45
+ assertEq(fold(concat)([]), '');
46
+ },
47
+ }
48
+ };
@@ -6,29 +6,21 @@ import { hmac } from './module.f.js';
6
6
  export const proof = {
7
7
  example: () => {
8
8
  const r = hmac(sha256)(utf8('key'))(utf8('The quick brown fox jumps over the lazy dog'));
9
- if (r !== vec(256n)(0xf7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8n)) {
10
- throw r;
11
- }
9
+ assertEq(r, vec(256n)(0xf7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8n));
12
10
  },
13
11
  sha256: () => {
14
12
  const r = hmac(sha256)(utf8('key'))(utf8('The quick brown fox jumps over the lazy dog'));
15
- if (uint(r) !== 0xf7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8n) {
16
- throw r;
17
- }
13
+ assertEq(uint(r), 0xf7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8n, r);
18
14
  },
19
15
  sha384: () => {
20
16
  const k = vec(384n)(0n);
21
17
  const m = vec(904n)(0x0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010069c7548c21d0dfea6b9a51c9ead4e27c33d3b3f180316e5bcab92c933f0e4dbc9a9083505bc92276aec4be312696ef7bf3bf603f4bbd381196a029f340585312n);
22
18
  const r = hmac(sha384)(k)(m);
23
- if (r !== vec(384n)(0x8f858157ce005cd52fd8e8f1a46b55e6cfae21c8c183d9c2f7504bedf450609edd7d3c6171dc0bdd2d2444faa28f18ban)) {
24
- throw uint(r).toString(16);
25
- }
19
+ assertEq(r, vec(384n)(0x8f858157ce005cd52fd8e8f1a46b55e6cfae21c8c183d9c2f7504bedf450609edd7d3c6171dc0bdd2d2444faa28f18ban), uint(r).toString(16));
26
20
  },
27
21
  sha512: () => {
28
22
  const r = hmac(sha512)(utf8('key'))(utf8('The quick brown fox jumps over the lazy dog'));
29
- if (r !== vec(512n)(0xb42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3an)) {
30
- throw r;
31
- }
23
+ assertEq(r, vec(512n)(0xb42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3an));
32
24
  },
33
25
  // RFC 4231 Test Case 6: key (131 bytes of 0xaa = 1048 bits) exceeds SHA-256 block size (512 bits),
34
26
  // so the key is first compressed via the hash function before use.