functionalscript 0.44.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/README.md +5 -3
  2. package/fjs/asn.1/module.f.mjs +8 -1
  3. package/fjs/asn.1/proof.f.d.mts +15 -0
  4. package/fjs/asn.1/proof.f.mjs +31 -3
  5. package/fjs/asserts/module.f.d.mts +14 -0
  6. package/fjs/asserts/module.f.mjs +20 -0
  7. package/fjs/asserts/proof.f.d.mts +3 -0
  8. package/fjs/asserts/proof.f.mjs +15 -1
  9. package/fjs/basen/base128/module.f.mjs +22 -5
  10. package/fjs/basen/base128/proof.f.d.mts +3 -1
  11. package/fjs/basen/base128/proof.f.mjs +3 -1
  12. package/fjs/basen/base64/module.f.mjs +7 -3
  13. package/fjs/basen/base64/proof.f.d.mts +3 -1
  14. package/fjs/basen/base64/proof.f.mjs +7 -4
  15. package/fjs/basen/cbase32/proof.f.d.mts +3 -1
  16. package/fjs/basen/cbase32/proof.f.mjs +3 -1
  17. package/fjs/bnf/data/module.f.d.mts +32 -6
  18. package/fjs/bnf/data/module.f.mjs +112 -7
  19. package/fjs/bnf/data/proof.f.d.mts +2 -0
  20. package/fjs/bnf/data/proof.f.mjs +74 -4
  21. package/fjs/bnf/data/types.d.ts +20 -2
  22. package/fjs/bnf/descent/module.f.d.mts +34 -5
  23. package/fjs/bnf/descent/module.f.mjs +176 -54
  24. package/fjs/bnf/descent/proof.f.d.mts +3 -0
  25. package/fjs/bnf/descent/proof.f.mjs +189 -27
  26. package/fjs/bnf/descent/types.d.ts +24 -18
  27. package/fjs/bnf/ll1/module.f.d.mts +74 -6
  28. package/fjs/bnf/ll1/module.f.mjs +297 -95
  29. package/fjs/bnf/ll1/proof.f.d.mts +17 -2
  30. package/fjs/bnf/ll1/proof.f.mjs +372 -137
  31. package/fjs/bnf/ll1/types.d.ts +25 -27
  32. package/fjs/bnf/matcher/module.f.d.mts +66 -0
  33. package/fjs/bnf/matcher/module.f.mjs +81 -0
  34. package/fjs/bnf/matcher/proof.f.d.mts +10 -0
  35. package/fjs/bnf/matcher/proof.f.mjs +79 -0
  36. package/fjs/bnf/matcher/types.d.ts +54 -0
  37. package/fjs/bnf/module.f.d.mts +15 -6
  38. package/fjs/bnf/module.f.mjs +52 -11
  39. package/fjs/bnf/proof.f.d.mts +2 -0
  40. package/fjs/bnf/proof.f.mjs +79 -3
  41. package/fjs/bnf/testlib.f.d.mts +31 -0
  42. package/fjs/bnf/testlib.f.mjs +80 -0
  43. package/fjs/bnf/token_symbol/module.f.d.mts +4 -3
  44. package/fjs/bnf/token_symbol/module.f.mjs +7 -6
  45. package/fjs/bnf/token_symbol/proof.f.mjs +5 -2
  46. package/fjs/bnf/token_symbol/types.d.ts +2 -2
  47. package/fjs/bnf/types.d.ts +10 -3
  48. package/fjs/cas/cli/module.f.d.mts +1 -1
  49. package/fjs/cas/cli/module.f.mjs +14 -20
  50. package/fjs/cas/cli/proof.f.d.mts +4 -4
  51. package/fjs/cas/cli/proof.f.mjs +47 -34
  52. package/fjs/cas/evo/module.f.d.mts +71 -31
  53. package/fjs/cas/evo/module.f.mjs +223 -138
  54. package/fjs/cas/evo/proof.f.d.mts +10 -1
  55. package/fjs/cas/evo/proof.f.mjs +311 -226
  56. package/fjs/cas/evo/types.d.ts +45 -9
  57. package/fjs/cas/module.f.d.mts +18 -32
  58. package/fjs/cas/module.f.mjs +164 -176
  59. package/fjs/cas/proof.f.d.mts +11 -8
  60. package/fjs/cas/proof.f.mjs +259 -147
  61. package/fjs/cas/types.d.ts +24 -10
  62. package/fjs/ci/common/module.f.d.mts +1 -1
  63. package/fjs/ci/common/module.f.mjs +1 -0
  64. package/fjs/ci/config/module.f.d.mts +3 -3
  65. package/fjs/ci/config/module.f.mjs +3 -3
  66. package/fjs/ci/module.f.d.mts +5 -5
  67. package/fjs/ci/module.f.mjs +8 -7
  68. package/fjs/ci/nix/module.f.d.mts +7 -5
  69. package/fjs/ci/nix/module.f.mjs +13 -12
  70. package/fjs/ci/nix/proof.f.d.mts +2 -0
  71. package/fjs/ci/nix/proof.f.mjs +4 -4
  72. package/fjs/ci/proof.f.d.mts +4 -2
  73. package/fjs/ci/proof.f.mjs +13 -8
  74. package/fjs/cli/module.f.d.mts +4 -6
  75. package/fjs/cli/module.f.mjs +4 -8
  76. package/fjs/cli/proof.f.d.mts +4 -2
  77. package/fjs/cli/proof.f.mjs +21 -18
  78. package/fjs/cli/types.d.ts +2 -3
  79. package/fjs/common/monoid/module.f.d.mts +70 -12
  80. package/fjs/common/monoid/module.f.mjs +177 -14
  81. package/fjs/common/monoid/proof.f.d.mts +12 -1
  82. package/fjs/common/monoid/proof.f.mjs +88 -4
  83. package/fjs/common/monoid/types.d.ts +23 -0
  84. package/fjs/crypto/hmac/module.f.mjs +2 -2
  85. package/fjs/crypto/secp/proof.f.d.mts +3 -1
  86. package/fjs/crypto/secp/proof.f.mjs +3 -1
  87. package/fjs/crypto/sha2/module.f.mjs +3 -1
  88. package/fjs/crypto/sha2/proof.f.d.mts +4 -1
  89. package/fjs/crypto/sha2/proof.f.mjs +27 -1
  90. package/fjs/crypto/sha2/types.d.ts +11 -0
  91. package/fjs/crypto/sign/module.f.mjs +2 -2
  92. package/fjs/crypto/vdf/module.f.d.mts +23 -4
  93. package/fjs/crypto/vdf/module.f.mjs +6 -4
  94. package/fjs/dev/module.f.d.mts +17 -5
  95. package/fjs/dev/module.f.mjs +60 -30
  96. package/fjs/dev/update/module.f.d.mts +11 -3
  97. package/fjs/dev/update/module.f.mjs +16 -11
  98. package/fjs/dev/update/proof.f.d.mts +4 -3
  99. package/fjs/dev/update/proof.f.mjs +11 -7
  100. package/fjs/djs/module.f.d.mts +13 -5
  101. package/fjs/djs/module.f.mjs +31 -16
  102. package/fjs/djs/parser/module.f.d.mts +16 -3
  103. package/fjs/djs/parser/module.f.mjs +135 -16
  104. package/fjs/djs/parser/proof.f.d.mts +8 -1
  105. package/fjs/djs/parser/proof.f.mjs +287 -13
  106. package/fjs/djs/parser/types.d.ts +7 -1
  107. package/fjs/djs/proof.f.d.mts +20 -1
  108. package/fjs/djs/proof.f.mjs +190 -12
  109. package/fjs/djs/serializer/module.f.d.mts +25 -8
  110. package/fjs/djs/serializer/module.f.mjs +66 -19
  111. package/fjs/djs/serializer/proof.f.d.mts +5 -0
  112. package/fjs/djs/serializer/proof.f.mjs +23 -1
  113. package/fjs/djs/tokenizer/module.f.d.mts +17 -5
  114. package/fjs/djs/tokenizer/module.f.mjs +120 -73
  115. package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
  116. package/fjs/djs/tokenizer/proof.f.mjs +86 -67
  117. package/fjs/djs/transpiler/module.f.d.mts +13 -19
  118. package/fjs/djs/transpiler/module.f.mjs +79 -72
  119. package/fjs/djs/transpiler/types.d.ts +29 -0
  120. package/fjs/djs/types.d.ts +7 -1
  121. package/fjs/effects/list/module.f.d.mts +23 -12
  122. package/fjs/effects/list/module.f.mjs +16 -12
  123. package/fjs/effects/list/types.d.ts +27 -7
  124. package/fjs/effects/memory/module.f.d.mts +6 -3
  125. package/fjs/effects/memory/module.f.mjs +7 -7
  126. package/fjs/effects/memory/proof.f.d.mts +4 -0
  127. package/fjs/effects/memory/proof.f.mjs +18 -9
  128. package/fjs/effects/memory/types.d.ts +4 -3
  129. package/fjs/effects/mock/module.f.d.mts +28 -4
  130. package/fjs/effects/mock/module.f.mjs +39 -5
  131. package/fjs/effects/mock/types.d.ts +10 -1
  132. package/fjs/effects/module.d.mts +12 -2
  133. package/fjs/effects/module.f.d.mts +469 -281
  134. package/fjs/effects/module.f.mjs +538 -299
  135. package/fjs/effects/module.mjs +11 -2
  136. package/fjs/effects/node/memory/module.d.mts +7 -2
  137. package/fjs/effects/node/memory/module.mjs +9 -5
  138. package/fjs/effects/node/memory/proof.d.mts +2 -0
  139. package/fjs/effects/node/memory/proof.mjs +12 -5
  140. package/fjs/effects/node/module.d.mts +8 -2
  141. package/fjs/effects/node/module.f.d.mts +183 -43
  142. package/fjs/effects/node/module.f.mjs +260 -62
  143. package/fjs/effects/node/module.mjs +61 -50
  144. package/fjs/effects/node/proof.f.d.mts +28 -2
  145. package/fjs/effects/node/proof.f.mjs +161 -42
  146. package/fjs/effects/node/types.d.ts +106 -18
  147. package/fjs/effects/node/virtual/module.f.d.mts +21 -4
  148. package/fjs/effects/node/virtual/module.f.mjs +113 -70
  149. package/fjs/effects/node/virtual/proof.f.d.mts +31 -2
  150. package/fjs/effects/node/virtual/proof.f.mjs +201 -8
  151. package/fjs/effects/proof.f.d.mts +69 -34
  152. package/fjs/effects/proof.f.mjs +413 -130
  153. package/fjs/effects/types.d.ts +161 -33
  154. package/fjs/emergent_testing/all.test.d.mts +8 -0
  155. package/fjs/emergent_testing/all.test.mjs +14 -0
  156. package/fjs/emergent_testing/module.f.d.mts +22 -10
  157. package/fjs/emergent_testing/module.f.mjs +119 -85
  158. package/fjs/emergent_testing/proof.f.d.mts +21 -7
  159. package/fjs/emergent_testing/proof.f.mjs +169 -35
  160. package/fjs/emergent_testing/types.d.ts +22 -4
  161. package/fjs/fsc/bnf.f.d.mts +3 -0
  162. package/fjs/fsc/bnf.f.mjs +4 -1
  163. package/fjs/fsc/json.f.d.mts +3 -0
  164. package/fjs/fsc/json.f.mjs +4 -1
  165. package/fjs/fsc/module.f.d.mts +9 -0
  166. package/fjs/fsc/module.f.mjs +5 -3
  167. package/fjs/fsm/module.f.d.mts +14 -4
  168. package/fjs/fsm/module.f.mjs +54 -37
  169. package/fjs/fsm/proof.f.d.mts +5 -0
  170. package/fjs/fsm/proof.f.mjs +87 -115
  171. package/fjs/js/keywords/module.f.d.mts +52 -0
  172. package/fjs/js/keywords/module.f.mjs +72 -0
  173. package/fjs/{emergent_testing/scenarios/return-value.pass.d.ts → js/keywords/proof.f.d.mts} +1 -1
  174. package/fjs/js/keywords/proof.f.mjs +13 -0
  175. package/fjs/js/tokenizer/module.f.d.mts +30 -3
  176. package/fjs/js/tokenizer/module.f.mjs +161 -211
  177. package/fjs/js/tokenizer/proof.f.d.mts +1 -0
  178. package/fjs/js/tokenizer/proof.f.mjs +54 -24
  179. package/fjs/js/tokenizer/types.d.ts +33 -24
  180. package/fjs/mcp/cas/module.f.d.mts +1 -6
  181. package/fjs/mcp/cas/module.f.mjs +55 -51
  182. package/fjs/mcp/cas/proof.f.d.mts +15 -0
  183. package/fjs/mcp/cas/proof.f.mjs +174 -0
  184. package/fjs/mcp/evo/module.f.d.mts +19 -10
  185. package/fjs/mcp/evo/module.f.mjs +48 -27
  186. package/fjs/mcp/evo/proof.f.d.mts +6 -1
  187. package/fjs/mcp/evo/proof.f.mjs +115 -31
  188. package/fjs/mcp/module.f.d.mts +39 -4
  189. package/fjs/mcp/module.f.mjs +14 -12
  190. package/fjs/mcp/proof.f.d.mts +13 -1
  191. package/fjs/mcp/proof.f.mjs +120 -61
  192. package/fjs/media/html/module.f.d.mts +12 -0
  193. package/fjs/media/html/module.f.mjs +7 -5
  194. package/fjs/media/html/proof.f.d.mts +3 -0
  195. package/fjs/media/html/proof.f.mjs +4 -1
  196. package/fjs/media/json/extended/module.f.d.mts +82 -0
  197. package/fjs/media/json/extended/module.f.mjs +153 -0
  198. package/fjs/media/json/extended/proof.f.d.mts +42 -0
  199. package/fjs/media/json/extended/proof.f.mjs +127 -0
  200. package/fjs/media/json/extended/types.d.ts +23 -0
  201. package/fjs/media/json/module.f.d.mts +8 -2
  202. package/fjs/media/json/module.f.mjs +43 -41
  203. package/fjs/media/json/number/module.f.d.mts +59 -0
  204. package/fjs/media/json/number/module.f.mjs +136 -0
  205. package/fjs/media/json/number/proof.f.d.mts +24 -0
  206. package/fjs/media/json/number/proof.f.mjs +86 -0
  207. package/fjs/media/json/number/types.d.ts +28 -0
  208. package/fjs/media/json/parser/module.f.d.mts +25 -13
  209. package/fjs/media/json/parser/module.f.mjs +133 -72
  210. package/fjs/media/json/parser/proof.f.d.mts +5 -0
  211. package/fjs/media/json/parser/proof.f.mjs +31 -1
  212. package/fjs/media/json/parser/types.d.ts +38 -14
  213. package/fjs/media/json/rtti/module.f.d.mts +1 -1
  214. package/fjs/media/json/rtti/module.f.mjs +1 -1
  215. package/fjs/media/json/rtti/proof.f.d.mts +3 -0
  216. package/fjs/media/json/rtti/proof.f.mjs +12 -12
  217. package/fjs/media/json/schema/module.f.d.mts +61 -27
  218. package/fjs/media/json/schema/module.f.mjs +218 -63
  219. package/fjs/media/json/schema/proof.f.d.mts +41 -1
  220. package/fjs/media/json/schema/proof.f.mjs +220 -9
  221. package/fjs/media/json/serializer/module.f.d.mts +44 -0
  222. package/fjs/media/json/serializer/module.f.mjs +71 -9
  223. package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
  224. package/fjs/media/json/tokenizer/module.f.mjs +31 -8
  225. package/fjs/media/json/tokenizer/proof.f.d.mts +6 -0
  226. package/fjs/media/json/tokenizer/proof.f.mjs +62 -21
  227. package/fjs/media/json/types.d.ts +36 -10
  228. package/fjs/media/lock/module.f.d.mts +100 -0
  229. package/fjs/media/lock/module.f.mjs +125 -0
  230. package/fjs/media/lock/proof.f.d.mts +33 -0
  231. package/fjs/media/lock/proof.f.mjs +196 -0
  232. package/fjs/media/lock/types.d.ts +15 -0
  233. package/fjs/media/module.f.d.mts +6 -5
  234. package/fjs/media/module.f.mjs +8 -7
  235. package/fjs/media/nix/module.f.d.mts +13 -0
  236. package/fjs/media/nix/module.f.mjs +4 -2
  237. package/fjs/media/nix/proof.f.d.mts +3 -0
  238. package/fjs/media/nix/proof.f.mjs +4 -1
  239. package/fjs/media/note/module.f.d.mts +121 -0
  240. package/fjs/media/note/module.f.mjs +131 -0
  241. package/fjs/media/note/proof.f.d.mts +29 -0
  242. package/fjs/media/note/proof.f.mjs +150 -0
  243. package/fjs/media/note/types.d.ts +10 -0
  244. package/fjs/media/proof.f.d.mts +4 -1
  245. package/fjs/media/proof.f.mjs +40 -21
  246. package/fjs/media/revision/module.f.d.mts +83 -7
  247. package/fjs/media/revision/module.f.mjs +127 -23
  248. package/fjs/media/revision/proof.f.d.mts +14 -0
  249. package/fjs/media/revision/proof.f.mjs +93 -2
  250. package/fjs/media/revision/types.d.ts +34 -5
  251. package/fjs/media/type/module.f.d.mts +53 -18
  252. package/fjs/media/type/module.f.mjs +87 -97
  253. package/fjs/media/type/proof.f.d.mts +17 -0
  254. package/fjs/media/type/proof.f.mjs +73 -13
  255. package/fjs/module.d.mts +5 -0
  256. package/fjs/module.f.d.mts +8 -0
  257. package/fjs/module.f.mjs +33 -10
  258. package/fjs/module.mjs +6 -0
  259. package/fjs/nanvm/proof.f.mjs +3 -3
  260. package/fjs/nanvm/rust/module.f.mjs +1 -1
  261. package/fjs/nanvm/update/module.f.d.mts +4 -4
  262. package/fjs/nanvm/update/module.f.mjs +8 -9
  263. package/fjs/nanvm/update/proof.f.mjs +4 -3
  264. package/fjs/path/module.f.d.mts +8 -0
  265. package/fjs/path/module.f.mjs +4 -2
  266. package/fjs/proof.f.d.mts +7 -3
  267. package/fjs/proof.f.mjs +41 -12
  268. package/fjs/protocol/json_rpc/module.f.d.mts +3 -3
  269. package/fjs/protocol/json_rpc/module.f.mjs +10 -7
  270. package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
  271. package/fjs/protocol/json_rpc/proof.f.mjs +26 -5
  272. package/fjs/protocol/mcp/module.f.d.mts +10 -13
  273. package/fjs/protocol/mcp/module.f.mjs +74 -58
  274. package/fjs/protocol/mcp/proof.f.d.mts +16 -3
  275. package/fjs/protocol/mcp/proof.f.mjs +224 -69
  276. package/fjs/protocol/mcp/stdio/module.f.d.mts +17 -11
  277. package/fjs/protocol/mcp/stdio/module.f.mjs +39 -33
  278. package/fjs/protocol/mcp/stdio/proof.f.d.mts +5 -3
  279. package/fjs/protocol/mcp/stdio/proof.f.mjs +46 -13
  280. package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
  281. package/fjs/protocol/mcp/types.d.ts +17 -6
  282. package/fjs/sul/id/module.f.d.mts +4 -0
  283. package/fjs/sul/id/module.f.mjs +6 -6
  284. package/fjs/sul/level/hash/module.f.d.mts +4 -1
  285. package/fjs/sul/level/hash/module.f.mjs +6 -4
  286. package/fjs/sul/level/hash/proof.f.d.mts +4 -0
  287. package/fjs/sul/level/hash/proof.f.mjs +7 -4
  288. package/fjs/sul/level/literal/module.f.d.mts +4 -1
  289. package/fjs/sul/level/literal/module.f.mjs +4 -3
  290. package/fjs/sul/level/literal/proof.f.d.mts +3 -0
  291. package/fjs/sul/level/literal/proof.f.mjs +4 -1
  292. package/fjs/sul/module.f.d.mts +5 -3
  293. package/fjs/sul/module.f.mjs +23 -17
  294. package/fjs/sul/proof.f.d.mts +4 -0
  295. package/fjs/sul/proof.f.mjs +5 -2
  296. package/fjs/text/ascii/module.f.d.mts +26 -0
  297. package/fjs/text/ascii/module.f.mjs +49 -1
  298. package/fjs/text/ascii/proof.f.d.mts +10 -0
  299. package/fjs/text/ascii/proof.f.mjs +33 -1
  300. package/fjs/text/code_point/module.f.d.mts +29 -3
  301. package/fjs/text/code_point/module.f.mjs +32 -9
  302. package/fjs/text/code_point/proof.f.d.mts +2 -0
  303. package/fjs/text/code_point/proof.f.mjs +39 -0
  304. package/fjs/text/module.f.d.mts +4 -2
  305. package/fjs/text/module.f.mjs +4 -3
  306. package/fjs/text/proof.f.d.mts +3 -0
  307. package/fjs/text/proof.f.mjs +4 -1
  308. package/fjs/text/sgr/module.f.d.mts +6 -5
  309. package/fjs/text/sgr/module.f.mjs +8 -8
  310. package/fjs/text/sgr/proof.f.d.mts +3 -0
  311. package/fjs/text/sgr/proof.f.mjs +4 -1
  312. package/fjs/text/utf16/module.f.d.mts +5 -1
  313. package/fjs/text/utf16/module.f.mjs +38 -35
  314. package/fjs/text/utf16/proof.f.d.mts +3 -1
  315. package/fjs/text/utf16/proof.f.mjs +19 -2
  316. package/fjs/text/utf8/module.f.d.mts +9 -5
  317. package/fjs/text/utf8/module.f.mjs +20 -20
  318. package/fjs/types/array/module.f.d.mts +2 -1
  319. package/fjs/types/array/module.f.mjs +16 -4
  320. package/fjs/types/bigfloat/module.f.d.mts +21 -1
  321. package/fjs/types/bigfloat/module.f.mjs +33 -7
  322. package/fjs/types/bigfloat/proof.f.d.mts +1 -0
  323. package/fjs/types/bigfloat/proof.f.mjs +46 -0
  324. package/fjs/types/bigint/module.f.d.mts +4 -0
  325. package/fjs/types/bigint/module.f.mjs +4 -3
  326. package/fjs/types/bit_vec/module.f.d.mts +10 -16
  327. package/fjs/types/bit_vec/module.f.mjs +99 -95
  328. package/fjs/types/bit_vec/proof.f.d.mts +6 -0
  329. package/fjs/types/bit_vec/proof.f.mjs +31 -5
  330. package/fjs/types/btree/find/module.f.d.mts +5 -1
  331. package/fjs/types/btree/find/module.f.mjs +5 -5
  332. package/fjs/types/btree/find/proof.f.d.mts +5 -1
  333. package/fjs/types/btree/find/proof.f.mjs +5 -3
  334. package/fjs/types/btree/module.f.d.mts +3 -0
  335. package/fjs/types/btree/module.f.mjs +3 -2
  336. package/fjs/types/btree/proof.f.d.mts +5 -1
  337. package/fjs/types/btree/proof.f.mjs +5 -3
  338. package/fjs/types/btree/remove/module.f.d.mts +11 -0
  339. package/fjs/types/btree/remove/module.f.mjs +10 -10
  340. package/fjs/types/btree/remove/proof.f.d.mts +3 -0
  341. package/fjs/types/btree/remove/proof.f.mjs +4 -1
  342. package/fjs/types/btree/set/module.f.d.mts +9 -0
  343. package/fjs/types/btree/set/module.f.mjs +14 -17
  344. package/fjs/types/btree/set/proof.f.d.mts +3 -0
  345. package/fjs/types/btree/set/proof.f.mjs +16 -1
  346. package/fjs/types/btree/types/module.f.d.mts +2 -1
  347. package/fjs/types/btree/types/module.f.mjs +2 -1
  348. package/fjs/types/byte_set/module.f.d.mts +20 -4
  349. package/fjs/types/byte_set/module.f.mjs +18 -8
  350. package/fjs/types/byte_set/proof.f.d.mts +3 -1
  351. package/fjs/types/byte_set/proof.f.mjs +10 -8
  352. package/fjs/types/function/compare/module.f.d.mts +3 -2
  353. package/fjs/types/function/compare/module.f.mjs +13 -5
  354. package/fjs/types/function/module.f.d.mts +8 -1
  355. package/fjs/types/function/module.f.mjs +8 -1
  356. package/fjs/types/function/operator/module.f.d.mts +2 -1
  357. package/fjs/types/function/operator/module.f.mjs +2 -2
  358. package/fjs/types/list/module.f.d.mts +10 -3
  359. package/fjs/types/list/module.f.mjs +6 -4
  360. package/fjs/types/list/proof.f.d.mts +4 -1
  361. package/fjs/types/list/proof.f.mjs +4 -2
  362. package/fjs/types/nibble_set/module.f.d.mts +2 -1
  363. package/fjs/types/nibble_set/module.f.mjs +2 -2
  364. package/fjs/types/nominal/module.f.d.mts +2 -1
  365. package/fjs/types/nominal/module.f.mjs +2 -1
  366. package/fjs/types/nullable/module.f.d.mts +26 -6
  367. package/fjs/types/nullable/module.f.mjs +25 -6
  368. package/fjs/types/nullable/proof.f.d.mts +4 -0
  369. package/fjs/types/nullable/proof.f.mjs +15 -0
  370. package/fjs/types/number/module.f.d.mts +4 -0
  371. package/fjs/types/number/module.f.mjs +4 -3
  372. package/fjs/types/object/module.f.d.mts +26 -4
  373. package/fjs/types/object/module.f.mjs +26 -7
  374. package/fjs/types/object/proof.f.d.mts +5 -2
  375. package/fjs/types/object/proof.f.mjs +6 -3
  376. package/fjs/types/object/structurally_same/module.f.d.mts +39 -0
  377. package/fjs/types/object/structurally_same/module.f.mjs +59 -0
  378. package/fjs/types/object/structurally_same/proof.f.d.mts +6 -0
  379. package/fjs/types/object/structurally_same/proof.f.mjs +73 -0
  380. package/fjs/types/ordered_map/module.f.d.mts +5 -0
  381. package/fjs/types/ordered_map/module.f.mjs +5 -4
  382. package/fjs/types/ordered_map/proof.f.d.mts +3 -0
  383. package/fjs/types/ordered_map/proof.f.mjs +4 -1
  384. package/fjs/types/patricia_trie/module.f.d.mts +2 -1
  385. package/fjs/types/patricia_trie/module.f.mjs +27 -12
  386. package/fjs/types/patricia_trie/proof.f.d.mts +3 -0
  387. package/fjs/types/patricia_trie/proof.f.mjs +4 -1
  388. package/fjs/types/prime_field/module.f.d.mts +3 -1
  389. package/fjs/types/prime_field/module.f.mjs +3 -2
  390. package/fjs/types/range/module.f.d.mts +2 -1
  391. package/fjs/types/range/module.f.mjs +2 -2
  392. package/fjs/types/range_map/module.f.d.mts +6 -0
  393. package/fjs/types/range_map/module.f.mjs +6 -9
  394. package/fjs/types/range_map/proof.f.d.mts +5 -1
  395. package/fjs/types/range_map/proof.f.mjs +5 -3
  396. package/fjs/types/range_set/module.f.d.mts +5 -0
  397. package/fjs/types/range_set/module.f.mjs +1 -0
  398. package/fjs/types/range_set/proof.f.d.mts +3 -0
  399. package/fjs/types/range_set/proof.f.mjs +4 -1
  400. package/fjs/types/result/module.d.mts +8 -0
  401. package/fjs/types/result/module.f.d.mts +37 -7
  402. package/fjs/types/result/module.f.mjs +38 -8
  403. package/fjs/types/result/module.mjs +9 -1
  404. package/fjs/types/result/proof.f.d.mts +5 -0
  405. package/fjs/types/result/proof.f.mjs +22 -2
  406. package/fjs/types/rtti/common/module.f.d.mts +44 -14
  407. package/fjs/types/rtti/common/module.f.mjs +42 -36
  408. package/fjs/types/rtti/common/proof.f.d.mts +4 -0
  409. package/fjs/types/rtti/common/proof.f.mjs +10 -7
  410. package/fjs/types/rtti/data/module.f.d.mts +134 -0
  411. package/fjs/types/rtti/data/module.f.mjs +1053 -0
  412. package/fjs/types/rtti/data/proof.f.d.mts +76 -0
  413. package/fjs/types/rtti/data/proof.f.mjs +589 -0
  414. package/fjs/types/rtti/data/types.d.ts +83 -0
  415. package/fjs/types/rtti/module.f.d.mts +12 -5
  416. package/fjs/types/rtti/module.f.mjs +7 -5
  417. package/fjs/types/rtti/parse/module.f.d.mts +48 -0
  418. package/fjs/types/rtti/parse/module.f.mjs +45 -34
  419. package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
  420. package/fjs/types/rtti/parse/proof.f.mjs +51 -52
  421. package/fjs/types/rtti/proof.f.d.mts +3 -1
  422. package/fjs/types/rtti/proof.f.mjs +6 -2
  423. package/fjs/types/rtti/ts/module.f.d.mts +68 -9
  424. package/fjs/types/rtti/ts/module.f.mjs +258 -30
  425. package/fjs/types/rtti/ts/proof.f.d.mts +44 -0
  426. package/fjs/types/rtti/ts/proof.f.mjs +152 -4
  427. package/fjs/types/rtti/ts/types.d.ts +25 -1
  428. package/fjs/types/rtti/types.d.ts +40 -0
  429. package/fjs/types/sorted_list/module.f.d.mts +4 -1
  430. package/fjs/types/sorted_list/module.f.mjs +21 -12
  431. package/fjs/types/sorted_list/proof.f.d.mts +3 -1
  432. package/fjs/types/sorted_list/proof.f.mjs +3 -1
  433. package/fjs/types/sorted_set/module.f.d.mts +49 -1
  434. package/fjs/types/sorted_set/module.f.mjs +26 -2
  435. package/fjs/types/sorted_set/proof.f.d.mts +4 -1
  436. package/fjs/types/sorted_set/proof.f.mjs +19 -2
  437. package/fjs/types/string/module.f.d.mts +4 -0
  438. package/fjs/types/string/module.f.mjs +4 -3
  439. package/fjs/types/string_set/module.f.d.mts +3 -1
  440. package/fjs/types/string_set/module.f.mjs +3 -2
  441. package/fjs/types/ts/module.f.d.mts +2 -0
  442. package/fjs/types/ts/module.f.mjs +3 -3
  443. package/fjs/types/ts/proof.f.d.mts +1 -0
  444. package/fjs/types/ts/proof.f.mjs +5 -0
  445. package/fjs/types/ts/types.d.ts +6 -1
  446. package/fjs/types/uint8array/module.f.d.mts +13 -2
  447. package/fjs/types/uint8array/module.f.mjs +20 -15
  448. package/fjs/website/module.f.d.mts +5 -2
  449. package/fjs/website/module.f.mjs +6 -8
  450. package/fjs/website/proof.f.mjs +2 -1
  451. package/package.json +3 -3
  452. package/fjs/asn.1/types.js +0 -6
  453. package/fjs/asserts/types.js +0 -6
  454. package/fjs/basen/types.js +0 -6
  455. package/fjs/bnf/data/types.js +0 -6
  456. package/fjs/bnf/descent/types.js +0 -6
  457. package/fjs/bnf/ll1/types.js +0 -6
  458. package/fjs/bnf/token_symbol/types.js +0 -6
  459. package/fjs/bnf/types.js +0 -6
  460. package/fjs/cas/evo/types.js +0 -7
  461. package/fjs/cas/types.js +0 -6
  462. package/fjs/ci/common/types.js +0 -1
  463. package/fjs/ci/nix/types.js +0 -6
  464. package/fjs/ci/types.js +0 -6
  465. package/fjs/cli/types.js +0 -6
  466. package/fjs/common/monoid/types.js +0 -6
  467. package/fjs/crypto/pow/types.js +0 -6
  468. package/fjs/crypto/secp/types.js +0 -6
  469. package/fjs/crypto/sha2/types.js +0 -6
  470. package/fjs/crypto/sign/types.js +0 -6
  471. package/fjs/crypto/vdf/types.js +0 -6
  472. package/fjs/dev/package_json/module.f.d.mts +0 -32
  473. package/fjs/dev/package_json/module.f.mjs +0 -37
  474. package/fjs/dev/package_json/proof.f.d.mts +0 -6
  475. package/fjs/dev/package_json/proof.f.mjs +0 -32
  476. package/fjs/dev/types.js +0 -6
  477. package/fjs/djs/ast/types.js +0 -8
  478. package/fjs/djs/parser/types.js +0 -7
  479. package/fjs/djs/tokenizer/types.js +0 -7
  480. package/fjs/djs/types.js +0 -7
  481. package/fjs/effects/eff/module.f.d.mts +0 -10
  482. package/fjs/effects/eff/module.f.mjs +0 -68
  483. package/fjs/effects/eff/proof.f.d.mts +0 -12
  484. package/fjs/effects/eff/proof.f.mjs +0 -66
  485. package/fjs/effects/eff/types.d.ts +0 -71
  486. package/fjs/effects/eff/types.js +0 -6
  487. package/fjs/effects/list/types.js +0 -6
  488. package/fjs/effects/memory/types.js +0 -6
  489. package/fjs/effects/mock/types.js +0 -6
  490. package/fjs/effects/node/types.js +0 -6
  491. package/fjs/effects/node/virtual/types.js +0 -7
  492. package/fjs/effects/types.js +0 -6
  493. package/fjs/emergent_testing/all.test.d.ts +0 -1
  494. package/fjs/emergent_testing/all.test.js +0 -5
  495. package/fjs/emergent_testing/scenarios/all.d.ts +0 -1
  496. package/fjs/emergent_testing/scenarios/all.js +0 -1
  497. package/fjs/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -6
  498. package/fjs/emergent_testing/scenarios/async-subtests.fail.js +0 -9
  499. package/fjs/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -6
  500. package/fjs/emergent_testing/scenarios/async-subtests.pass.js +0 -9
  501. package/fjs/emergent_testing/scenarios/async.fail.d.ts +0 -3
  502. package/fjs/emergent_testing/scenarios/async.fail.js +0 -6
  503. package/fjs/emergent_testing/scenarios/async.pass.d.ts +0 -3
  504. package/fjs/emergent_testing/scenarios/async.pass.js +0 -5
  505. package/fjs/emergent_testing/scenarios/fail.fail.d.ts +0 -3
  506. package/fjs/emergent_testing/scenarios/fail.fail.js +0 -3
  507. package/fjs/emergent_testing/scenarios/return-value.pass.js +0 -4
  508. package/fjs/emergent_testing/scenarios/thenable.pass.d.ts +0 -5
  509. package/fjs/emergent_testing/scenarios/thenable.pass.js +0 -11
  510. package/fjs/emergent_testing/scenarios/thenable2.pass.d.ts +0 -5
  511. package/fjs/emergent_testing/scenarios/thenable2.pass.js +0 -3
  512. package/fjs/emergent_testing/scenarios/throw.pass.d.ts +0 -5
  513. package/fjs/emergent_testing/scenarios/throw.pass.js +0 -3
  514. package/fjs/emergent_testing/types.js +0 -6
  515. package/fjs/js/tokenizer/types.js +0 -6
  516. package/fjs/media/html/types.js +0 -6
  517. package/fjs/media/json/parser/types.js +0 -6
  518. package/fjs/media/json/tokenizer/types.js +0 -6
  519. package/fjs/media/json/types.js +0 -13
  520. package/fjs/media/nix/types.js +0 -6
  521. package/fjs/media/revision/types.js +0 -8
  522. package/fjs/media/type/types.js +0 -6
  523. package/fjs/media/types.js +0 -7
  524. package/fjs/nanvm/types.js +0 -11
  525. package/fjs/protocol/json_rpc/types.js +0 -8
  526. package/fjs/protocol/mcp/types.js +0 -8
  527. package/fjs/sul/id/types.js +0 -6
  528. package/fjs/sul/level/hash/types.js +0 -6
  529. package/fjs/sul/level/literal/types.js +0 -6
  530. package/fjs/sul/types.js +0 -6
  531. package/fjs/text/sgr/types.js +0 -6
  532. package/fjs/text/types.js +0 -6
  533. package/fjs/text/utf16/types.js +0 -6
  534. package/fjs/text/utf8/types.js +0 -6
  535. package/fjs/types/array/types.js +0 -6
  536. package/fjs/types/bigfloat/types.js +0 -6
  537. package/fjs/types/bigint/types.js +0 -6
  538. package/fjs/types/bit_vec/types.js +0 -6
  539. package/fjs/types/btree/find/types.js +0 -6
  540. package/fjs/types/btree/types/types.js +0 -6
  541. package/fjs/types/byte_set/types.js +0 -6
  542. package/fjs/types/function/compare/types.js +0 -6
  543. package/fjs/types/function/operator/types.js +0 -6
  544. package/fjs/types/function/types.js +0 -6
  545. package/fjs/types/list/types.js +0 -6
  546. package/fjs/types/nibble_set/types.js +0 -6
  547. package/fjs/types/nominal/types.js +0 -6
  548. package/fjs/types/nullable/types.js +0 -6
  549. package/fjs/types/object/types.js +0 -8
  550. package/fjs/types/option/types.js +0 -6
  551. package/fjs/types/ordered_map/types.js +0 -6
  552. package/fjs/types/patricia_trie/types.js +0 -6
  553. package/fjs/types/phantom/types.js +0 -11
  554. package/fjs/types/prime_field/types.js +0 -6
  555. package/fjs/types/range/types.js +0 -6
  556. package/fjs/types/range_map/types.js +0 -6
  557. package/fjs/types/result/types.js +0 -6
  558. package/fjs/types/rtti/common/types.js +0 -1
  559. package/fjs/types/rtti/parse/types.js +0 -1
  560. package/fjs/types/rtti/ts/types.js +0 -1
  561. package/fjs/types/rtti/types.js +0 -1
  562. package/fjs/types/rtti/validate/module.f.d.mts +0 -6
  563. package/fjs/types/rtti/validate/module.f.mjs +0 -169
  564. package/fjs/types/rtti/validate/proof.f.d.mts +0 -125
  565. package/fjs/types/rtti/validate/proof.f.mjs +0 -437
  566. package/fjs/types/rtti/validate/types.d.ts +0 -6
  567. package/fjs/types/rtti/validate/types.js +0 -1
  568. package/fjs/types/sorted_list/types.js +0 -6
  569. package/fjs/types/sorted_set/types.js +0 -6
  570. package/fjs/types/string_set/types.js +0 -6
  571. package/fjs/types/ts/types.js +0 -8
