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
@@ -28,18 +28,18 @@
28
28
  */
29
29
  import {} from '../module.f.js';
30
30
  import { ok } from '../../result/module.f.js';
31
- import { find, map as listMap } from '../../list/module.f.js';
32
- import { constPrimitiveValidate, isArray, isObject, prependPath, primitive0Validate, verror, visit, } from '../common/module.f.js';
31
+ import { reverse, toArray } from '../../list/module.f.js';
32
+ import { constPrimitiveValidate, eachEntry, isArray, isObject, orVisit, primitive0Validate, verror, visit, } from '../common/module.f.js';
33
33
  export {} from '../common/module.f.js';
34
34
  const { entries } = Object;
35
- const keyedFirstError = (results) => {
36
- const e = results.find(([, r]) => r[0] === 'error');
37
- return e === undefined ? null : [e[0], e[1]];
38
- };
39
35
  const arrayRebuild = entries => entries.map(([, v]) => v);
40
36
  const recordRebuild = entries => Object.fromEntries(entries);
41
- /** Drops the `'ok'` tag from each result, yielding the rebuild's `[key, value]` entries. */
42
- const okEntries = (results) => results.map(([k, r]) => [k, r[1]]);
37
+ /** `eachEntry`'s accumulator seed: entries are consed on in reverse as they parse. */
38
+ const emptyEntries = null;
39
+ /** `eachEntry`'s accumulate step: an O(1) prepend, unlike rebuilding an array on every entry. */
40
+ const consEntry = (acc, k, v) => ({ first: [k, v], tail: acc });
41
+ /** Restores forward order from `consEntry`'s reverse-order list, in one linear pass. */
42
+ const orderedEntries = (list) => toArray(reverse(list));
43
43
  /**
44
44
  * Builds a parser for `array` or `record` schemas. Mirrors `validate`'s
45
45
  * `containerValidate`, but rebuilds a fresh container from each item's parsed
@@ -56,11 +56,8 @@ const containerParse = (isContainer, rebuild) => (item) => value => {
56
56
  return ok(rebuild([]));
57
57
  }
58
58
  const itemParse = parse(item);
59
- const results = e.map(([k, v]) => [k, itemParse(v)]);
60
- const err = keyedFirstError(results);
61
- return err === null
62
- ? ok(rebuild(okEntries(results)))
63
- : prependPath(err[0], err[1]);
59
+ const r = eachEntry(e, (_k, v) => itemParse(v), emptyEntries, consEntry);
60
+ return r[0] === 'error' ? r : ok(rebuild(orderedEntries(r[1])));
64
61
  };
65
62
  const arrayParse = containerParse(isArray, arrayRebuild);
66
63
  const recordParse = containerParse(isObject, recordRebuild);
@@ -74,18 +71,12 @@ const constContainerParse = (isContainer, getItem, rebuild) => (rtti) => value =
74
71
  if (!isContainer(value)) {
75
72
  return verror('unexpected value');
76
73
  }
77
- const results = entries(rtti).map(([k, t]) => [k, parse(t)(getItem(value, k))]);
78
- const err = keyedFirstError(results);
79
- return err === null
80
- ? ok(rebuild(okEntries(results)))
81
- : prependPath(err[0], err[1]);
74
+ const r = eachEntry(entries(rtti), (k, t) => parse(t)(getItem(value, k)), emptyEntries, consEntry);
75
+ return r[0] === 'error' ? r : ok(rebuild(orderedEntries(r[1])));
82
76
  };
83
77
  const tupleParse = constContainerParse(isArray, (value, k) => value[Number(k)], arrayRebuild);
84
78
  const structParse = constContainerParse(isObject, (value, k) => value[k], recordRebuild);
85
- const findFirst = find(verror('no match'))((k) => k[0] === 'ok');
86
- const orParse = (rtti) =>
87
- // `parse(t)` where t: Type forces Ts<Type> evaluation → TS2589; cast keeps result as any.
88
- value => findFirst(listMap(t => parse(t)(value))(rtti));
79
+ const orParse = (rtti) => orVisit(parse)(rtti);
89
80
  /**
90
81
  * Creates a parser function for the given RTTI schema.
91
82
  *
@@ -1,21 +1,14 @@
1
1
  import { parse } from './module.f.js';
2
2
  import { boolean, number, string, bigint, unknown, array, record, or, option } from '../module.f.js';
3
- const assertOk = ([k]) => { if (k !== 'ok') {
4
- throw 'expected ok';
5
- } };
6
- const assertError = ([k]) => { if (k !== 'error') {
7
- throw 'expected error';
8
- } };
3
+ import { assert, assertEq } from '../../../asserts/module.f.js';
4
+ const assertOk = ([k]) => { assertEq(k, 'ok', 'expected ok'); };
5
+ const assertError = ([k]) => { assertEq(k, 'error', 'expected error'); };
9
6
  const unwrap = (r) => {
10
- if (r[0] !== 'ok') {
11
- throw 'expected ok';
12
- }
7
+ assert(r[0] === 'ok', 'expected ok');
13
8
  return r[1];
14
9
  };
15
10
  const assertErrorPath = (expected) => (r) => {
16
- if (r[0] !== 'error') {
17
- throw 'expected error';
18
- }
11
+ assert(r[0] === 'error', 'expected error');
19
12
  const e = r[1];
20
13
  if (e.path.length !== expected.length) {
21
14
  throw `path length ${e.path.length} != ${expected.length}`;
@@ -207,9 +200,7 @@ export const proof = {
207
200
  freshArray: () => {
208
201
  const input = [1, 2, 3];
209
202
  const out = unwrap(parse(array(number))(input));
210
- if (out === input) {
211
- throw 'expected a fresh array';
212
- }
203
+ assert(out !== input, 'expected a fresh array');
213
204
  assertDeepEqual(out, [1, 2, 3]);
214
205
  },
215
206
  error: () => {
@@ -236,9 +227,7 @@ export const proof = {
236
227
  freshRecord: () => {
237
228
  const input = { a: 1, b: 2 };
238
229
  const out = unwrap(parse(record(number))(input));
239
- if (out === input) {
240
- throw 'expected a fresh record';
241
- }
230
+ assert(out !== input, 'expected a fresh record');
242
231
  assertDeepEqual(out, { a: 1, b: 2 });
243
232
  },
244
233
  error: () => {
@@ -11,9 +11,15 @@ export type Primitive = null | boolean | number | string | undefined | bigint;
11
11
  * The TypeScript type that rtti's `unknown` schema validates — any value that
12
12
  * an rtti schema can represent: a primitive, an array, or an object.
13
13
  *
14
- * Currently equivalent to `djs.Unknown`, but defined here to keep `rtti` free
15
- * of `djs` dependencies. May be extended to include functions or other
16
- * non-JSON-primitives in the future.
14
+ * This is the single source of truth for the rtti value domain: every rtti
15
+ * module (`common`, `validate`, `parse`, …) imports `Unknown`/`Primitive`
16
+ * from here, not from `djs`, keeping `rtti` free of a `djs` dependency (djs
17
+ * depends on rtti, not the other way around).
18
+ *
19
+ * The relationship to djs is a subset one — `djs.Unknown ⊆ rtti.Unknown` — not
20
+ * equality: the two happen to coincide today, but `rtti.Unknown` may widen to
21
+ * admit values djs cannot represent (e.g. functions) without djs following.
22
+ * Do not re-point rtti imports at `djs.Unknown` on the assumption they match.
17
23
  */