@@ -5,21 +5,25 @@
5
5
  *
6
6
  * @example
7
7
  *
8
- * ```ts
9
- * import { error, ok, unwrap, type Result } from './module.f.ts'
8
+ * ```js
9
+ * import { error, ok, okThen, unwrap } from './module.f.mjs'
10
10
  *
11
- * const success: Result<number, string> = ok(42)
12
- * const failure: Result<number, string> = error('Something went wrong')
11
+ * const success = ok(42)
12
+ * const failure = error('Something went wrong')
13
13
  *
14
14
  * if (unwrap(success) !== 42) { throw 'error' }
15
15
  * const [kind, v] = failure
16
16
  * if (kind !== 'error') { throw 'error' }
17
- * // `v` is inferred as `string` here
18
- * if (v !== 'Something went wrong') { throw 'error' }
17
+ * // `v` is `'Something went wrong'` here
18
+ *
19
+ * // `okThen` chains; an `error` skips the rest of the chain unchanged.
20
+ * const half = n => n % 2 === 0 ? ok(n / 2) : error('odd')
21
+ * if (unwrap(okThen(half)(success)) !== 21) { throw 'error' }
19
22
  * ```
23
+ *
24
+ * @import { Ok, Error, Result } from './types.ts'
20
25
  */
21
26
  import type { Ok, Error, Result } from './types.ts';
22
- /** @import { Ok, Error, Result } from './types.ts' */
23
27
  /**
24
28
  * Creates a successful result.
25
29
  *
@@ -57,3 +61,29 @@ export declare const invert: <T, E>([k, v]: Result<T, E>) => Result<E, T>;
57
61
  * @type {<T, R>(f: (value: T) => R) => <E>(r: Result<T, E>) => Result<R, E>}
58
62
  */
59
63
  export declare const mapOk: <T, R>(f: (value: T) => R) => <E>(r: Result<T, E>) => Result<R, E>;
64
+ /**
65
+ * Chains a `Result`-returning step onto a `Result`, passing an `error` through
66
+ * unchanged. The monadic bind to {@link mapOk}'s functor map, and the pure
67
+ * sibling of the branch `fjs/effects`'s `step` writes for an effect that
68
+ * also performs operations.
69
+ *
70
+ * The two error types are **unioned, not unified**. A validation chain
71
+ * typically widens its error as it goes — a JSON parse failure (`string`)
72
+ * followed by an rtti schema failure (`ValidationError`) — and the hand-written
73
+ * form expressed that by rebuilding the incoming error with `error(v)` purely
74
+ * to retag it into the wider type. `E | F` states the widening in the type
75
+ * instead, so neither side has to be pre-widened and the passed-through
76
+ * `error` stays the very tuple it arrived as.
77
+ *
78
+ * `F` binds on the second arrow, as in {@link mapOk}: `f` alone determines the
79
+ * value types, so one `okThen(f)` applies to results carrying any error type.
80
+ *
81
+ * Reach for it when the step needs **only** the value it is handed. A chain
82
+ * whose later steps also read an earlier one's value would have to nest a
83
+ * closure per link to keep those values in scope, which `fjs/AGENTS.md` §3.4 rules
84
+ * out for the same reason it rules out nested `step`; write those as a flat
85
+ * sequence of guards.
86
+ *
87
+ * @type {<T, R, E>(f: (value: T) => Result<R, E>) => <F>(r: Result<T, F>) => Result<R, E | F>}
88
+ */
89
+ export declare const okThen: <T, R, E>(f: (value: T) => Result<R, E>) => <F>(r: Result<T, F>) => Result<R, E | F>;
@@ -5,22 +5,25 @@
5
5
  *
6
6
  * @example
7
7
  *
8
- * ```ts
9
- * import { error, ok, unwrap, type Result } from './module.f.ts'
8
+ * ```js
9
+ * import { error, ok, okThen, unwrap } from './module.f.mjs'
10
10
  *
11
- * const success: Result<number, string> = ok(42)
12
- * const failure: Result<number, string> = error('Something went wrong')
11
+ * const success = ok(42)
12
+ * const failure = error('Something went wrong')
13
13
  *
14
14
  * if (unwrap(success) !== 42) { throw 'error' }
15
15
  * const [kind, v] = failure
16
16
  * if (kind !== 'error') { throw 'error' }
17
- * // `v` is inferred as `string` here
18
- * if (v !== 'Something went wrong') { throw 'error' }
17
+ * // `v` is `'Something went wrong'` here
18
+ *
19
+ * // `okThen` chains; an `error` skips the rest of the chain unchanged.
20
+ * const half = n => n % 2 === 0 ? ok(n / 2) : error('odd')
21
+ * if (unwrap(okThen(half)(success)) !== 21) { throw 'error' }
19
22
  * ```
23
+ *
24
+ * @import { Ok, Error, Result } from './types.ts'
20
25
  */
21
26
 
22
- /** @import { Ok, Error, Result } from './types.ts' */
23
-
24
27
  /**
25
28
  * Creates a successful result.
26
29
  *
@@ -65,3 +68,30 @@ export const invert = ([k, v]) => k === 'ok' ? error(v) : ok(v)
65
68
  * @type {<T, R>(f: (value: T) => R) => <E>(r: Result<T, E>) => Result<R, E>}
66
69
  */
67
70
  export const mapOk = f => r => r[0] === 'ok' ? ok(f(r[1])) : r
71
+
72
+ /**
73
+ * Chains a `Result`-returning step onto a `Result`, passing an `error` through
74
+ * unchanged. The monadic bind to {@link mapOk}'s functor map, and the pure
75
+ * sibling of the branch `fjs/effects`'s `step` writes for an effect that
76
+ * also performs operations.
77
+ *
78
+ * The two error types are **unioned, not unified**. A validation chain
79
+ * typically widens its error as it goes — a JSON parse failure (`string`)
80
+ * followed by an rtti schema failure (`ValidationError`) — and the hand-written
81
+ * form expressed that by rebuilding the incoming error with `error(v)` purely
82
+ * to retag it into the wider type. `E | F` states the widening in the type
83
+ * instead, so neither side has to be pre-widened and the passed-through
84
+ * `error` stays the very tuple it arrived as.
85
+ *
86
+ * `F` binds on the second arrow, as in {@link mapOk}: `f` alone determines the
87
+ * value types, so one `okThen(f)` applies to results carrying any error type.
88
+ *
89
+ * Reach for it when the step needs **only** the value it is handed. A chain
90
+ * whose later steps also read an earlier one's value would have to nest a
91
+ * closure per link to keep those values in scope, which `fjs/AGENTS.md` §3.4 rules
92
+ * out for the same reason it rules out nested `step`; write those as a flat
93
+ * sequence of guards.
94
+ *
95
+ * @type {<T, R, E>(f: (value: T) => Result<R, E>) => <F>(r: Result<T, F>) => Result<R, E | F>}
96
+ */
97
+ export const okThen = f => r => r[0] === 'error' ? r : f(r[1])
@@ -1,4 +1,12 @@
1
- /** @import { Result } from './types.ts' */
1
+ /**
2
+ * Impure `Result` companions: capture thrown exceptions as `Result` values,
3
+ * since `try`/`catch` is not allowed in FunctionalScript itself.
4
+ *
5
+ * @module
6
+ *
7
+ * @import { Result } from './types.ts'
8
+ */
9
+
2
10
  import { ok, error } from './module.f.mjs'