18
24
  export type Unknown = Primitive | Array | Object;
19
25
  /** A read-only array of {@link Unknown} values. */
@@ -54,7 +60,7 @@ export type StructTs<T extends Struct> = (keyof OptionalFields<T> extends never
54
60
  *
55
61
  * **Recursive schemas and TS2589:** when a schema is self-referential, `StructTs` would
56
62
  * expand infinitely and TypeScript raises TS2589. Break the cycle by annotating the
57
- * schema value with `Phantom<typeof myThunk, MyType>` from `fs/types/phantom/module.f.ts`.
63
+ * schema value with `Phantom<typeof myThunk, MyType>` from `fjs/types/phantom/module.f.ts`.
58
64
  * `Ts<>` detects the phantom key and returns `MyType` directly without recursing:
59
65
  *
60
66
  * ```ts
@@ -1,8 +1,10 @@
1
1
  import {} from '../module.f.js';
2
2
  import { ok } from '../../result/module.f.js';
3
- import { constPrimitiveValidate, isArray, isObject, prependPath, primitive0Validate, verror, visit, } from '../common/module.f.js';
3
+ import { constPrimitiveValidate, eachEntry, isArray, isObject, orVisit, primitive0Validate, verror, visit, } from '../common/module.f.js';
4
4
  export { constPrimitiveValidate, prependPath, primitive0Validate, verror, } from '../common/module.f.js';
5
5
  const { entries } = Object;
6
+ /** `validate` has nothing to collect from a successful entry — only pass/fail matters. */
7
+ const noAccumulate = () => undefined;
6
8
  /**
7
9
  * Builds a validator for `array` or `record` schemas.
8
10
  * The inner item validator is instantiated lazily (only when the container is
@@ -19,15 +21,10 @@ const containerValidate = (isContainer) => (item) => value => {
19
21
  // Note: we shouldn't instantiate `itemValidate` until we make sure `entries` is not empty.
20
22
  // Otherwise, we can get infinite recursion on empty arrays and objects
21
23
  const itemValidate = validate(item);
22
- for (const [k, v] of e) {
23
- const r = itemValidate(v);
24
- if (r[0] === 'error') {
25
- return prependPath(k, r);
26
- }
27
- }
24
+ const r = eachEntry(e, (_k, v) => itemValidate(v), undefined, noAccumulate);
28
25
  // `value` is Container<K>, but Ts<Info1<K,I>> = readonly Ts<I>[] | Record<string,Ts<I>>.
29
26
  // TypeScript can't narrow the container's element types through the validation loop.
30
- return ok(value);
27
+ return r[0] === 'error' ? r : ok(value);
31
28
  };
32
29
  const arrayValidate = containerValidate(isArray);
33
30
  const recordValidate = containerValidate(isObject);
@@ -40,32 +37,14 @@ const constContainerValidate = (isContainer, getItem) => (rtti) => value => {
40
37
  if (!isContainer(value)) {
41
38
  return verror('unexpected value');
42
39
  }
43
- for (const [k, v] of Object.entries(rtti)) {
44
- const item = getItem(value, k);
45
- const r = validate(v)(item);
46
- if (r[0] === 'error') {
47
- return prependPath(k, r);
48
- }
49
- }
40
+ const r = eachEntry(Object.entries(rtti), (k, v) => validate(v)(getItem(value, k)), undefined, noAccumulate);
50
41
  // `value` is C (Unknown container), but Ts<T> for T extends Tuple|Struct is not
51
42
  // structurally equivalent to C — TypeScript can't narrow element types through the loop.
52
- return ok(value);
43
+ return r[0] === 'error' ? r : ok(value);
53
44
  };
54
45
  const tupleValidate = constContainerValidate(isArray, (value, k) => value[Number(k)]);
55
46
  const structValidate = constContainerValidate(isObject, (value, k) => value[k]);
56
- const orValidate = (rtti) => {
57
- const all = rtti.map(r => validate(r));
58
- return value => {
59
- for (const i of all) {
60
- // `i` is Validate<Type>; calling without cast forces Ts<Type> evaluation → TS2589.
61
- const r = i(value);
62
- if (r[0] === 'ok') {
63
- return r;
64
- }
65
- }
66
- return verror('no match');
67
- };
68
- };
47
+ const orValidate = (rtti) => orVisit(validate)(rtti);
69
48
  /**
70
49
  * Creates a validator function for the given RTTI schema.
71
50
  *
@@ -1,15 +1,10 @@
1
1
  import { validate } from './module.f.js';
2
2
  import { boolean, number, string, bigint, unknown, array, record, or, option } from '../module.f.js';
3
- const assertOk = ([k]) => { if (k !== 'ok') {
4
- throw 'expected ok';
5
- } };
6
- const assertError = ([k]) => { if (k !== 'error') {
7
- throw 'expected error';
8
- } };
3
+ import { assert, assertEq } from '../../../asserts/module.f.js';
4
+ const assertOk = ([k]) => { assertEq(k, 'ok', 'expected ok'); };
5
+ const assertError = ([k]) => { assertEq(k, 'error', 'expected error'); };
9
6
  const assertErrorPath = (expected) => (r) => {
10
- if (r[0] !== 'error') {
11
- throw 'expected error';
12
- }
7
+ assert(r[0] === 'error', 'expected error');
13
8
  const e = r[1];
14
9
  if (e.path.length !== expected.length) {
15
10
  throw `path length ${e.path.length} != ${expected.length}`;
@@ -4,56 +4,43 @@ import { sort } from '../object/module.f.js';
4
4
  import { toArray, countdown, length } from '../list/module.f.js';
5
5
  import { flip } from '../function/module.f.js';
6
6
  import { cmp } from '../number/module.f.js';
7
+ import { assert, assertEq } from '../../asserts/module.f.js';
7
8
  const str = stringify(sort);
8
9
  const reverseCmp = flip(cmp);
9
10
  export const proof = {
10
11
  sortedMergre: [
11
12
  () => {
12
13
  const result = str(toArray(merge(cmp)([2, 3, 4])([1, 3, 5])));
13
- if (result !== '[1,2,3,4,5]') {
14
- throw result;
15
- }
14
+ assertEq(result, '[1,2,3,4,5]');
16
15
  },
17
16
  () => {
18
17
  const result = str(toArray(merge(cmp)([1, 2, 3])([])));
19
- if (result !== '[1,2,3]') {
20
- throw result;
21
- }
18
+ assertEq(result, '[1,2,3]');
22
19
  },
23
20
  () => {
24
21
  const n = 10_000;
25
22
  const list = countdown(n);
26
23
  const result = merge(reverseCmp)(list)(list);
27
24
  const len = length(result);
28
- if (len != n) {
29
- throw result;
30
- }
25
+ assert(len == n, result);
31
26
  }
32
27
  ],
33
28
  find: [
34
29
  () => {
35
30
  const result = find(cmp)(0)([0, 10, 20, 30, 40, 50, 60, 70, 80, 90]);
36
- if (result !== 0) {
37
- throw result;
38
- }
31
+ assertEq(result, 0);
39
32
  },
40
33
  () => {
41
34
  const result = find(cmp)(3)([0, 10, 20, 30, 40, 50, 60, 70, 80, 90]);
42
- if (result !== null) {
43
- throw result;
44
- }
35
+ assertEq(result, null);
45
36
  },
46
37
  () => {
47
38
  const result = find(cmp)(77)([0, 10, 20, 30, 40, 50, 60, 70, 80, 90]);
48
- if (result !== null) {
49
- throw result;
50
- }
39
+ assertEq(result, null);
51
40
  },
52
41
  () => {
53
42
  const result = find(cmp)(80)([0, 10, 20, 30, 40, 50, 60, 70, 80, 90]);
54
- if (result !== 80) {
55
- throw result;
56
- }
43
+ assertEq(result, 80);
57
44
  }
58
45
  ]
59
46
  };
@@ -4,6 +4,7 @@ import { sort } from '../object/module.f.js';
4
4
  import { toArray, countdown, length } from '../list/module.f.js';
5
5
  import { flip } from '../function/module.f.js';
6
6
  import { cmp } from '../number/module.f.js';
7
+ import { assert, assertEq } from '../../asserts/module.f.js';
7
8
  const str = a => stringify(sort)(a);
8
9
  const reverseCmp = flip(cmp);
9
10
  export const proof = {
@@ -12,81 +13,55 @@ export const proof = {
12
13
  const setA = [1, 3, 5];
13
14
  const setB = [3, 4, 5];
14
15
  const unionSet = union(cmp)(setA)(setB); // [1, 3, 4, 5]
15
- if (str(unionSet) !== '[1,3,4,5]') {
16
- throw 0;
17
- }
16
+ assertEq(str(unionSet), '[1,3,4,5]', 0);
18
17
  const intersectionSet = intersect(cmp)(setA)(setB); // [3, 5]
19
- if (str(intersectionSet) !== '[3,5]') {
20
- throw 1;
21
- }
22
- if (!has(cmp)(3)(setA)) {
23
- throw 2;
24
- }
25
- if (has(cmp)(2)(setA)) {
26
- throw 3;
27
- }
18
+ assertEq(str(intersectionSet), '[3,5]', 1);
19
+ assert(has(cmp)(3)(setA), 2);
20
+ assert(!(has(cmp)(2)(setA)), 3);
28
21
  },
29
22
  union: [
30
23
  () => {
31
24
  const result = str(toArray(union(cmp)([2, 3, 4])([1, 3, 5])));
32
- if (result !== '[1,2,3,4,5]') {
33
- throw result;
34
- }
25
+ assertEq(result, '[1,2,3,4,5]');
35
26
  },
36
27
  () => {
37
28
  const result = str(toArray(union(cmp)([1, 2, 3])([])));
38
- if (result !== '[1,2,3]') {
39
- throw result;
40
- }
29
+ assertEq(result, '[1,2,3]');
41
30
  },
42
31
  () => {
43
32
  const n = 10_000;
44
33
  const sortedSet = toArray(countdown(n));
45
34
  const result = union(reverseCmp)(sortedSet)(sortedSet);
46
35
  const len = length(result);
47
- if (len != n) {
48
- throw result;
49
- }
36
+ assert(len == n, result);
50
37
  }
51
38
  ],
52
39
  intersect: [
53
40
  () => {
54
41
  const result = str(toArray(intersect(cmp)([2, 3, 4])([1, 3, 5])));
55
- if (result !== '[3]') {
56
- throw result;
57
- }
42
+ assertEq(result, '[3]');
58
43
  },
59
44
  () => {
60
45
  const result = str(toArray(intersect(cmp)([1, 2, 3])([])));
61
- if (result !== '[]') {
62
- throw result;
63
- }
46
+ assertEq(result, '[]');
64
47
  }
65
48
  ],
66
49
  has: [
67
50
  () => {
68
51
  const result = has(cmp)(0)([0, 10, 20, 30, 40, 50, 60, 70, 80, 90]);
69
- if (!result) {
70
- throw result;
71
- }
52
+ assert(result, result);
72
53
  },
73
54
  () => {
74
55
  const result = has(cmp)(3)([0, 10, 20, 30, 40, 50, 60, 70, 80, 90]);
75
- if (result) {
76
- throw result;
77
- }
56
+ assert(!(result), result);
78
57
  },
79
58
  () => {
80
59
  const result = has(cmp)(77)([0, 10, 20, 30, 40, 50, 60, 70, 80, 90]);
81
- if (result) {
82
- throw result;
83
- }
60
+ assert(!(result), result);
84
61
  },
85
62
  () => {
86
63
  const result = has(cmp)(80)([0, 10, 20, 30, 40, 50, 60, 70, 80, 90]);
87
- if (!result) {
88
- throw result;
89
- }
64
+ assert(result, result);
90
65
  }
91
66
  ]
92
67
  };
@@ -18,10 +18,18 @@
18
18
  import { reduce as listReduce, repeat as listRepeat } from '../list/module.f.js';
19
19
  import { compose } from '../function/module.f.js';
20
20
  import { cmp as uCmp } from '../function/compare/module.f.js';
21
- import { join as joinOp, concat as concatOp } from '../function/operator/module.f.js';
21
+ import { join as joinOp } from '../function/operator/module.f.js';
22
+ import { fold } from '../../common/monoid/module.f.js';
23
+ // `join`'s per-separator reduction is seeded at `''` but is *not* a monoid fold:
24
+ // `joinOp(sep)` has no identity (`joinOp(sep)('')(x)` prepends a separator), so
25
+ // it stays a hand-seeded `reduce` rather than going through `monoid.fold`.
22
26
  const reduce = o => listReduce(o)('');
23
27
  export const join = compose(joinOp)(reduce);
24
- export const concat = reduce(concatOp);
28
+ // String concatenation with identity `''` is a lawful monoid, so `concat` is a
29
+ // monoid fold. The operation is accumulator-first (`a` on the left), matching
30
+ // `monoid.fold`'s convention — unlike the element-first `concat` in
31
+ // `function/operator`, which is written for `list.reduce`.
32
+ export const concat = fold({ identity: '', operation: a => b => a + b });
25
33
  export const repeat = v => compose(listRepeat(v))(concat);
26
34
  export const cmp = uCmp;
27
35
  export const splitAt = (p) => (v) => [v.substring(0, p), v.substring(p)];
@@ -0,0 +1,77 @@
1
+ import { join, concat, repeat, cmp, splitAt } from './module.f.js';
2
+ import { repeat as repeatList } from '../list/module.f.js';
3
+ import { assert, assertEq } from '../../asserts/module.f.js';
4
+ export const proof = {
5
+ example: () => {
6
+ const words = ['hello', 'world'];
7
+ assertEq(join(' ')(words), 'hello world', 0);
8
+ assertEq(concat(words), 'helloworld', 1);
9
+ assertEq(repeat('abc')(3), 'abcabcabc', 2);
10
+ assertEq(cmp('apple')('banana'), -1, 3);
11
+ },
12
+ join: {
13
+ 0: () => {
14
+ const result = join('/')([]);
15
+ assertEq(result, '');
16
+ },
17
+ 1: () => {
18
+ const result = join('/')(['']);
19
+ assertEq(result, '');
20
+ },
21
+ 3: () => {
22
+ const result = join(' ')(['hello', 'world', '!']);
23
+ assertEq(result, 'hello world !');
24
+ }
25
+ },
26
+ concat: () => {
27
+ const result = concat(['hello', 'world']);
28
+ assertEq(result, 'helloworld');
29
+ },
30
+ repeatList: {
31
+ 0: () => {
32
+ const s = join('.')(repeatList('x')(0));
33
+ assert(s == '', s);
34
+ },
35
+ 5: () => {
36
+ const s = join('.')(repeatList('x')(5));
37
+ assert(s == 'x.x.x.x.x', s);
38
+ }
39
+ },
40
+ repeat: () => {
41
+ const s = repeat('x')(5);
42
+ if (s != 'xxxxx') {
43
+ throw s;
44
+ }
45
+ },
46
+ cmp: () => {
47
+ const result = cmp('3')('4');
48
+ assertEq(result, -1);
49
+ },
50
+ splitAt: {
51
+ middle: () => {
52
+ const [a, b] = splitAt(3)('hello');
53
+ assertEq(a, 'hel');
54
+ assertEq(b, 'lo');
55
+ },
56
+ zero: () => {
57
+ const [a, b] = splitAt(0)('hello');
58
+ assertEq(a, '');
59
+ assertEq(b, 'hello');
60
+ },
61
+ full: () => {
62
+ const [a, b] = splitAt(5)('hello');
63
+ assertEq(a, 'hello');
64
+ assertEq(b, '');
65
+ },
66
+ beyond: () => {
67
+ const [a, b] = splitAt(10)('hello');
68
+ assertEq(a, 'hello');
69
+ assertEq(b, '');
70
+ },
71
+ empty: () => {
72
+ const [a, b] = splitAt(0)('');
73
+ assertEq(a, '');
74
+ assertEq(b, '');
75
+ },
76
+ }
77
+ };
@@ -0,0 +1,43 @@
1
+ import { contains, fromValues, remove, set } from './module.f.js';
2
+ import { assert, assertEq } from '../../asserts/module.f.js';
3
+ export const proof = {
4
+ example: () => {
5
+ let mySet = fromValues(['apple', 'banana', 'cherry']);
6
+ assert(contains('banana')(mySet), '1');
7
+ assert(!(contains('date')(mySet)), '2');
8
+ mySet = set('date')(mySet);
9
+ assert(contains('date')(mySet), '3');
10
+ mySet = remove('banana')(mySet);
11
+ assert(!(contains('banana')(mySet)), '4');
12
+ },
13
+ contains: () => {
14
+ const r = set('hello')(null);
15
+ assert(contains('hello')(r), r);
16
+ assert(!(contains('hello1')(r)), r);
17
+ },
18
+ remove: () => {
19
+ let r = set('hello')(null);
20
+ r = set('world')(r);
21
+ r = set('HELLO')(r);
22
+ r = set('WORLD!')(r);
23
+ assert(contains('hello')(r), r);
24
+ assert(!(contains('hello1')(r)), r);
25
+ assert(contains('HELLO')(r), r);
26
+ assert(!(contains('WORLD')(r)), r);
27
+ assert(contains('world')(r), r);
28
+ assert(!(contains('world!')(r)), r);
29
+ assert(contains('WORLD!')(r), r);
30
+ //
31
+ r = remove('hello')(r);
32
+ assert(!(contains('hello')(r)), r);
33
+ assert(contains('world')(r), r);
34
+ r = remove('world')(r);
35
+ assert(!(contains('world')(r)), r);
36
+ assert(contains('HELLO')(r), r);
37
+ r = remove('HELLO')(r);
38
+ assert(!(contains('HELLO')(r)), r);
39
+ assert(contains('WORLD!')(r), r);
40
+ r = remove('WORLD!')(r);
41
+ assertEq(r, null);
42
+ }
43
+ };
@@ -1,71 +1,50 @@
1
1
  import { printer, primitive, union } from './module.f.js';
2
+ import { assertEq } from '../../asserts/module.f.js';
2
3
  const ro = printer();
3
4
  const mut = printer(true);
4
5
  export const primitiveNull = () => {
5
6
  const r = primitive(null);
6
- if (r !== 'null') {
7
- throw r;
8
- }
7
+ assertEq(r, 'null');
9
8
  };
10
9
  export const primitiveBigint = () => {
11
10
  const r = primitive(42n);
12
- if (r !== '42n') {
13
- throw r;
14
- }
11
+ assertEq(r, '42n');
15
12
  };
16
13
  export const primitiveString = () => {
17
14
  const r = primitive('hello');
18
- if (r !== '"hello"') {
19
- throw r;
20
- }
15
+ assertEq(r, '"hello"');
21
16
  };
22
17
  export const primitiveNumberFinite = () => {
23
18
  const r = primitive(3.14);
24
- if (r !== '3.14') {
25
- throw r;
26
- }
19
+ assertEq(r, '3.14');
27
20
  };
28
21
  export const primitiveNumberInfinite = () => {
29
22
  const r = primitive(Infinity);
30
- if (r !== 'number') {
31
- throw r;
32
- }
23
+ assertEq(r, 'number');
33
24
  };
34
25
  export const primitiveUndefined = () => {
35
26
  const r = primitive(undefined);
36
- if (r !== 'undefined') {
37
- throw r;
38
- }
27
+ assertEq(r, 'undefined');
39
28
  };
40
29
  export const primitiveBoolean = () => {
41
30
  const r = primitive(true);
42
- if (r !== 'true') {
43
- throw r;
44
- }
31
+ assertEq(r, 'true');
45
32
  };
46
33
  export const unionEmpty = () => {
47
34
  const r = union([]);
48
- if (r !== 'never') {
49
- throw r;
50
- }
35
+ assertEq(r, 'never');
51
36
  };
52
37
  export const unionSingle = () => {
53
38
  const r = union(['string']);
54
- if (r !== 'string') {
55
- throw r;
56
- }
39
+ assertEq(r, 'string');
57
40
  };
58
41
  export const unionMulti = () => {
59
42
  const r = union(['string', 'number']);
60
- if (r !== 'string|number') {
61
- throw r;
62
- }
43
+ assertEq(r, 'string|number');
63
44
  };
64
45
  export const printerReadonlyTuple = () => {
65
46
  const r = ro.tuple(['string', 'number']);
66
- if (r !== 'readonly[string,number]') {
67
- throw r;
68
- }
47
+ assertEq(r, 'readonly[string,number]');
69
48
  };
70
49
  export const printerReadonlyStruct = () => {
71
50
  const r = ro.struct([['x', 'number'], ['y', 'string']]);
@@ -75,9 +54,7 @@ export const printerReadonlyStruct = () => {
75
54
  };
76
55
  export const printerReadonlyArray = () => {
77
56
  const r = ro.array('string');
78
- if (r !== 'readonly(string)[]') {
79
- throw r;
80
- }
57
+ assertEq(r, 'readonly(string)[]');
81
58
  };
82
59
  export const printerReadonlyRecord = () => {
83
60
  const r = ro.record('number');
@@ -87,9 +64,7 @@ export const printerReadonlyRecord = () => {
87
64
  };
88
65
  export const printerMutableTuple = () => {
89
66
  const r = mut.tuple(['string', 'number']);
90
- if (r !== '[string,number]') {
91
- throw r;
92
- }
67
+ assertEq(r, '[string,number]');
93
68
  };
94
69
  export const printerMutableStruct = () => {
95
70
  const r = mut.struct([['x', 'number']]);
@@ -99,9 +74,7 @@ export const printerMutableStruct = () => {
99
74
  };
100
75
  export const printerMutableArray = () => {
101
76
  const r = mut.array('string');
102
- if (r !== '(string)[]') {
103
- throw r;
104
- }
77
+ assertEq(r, '(string)[]');
105
78
  };
106
79
  export const printerMutableRecord = () => {
107
80
  const r = mut.record('number');