3
11
 
4
12
  /** @type {<T>(f: () => T) => Result<T, unknown>} */
@@ -1,10 +1,15 @@
1
+ /**
2
+ * @import { Result } from './types.ts'
3
+ */
1
4
  declare const example: () => void;
2
5
  declare const invertTest: () => void;
3
6
  declare const mapOkTest: () => void;
7
+ declare const okThenTest: () => void;
4
8
  export declare const proof: {
5
9
  example: typeof example;
6
10
  invertTest: typeof invertTest;
7
11
  mapOkTest: typeof mapOkTest;
12
+ okThenTest: typeof okThenTest;
8
13
  throw: {
9
14
  unwrapError: () => string;
10
15
  };
@@ -1,5 +1,8 @@
1
- import { error, ok, unwrap, invert, mapOk } from './module.f.mjs'
2
- /** @import { Result } from './types.ts' */
1
+ /**
2
+ * @import { Result } from './types.ts'
3
+ */
4
+
5
+ import { error, ok, unwrap, invert, mapOk, okThen } from './module.f.mjs'
3
6
  import { assert, assertEq } from '../../asserts/module.f.mjs'
4
7
 
5
8
  const example = () => {
@@ -31,10 +34,27 @@ const mapOkTest = () => {
31
34
  assert(!(k1 !== 'error' || v1 !== 'oops'), [k1, v1])
32
35
  }
33
36
 
37
+ const okThenTest = () => {
38
+ /** @type {(n: number) => Result<string, string>} */
39
+ const half = n => n % 2 === 0 ? ok(`${n / 2}`) : error('odd')
40
+ const [k0, v0] = okThen(half)(ok(42))
41
+ assert(!(k0 !== 'ok' || v0 !== '21'), [k0, v0])
42
+ // `f` itself failing: the chain reports `f`'s own error.
43
+ const [k1, v1] = okThen(half)(ok(41))
44
+ assert(!(k1 !== 'error' || v1 !== 'odd'), [k1, v1])
45
+ // An incoming `error` skips `f` and passes through unchanged, keeping its
46
+ // own error type: the result is `Result<string, string | number>`.
47
+ /** @type {Result<number, number>} */
48
+ const incoming = error(7)
49
+ const [k2, v2] = okThen(half)(incoming)
50
+ assert(!(k2 !== 'error' || v2 !== 7), [k2, v2])
51
+ }
52
+
34
53
  export const proof = {
35
54
  example,
36
55
  invertTest,
37
56
  mapOkTest,
57
+ okThenTest,
38
58
  throw: {
39
59
  unwrapError: () => unwrap(error('oops')),
40
60
  },
@@ -1,10 +1,42 @@
1
+ /**
2
+ * Shared kernel for RTTI consumers.
3
+ *
4
+ * `parse` (`../parse/module.f.mjs`) is the schema-form consumer; the data form
5
+ * (`../data/module.f.mjs`) is the other, walking a `Data` instead of a thunk
6
+ * graph. They produce the same `Result<T, ValidationError>` outcome and differ
7
+ * in how they dispatch, so this module hosts the parts that do not differ:
8
+ *
9
+ * - The error shape (`ValidationError`, `Path`) and path bookkeeping
10
+ * (`verror`, `prependPath`).
11
+ * - Primitive checks (`primitive0Validate`, `constPrimitiveValidate`).
12
+ * - The `Validate<T>`/`Result<T>` signatures, which `parse` reuses
13
+ * (`Parse<T> = Validate<T>`).
14
+ * - `visit`: a visitor over the `Type` ADT. Callers supply a `Visitor<R>`
15
+ * with one handler per variant; `visit(v)(rtti)` recognizes `rtti` and
16
+ * calls the matching handler. `parse` composes its top-level function from
17
+ * a visitor.
18
+ * - `eachEntry`: the container entry loop (array/record/tuple/struct). Callers
19
+ * choose what (if anything) to accumulate, so a caller that only needs
20
+ * pass/fail pays no allocation per entry.
21
+ * - `orVisit`: the shared `or` handler — try each variant's recursive walker,
22
+ * return the first match.
23
+ *
24
+ * Keeping the kernel here gives schema-driven consumers a stable shared base
25
+ * that does not depend on any one of them.
26
+ *
27
+ * @module
28
+ *
29
+ * @import { Primitive, Unknown } from '../ts/types.ts'
30
+ * @import { Const, Info0, Primitive0, Tag1, Tuple, Type } from '../types.ts'
31
+ * @import { Error, Result as CommonResult } from '../../result/types.ts'
32
+ * @import { StringMap } from '../../object/types.ts'
33
+ * @import { Validate, Visitor, IsContainer, Container, ResultE, ValidateE, ValidationError } from './types.ts'
34
+ */
1
35
  import type { Primitive, Unknown } from '../ts/types.ts';
2
36
  import type { Info0, Primitive0, Type } from '../types.ts';
3
37
  import type { Error, Result as CommonResult } from '../../result/types.ts';
4
38
  import type { StringMap } from '../../object/types.ts';
5
39
  import type { Validate, Visitor, IsContainer, ResultE, ValidateE, ValidationError } from './types.ts';
6
- /** @import { StringMap } from '../../object/types.ts' */
7
- /** @import { Validate, Visitor, IsContainer, Container, ResultE, ValidateE, ValidationError } from './types.ts' */
8
40
  /** Builds an error result with empty path and the given message. */
9
41
  /** @type {(message: string) => Error<ValidationError>} */
10
42
  export declare const verror: (message: string) => Error<ValidationError>;
@@ -34,10 +66,10 @@ export declare const constPrimitiveValidate: <T extends Primitive>(
34
66
  * @returns {Validate<T>}
35
67
  */
36
68
  rtti: T) => Validate<T>;
37
- /** `IsContainer` guard for arrays, shared by `validate` and `parse`. */
69
+ /** `IsContainer` guard for arrays. */
38
70
  /** @type {IsContainer<ReadonlyArray<Unknown>>} */
39
71
  export declare const isArray: IsContainer<ReadonlyArray<Unknown>>;
40
- /** `IsContainer` guard for records/structs, shared by `validate` and `parse`. */
72
+ /** `IsContainer` guard for records/structs. */
41
73
  /** @type {IsContainer<StringMap<Unknown>>} */
42
74
  export declare const isObject: IsContainer<StringMap<Unknown>>;
43
75
  /**
@@ -46,21 +78,19 @@ export declare const isObject: IsContainer<StringMap<Unknown>>;
46
78
  * result into `acc` (starting from `init`) with `accumulate` and returns the
47
79
  * final accumulator.
48
80
  *
49
- * Shared by `validate` and `parse`'s container builders (array/record/tuple/
50
- * struct), which differ only in what `item` does with the value and what
51
- * they accumulate: `validate` has nothing to collect its entire schema is
52
- * "did every entry succeed?" — so it passes `undefined`/`(acc) => acc` and
53
- * pays no allocation per entry; `parse` needs the rebuilt `[key, value]`
54
- * pairs, so it folds them into a `List` (see its call site) and converts to
55
- * an array once at the end.
81
+ * Used by `parse`'s container builders (array/record/tuple/struct), which
82
+ * need the rebuilt `[key, value]` pairs, so they fold them into a `List` (see
83
+ * the call site) and convert to an array once at the end. A caller whose
84
+ * whole question is "did every entry succeed?" passes `undefined`/`acc => acc`
85
+ * instead and pays no allocation per entry.
56
86
  */
57
87
  export declare const eachEntry: <V, R, A>(entries: ReadonlyArray<readonly [string, V]>, item: (k: string, v: V) => CommonResult<R, ValidationError>, init: A, accumulate: (acc: A, k: string, value: R) => A) => CommonResult<A, ValidationError>;
58
88
  /**
59
89
  * First variant in `variants` that `recurse` accepts, else `verror('no match')`.
60
90
  *
61
- * Shared `or` handler for `validate` and `parse`: both try each variant
62
- * against the value and return the first `'ok'` verbatim, differing only in
63
- * which recursive function (`validate` or `parse`) walks each variant. `recurse`
91
+ * Shared `or` handler: try each variant against the value and return the
92
+ * first `'ok'` verbatim, parameterized by the recursive function that walks
93
+ * each variant. `recurse`
64
94
  * is typed over the erased `ValidateE` alias — annotating it as `(t: Type) =>
65
95
  * Validate<Type>` would itself instantiate `Validate<Type>` and hit TS2589 —
66
96
  * so each caller passes its recursive function through one boundary cast.
@@ -1,40 +1,42 @@
1
1
  /**
2
- * Shared kernel for RTTI consumers (`validate`, `parse`).
2
+ * Shared kernel for RTTI consumers.
3
3
  *
4
- * Both consumers traverse the same schema shape and produce the same
5
- * `Result<T, ValidationError>` outcome. Only the per-variant handling differs
6
- * `validate` keeps the original value, `parse` constructs a fresh one.
7
- *
8
- * This module hosts the parts that do not differ:
4
+ * `parse` (`../parse/module.f.mjs`) is the schema-form consumer; the data form
5
+ * (`../data/module.f.mjs`) is the other, walking a `Data` instead of a thunk
6
+ * graph. They produce the same `Result<T, ValidationError>` outcome and differ
7
+ * in how they dispatch, so this module hosts the parts that do not differ:
9
8
  *
10
9
  * - The error shape (`ValidationError`, `Path`) and path bookkeeping
11
10
  * (`verror`, `prependPath`).
12
11
  * - Primitive checks (`primitive0Validate`, `constPrimitiveValidate`).
13
- * - The `Validate<T>`/`Result<T>` signatures `parse` uses the same shape.
12
+ * - The `Validate<T>`/`Result<T>` signatures, which `parse` reuses
13
+ * (`Parse<T> = Validate<T>`).
14
14
  * - `visit`: a visitor over the `Type` ADT. Callers supply a `Visitor<R>`
15
15
  * with one handler per variant; `visit(v)(rtti)` recognizes `rtti` and
16
- * calls the matching handler. Both consumers compose their top-level
17
- * function from a visitor.
18
- * - `eachEntry`: the container entry loop (array/record/tuple/struct), shared
19
- * by both consumers' container builders. Callers choose what (if anything)
20
- * to accumulate, so `validate`'s pure pass/fail check pays no allocation.
16
+ * calls the matching handler. `parse` composes its top-level function from
17
+ * a visitor.
18
+ * - `eachEntry`: the container entry loop (array/record/tuple/struct). Callers
19
+ * choose what (if anything) to accumulate, so a caller that only needs
20
+ * pass/fail pays no allocation per entry.
21
21
  * - `orVisit`: the shared `or` handler — try each variant's recursive walker,
22
22
  * return the first match.
23
23
  *
24
- * Keeping the kernel here also removes `parse`'s incidental dependency on
25
- * `validate` and gives future schema-driven consumers (e.g. the data form
26
- * sketched in [i143](../../../../issues/README.md)) a stable shared base.
24
+ * Keeping the kernel here gives schema-driven consumers a stable shared base
25
+ * that does not depend on any one of them.
27
26
  *
28
27
  * @module
28
+ *
29
+ * @import { Primitive, Unknown } from '../ts/types.ts'
30
+ * @import { Const, Info0, Primitive0, Tag1, Tuple, Type } from '../types.ts'
31
+ * @import { Error, Result as CommonResult } from '../../result/types.ts'
32
+ * @import { StringMap } from '../../object/types.ts'
33
+ * @import { Validate, Visitor, IsContainer, Container, ResultE, ValidateE, ValidationError } from './types.ts'
29
34
  */
30
- /** @import { Primitive, Unknown } from '../ts/types.ts' */
31
- /** @import { Const, Info0, Primitive0, Struct, Tag1, Tuple, Type } from '../types.ts' */
32
- /** @import { Error, Result as CommonResult } from '../../result/types.ts' */
35
+
36
+ import { assert } from '../../../asserts/module.f.mjs'
33
37
  import { error, ok } from '../../result/module.f.mjs'
34
38
  import { isArray as commonIsArray } from '../../array/module.f.mjs'
35
39
  import { isObject as commonIsObject } from '../../object/module.f.mjs'
36
- /** @import { StringMap } from '../../object/types.ts' */
37
- /** @import { Validate, Visitor, IsContainer, Container, ResultE, ValidateE, ValidationError } from './types.ts' */
38
40
 
39
41
  /** Builds an error result with empty path and the given message. */
40
42
  /** @type {(message: string) => Error<ValidationError>} */
@@ -78,15 +80,15 @@ export const constPrimitiveValidate =
78
80
  /** @type {<R>(v: Visitor<R>) => (c: Const) => R} */
79
81
  const visitConst = v => c =>
80
82
  typeof c === 'object' && c !== null
81
- ? (commonIsArray(c) ? v.tuple(c) : v.struct(/** @type {Struct} */ (c)))
82
- : v.constPrimitive(/** @type {Primitive} */ (c))
83
+ ? (commonIsArray(c) ? v.tuple(c) : v.struct(c))
84
+ : v.constPrimitive(c)
83
85
 
84
- /** `IsContainer` guard for arrays, shared by `validate` and `parse`. */
86
+ /** `IsContainer` guard for arrays. */
85
87
  /** @type {IsContainer<ReadonlyArray<Unknown>>} */
86
88
  export const isArray =
87
89
  value => commonIsArray(value)
88
90
 
89
- /** `IsContainer` guard for records/structs, shared by `validate` and `parse`. */
91
+ /** `IsContainer` guard for records/structs. */
90
92
  /** @type {IsContainer<StringMap<Unknown>>} */
91
93
  export const isObject =
92
94
  value => commonIsObject(value)
@@ -97,13 +99,11 @@ export const isObject =
97
99
  * result into `acc` (starting from `init`) with `accumulate` and returns the
98
100
  * final accumulator.
99
101
  *
100
- * Shared by `validate` and `parse`'s container builders (array/record/tuple/
101
- * struct), which differ only in what `item` does with the value and what
102
- * they accumulate: `validate` has nothing to collect its entire schema is
103
- * "did every entry succeed?" — so it passes `undefined`/`(acc) => acc` and
104
- * pays no allocation per entry; `parse` needs the rebuilt `[key, value]`
105
- * pairs, so it folds them into a `List` (see its call site) and converts to
106
- * an array once at the end.
102
+ * Used by `parse`'s container builders (array/record/tuple/struct), which
103
+ * need the rebuilt `[key, value]` pairs, so they fold them into a `List` (see
104
+ * the call site) and convert to an array once at the end. A caller whose
105
+ * whole question is "did every entry succeed?" passes `undefined`/`acc => acc`
106
+ * instead and pays no allocation per entry.
107
107
  */
108
108
  export const eachEntry =
109
109
  /**
@@ -131,9 +131,9 @@ export const eachEntry =
131
131
  /**
132
132
  * First variant in `variants` that `recurse` accepts, else `verror('no match')`.
133
133
  *
134
- * Shared `or` handler for `validate` and `parse`: both try each variant
135
- * against the value and return the first `'ok'` verbatim, differing only in
136
- * which recursive function (`validate` or `parse`) walks each variant. `recurse`
134
+ * Shared `or` handler: try each variant against the value and return the
135
+ * first `'ok'` verbatim, parameterized by the recursive function that walks
136
+ * each variant. `recurse`
137
137
  * is typed over the erased `ValidateE` alias — annotating it as `(t: Type) =>
138
138
  * Validate<Type>` would itself instantiate `Validate<Type>` and hit TS2589 —
139
139
  * so each caller passes its recursive function through one boundary cast.
@@ -171,13 +171,19 @@ export const visit =
171
171
  if (typeof rtti === 'function') {
172
172
  const [tag, ...value] = rtti()
173
173
  switch (tag) {
174
- case 'const': return visitConst(v)(/** @type {Const} */ (value[0]))
174
+ case 'const': {
175
+ const [c] = value
176
+ // `Type` is `Const | Thunk`, and a `Thunk` is a function, so
177
+ // this is exactly the check that defines `Const`.
178
+ assert(typeof c !== 'function', c)
179
+ return visitConst(v)(c)
180
+ }
175
181
  case 'array': return v.array(value[0])
176
182
  case 'record': return v.record(value[0])
177
183
  case 'unknown': return v.unknown()
178
184
  case 'or': return v.or(value)
179
185
  }
180
- return v.primitive0(/** @type {Primitive0} */ (tag))
186
+ return v.primitive0(tag)
181
187
  }
182
188
  return visitConst(v)(rtti)
183
189
  }
@@ -1,3 +1,7 @@
1
+ /**
2
+ * @import { Result } from '../../result/types.ts'
3
+ * @import { ValidationError } from './types.ts'
4
+ */
1
5
  export type _Entries = ReadonlyArray<readonly [string, number]>;
2
6
  export declare const proof: {
3
7
  empty: () => void;
@@ -1,7 +1,10 @@
1
+ /**
2
+ * @import { Result } from '../../result/types.ts'
3
+ * @import { ValidationError } from './types.ts'
4
+ */
5
+
1
6
  import { eachEntry } from './module.f.mjs'
2
- /** @import { Result } from '../../result/types.ts' */
3
7
  import { error, ok } from '../../result/module.f.mjs'
4
- /** @import { ValidationError } from './types.ts' */
5
8
  import { assert, assertEq } from '../../../asserts/module.f.mjs'
6
9
 
7
10
  /** @typedef {ReadonlyArray<readonly [string, number]>} _Entries */
@@ -16,12 +19,12 @@ const collect = (acc, k, v) => [...acc, [k, v]]
16
19
 
17
20
  export const proof = {
18
21
  empty: () => {
19
- const r = eachEntry(/** @type {_Entries} */ ([]), item, /** @type {_Entries} */ ([]), collect)
22
+ const r = eachEntry([], item, [], collect)
20
23
  assert(r[0] === 'ok')
21
24
  assertEq(r[1].length, 0)
22
25
  },
23
26
  allOk: () => {
24
- const r = eachEntry([['a', 1], ['b', 2]], item, /** @type {_Entries} */ ([]), collect)
27
+ const r = eachEntry([['a', 1], ['b', 2]], item, [], collect)
25
28
  assert(r[0] === 'ok')
26
29
  assertEq(r[1].length, 2)
27
30
  assertEq(r[1][0][0], 'a')
@@ -36,7 +39,7 @@ export const proof = {
36
39
  assertEq(r[1], undefined)
37
40
  },
38
41
  firstErrorWins: () => {
39
- const r = eachEntry([['a', -1], ['b', -2]], item, /** @type {_Entries} */ ([]), collect)
42
+ const r = eachEntry([['a', -1], ['b', -2]], item, [], collect)
40
43
  assert(r[0] === 'error')
41
44
  assertEq(r[1].message, 'negative at a')
42
45
  },
@@ -47,7 +50,7 @@ export const proof = {
47
50
  calls++
48
51
  return item(k, v)
49
52
  }
50
- const r = eachEntry([['a', -1], ['b', -2], ['c', -3]], counting, /** @type {_Entries} */ ([]), collect)
53
+ const r = eachEntry([['a', -1], ['b', -2], ['c', -3]], counting, [], collect)
51
54
  assert(r[0] === 'error')
52
55
  assertEq(calls, 1)
53
56
  },
@@ -55,7 +58,7 @@ export const proof = {
55
58
  /** @type {(k: string, v: number) => Result<number, ValidationError>} */
56
59
  const nested = (k, v) =>
57
60
  v < 0 ? error({ path: ['inner'], message: 'bad' }) : ok(v)
58
- const r = eachEntry([['outer', -1]], nested, /** @type {_Entries} */ ([]), collect)
61
+ const r = eachEntry([['outer', -1]], nested, [], collect)
59
62
  assert(r[0] === 'error')
60
63
  assertEq(r[1].path.length, 2)
61
64
  assertEq(r[1].path[0], 'outer')
@@ -0,0 +1,134 @@
1
+ /**
2
+ * The serializable RTTI data form and the {@link toData} conversion from the
3
+ * thunk form.
4
+ *
5
+ * A schema denotes a set of values. The data form partitions that set into
6
+ * six disjoint kinds — unit values (`null`, `undefined`, `false`, `true`),
7
+ * numbers, strings, bigints, arrays and objects — so that all schema algebra
8
+ * (union normalization, coverage collapse, {@link equal}, {@link subset},
9
+ * canonical ordering via {@link cmp}) reduces to kind-wise set operations.
10
+ * {@link toData} is the single bridge from the thunk form; {@link validate}
11
+ * is the data-driven counterpart of `../validate`. The form serializes as
12
+ * DJS — plain JSON when no `bigint` literals are involved. See `./README.md`
13
+ * for the design rationale and serialization notes, and `./types.ts` for the
14
+ * type-level API.
15
+ *
16
+ * @module
17
+ *
18
+ * @import { Const, ConstObject, Type } from '../types.ts'
19
+ * @import { Primitive, Unknown } from '../ts/types.ts'
20
+ * @import { ResultE } from '../common/types.ts'
21
+ * @import { StringMap } from '../../object/types.ts'
22
+ * @import { ArraySet, Data, KindSet, Node, ObjectSet, RuleSet, UnionSet } from './types.ts'
23
+ */
24
+ import type { Const, Type } from '../types.ts';
25
+ import type { Primitive, Unknown } from '../ts/types.ts';
26
+ import type { ResultE } from '../common/types.ts';
27
+ import type { StringMap } from '../../object/types.ts';
28
+ import type { Data, Node, RuleSet, UnionSet } from './types.ts';
29
+ /**
30
+ * The unit kind's enumeration: bit `1 << i` of a {@link UnionSet}'s `unit`
31
+ * bitset stands for `unitList[i]`.
32
+ */
33
+ export declare const unitList: readonly ['null', 'undefined', 'false', 'true'];
34
+ /**
35
+ * The `unit` bit of one unit value.
36
+ *
37
+ * @type {(v: null | undefined | boolean) => number}
38
+ */
39
+ export declare const unitBit: (v: null | undefined | boolean) => number;
40
+ /**
41
+ * The data form of the empty set — rtti `never`.
42
+ *
43
+ * @type {UnionSet}
44
+ */
45
+ export declare const never: UnionSet;
46
+ /**
47
+ * The data form of the set of all values — rtti `unknown`.
48
+ *
49
+ * @type {UnionSet}
50
+ */
51
+ export declare const unknown: UnionSet;
52
+ /**
53
+ * The union with the given unit bits removed — set subtraction restricted to
54
+ * the unit kind. Dropping `undefined` from an optional property's value set is
55
+ * the motivating case.
56
+ *
57
+ * The other five kinds are carried through untouched rather than copied field
58
+ * by field. That is not only shorter: a caller that enumerates `UnionSet`'s
59
+ * members to rebuild the node silently **drops** any kind added to the type
60
+ * later, whereas spreading cannot. Removing every unit bit removes the `unit`
61
+ * key entirely, since an empty kind is an absent property here, never a zero.
62
+ *
63
+ * @type {(bits: number) => (n: UnionSet) => UnionSet}
64
+ */
65
+ export declare const withoutUnits: (bits: number) => (n: UnionSet) => UnionSet;
66
+ /**
67
+ * Total order over the data form: negative, zero or positive, with zero
68
+ * exactly on structural identity. {@link toData} output is canonical, so two
69
+ * conversions of equivalent thunk schemas compare equal — this is what makes
70
+ * the data form comparable and sortable.
71
+ *
72
+ * @type {(a: Data) => (b: Data) => number}
73
+ */
74
+ export declare const cmp: (a: Data) => (b: Data) => number;
75
+ /**
76
+ * Structural equality of canonical forms: `equal(toData(a))(toData(b))`
77
+ * holds exactly when `a` and `b` normalize to the same data — e.g.
78
+ * `or(a, b)` and `or(b, a)` are equal. Recursive definitions compare by
79
+ * their rule names, which are derived from the defining functions' names.
80
+ *
81
+ * @type {(a: Data) => (b: Data) => boolean}
82
+ */
83
+ export declare const equal: (a: Data) => (b: Data) => boolean;
84
+ export type _Ctx = readonly [RuleSet, RuleSet];
85
+ export type _Assumed = StringMap<StringMap<true>>;
86
+ export type _Keyed = readonly [Node, string | undefined];
87
+ /**
88
+ * Sound subset test: `true` means every value of `a` is a value of `b`.
89
+ * Kind-wise on unions, pattern-wise on arrays/objects, coinductive on
90
+ * reference cycles. Incomplete in the known-hard corners of semantic
91
+ * subtyping (see `./README.md`): it may answer `false` for an inclusion
92
+ * that only holds by distributing a union across positions, or one whose
93
+ * left side is a non-syntactic empty set — never `true` for a non-inclusion.
94
+ *
95
+ * @type {(a: Data) => (b: Data) => boolean}
96
+ */
97
+ export declare const subset: (a: Data) => (b: Data) => boolean;
98
+ export type _NodeMap = (n: Node) => Node;
99
+ export type _Thunk = Exclude<Type, Const>;
100
+ export type _Key = Exclude<Type, Primitive>;
101
+ export type _State = {
102
+ readonly converting: readonly _Thunk[];
103
+ readonly names: readonly (readonly [_Thunk, string])[];
104
+ readonly done: readonly (readonly [_Key, UnionSet])[];
105
+ readonly deferred: readonly (readonly [_Thunk, _Thunk])[];
106
+ };
107
+ /**
108
+ * Converts a thunk-form schema into its canonical data form.
109
+ *
110
+ * Runs once per consumer need; schemas that are built but never consumed pay
111
+ * nothing. The output is normalized — unions are flattened and merged
112
+ * kind-wise, literals are sorted and deduplicated, subsumed array/object
113
+ * patterns are dropped, rules are pruned to the reachable set and sorted,
114
+ * and a union equal to a rule's body reads back as a reference — so schema
115
+ * identity is a property of this form: `toData(or(a, b))` and
116
+ * `toData(or(b, a))` are structurally identical even though the two thunks
117
+ * are distinct, and `or` is idempotent on recursive schemas.
118
+ *
119
+ * Only recursive definitions become named rules (named after their defining
120
+ * functions), everything else is inlined; a schema with no reference cycles
121
+ * converts to `[{}, unionSet]`.
122
+ *
123
+ * @type {(t: Type) => Data}
124
+ */
125
+ export declare const toData: (t: Type) => Data;
126
+ /**
127
+ * Data-driven validation — the counterpart of `../validate` that consumes a
128
+ * {@link Data} produced by {@link toData} instead of walking the thunk
129
+ * graph. Returns the original value on success, or the first
130
+ * `{ path, message }` error.
131
+ *
132
+ * @type {(data: Data) => (value: Unknown) => ResultE}
133
+ */
134
+ export declare const validate: (data: Data) => (value: Unknown) => ResultE;