functionalscript 0.44.0 → 0.45.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 (453) hide show
  1. package/fjs/asn.1/proof.f.d.mts +5 -0
  2. package/fjs/asn.1/proof.f.mjs +15 -3
  3. package/fjs/asserts/module.f.d.mts +14 -0
  4. package/fjs/asserts/module.f.mjs +20 -0
  5. package/fjs/asserts/proof.f.d.mts +3 -0
  6. package/fjs/asserts/proof.f.mjs +15 -1
  7. package/fjs/basen/base128/proof.f.d.mts +3 -1
  8. package/fjs/basen/base128/proof.f.mjs +3 -1
  9. package/fjs/basen/base64/module.f.mjs +7 -3
  10. package/fjs/basen/base64/proof.f.d.mts +3 -1
  11. package/fjs/basen/base64/proof.f.mjs +7 -4
  12. package/fjs/basen/cbase32/proof.f.d.mts +3 -1
  13. package/fjs/basen/cbase32/proof.f.mjs +3 -1
  14. package/fjs/bnf/data/proof.f.mjs +0 -1
  15. package/fjs/bnf/descent/module.f.d.mts +17 -2
  16. package/fjs/bnf/descent/module.f.mjs +118 -41
  17. package/fjs/bnf/descent/proof.f.d.mts +1 -0
  18. package/fjs/bnf/descent/proof.f.mjs +77 -1
  19. package/fjs/bnf/descent/types.d.ts +12 -4
  20. package/fjs/bnf/ll1/module.f.d.mts +28 -2
  21. package/fjs/bnf/ll1/module.f.mjs +180 -38
  22. package/fjs/bnf/ll1/proof.f.d.mts +2 -0
  23. package/fjs/bnf/ll1/proof.f.mjs +62 -1
  24. package/fjs/bnf/ll1/types.d.ts +14 -8
  25. package/fjs/bnf/module.f.d.mts +15 -6
  26. package/fjs/bnf/module.f.mjs +52 -11
  27. package/fjs/bnf/proof.f.d.mts +2 -0
  28. package/fjs/bnf/proof.f.mjs +79 -3
  29. package/fjs/bnf/token_symbol/module.f.d.mts +4 -3
  30. package/fjs/bnf/token_symbol/module.f.mjs +7 -6
  31. package/fjs/bnf/token_symbol/proof.f.mjs +5 -2
  32. package/fjs/bnf/token_symbol/types.d.ts +2 -2
  33. package/fjs/bnf/types.d.ts +10 -3
  34. package/fjs/cas/cli/proof.f.d.mts +3 -1
  35. package/fjs/cas/cli/proof.f.mjs +3 -1
  36. package/fjs/cas/evo/module.f.d.mts +7 -13
  37. package/fjs/cas/evo/module.f.mjs +103 -96
  38. package/fjs/cas/evo/proof.f.mjs +6 -3
  39. package/fjs/cas/module.f.mjs +96 -109
  40. package/fjs/ci/common/module.f.d.mts +1 -1
  41. package/fjs/ci/common/module.f.mjs +1 -0
  42. package/fjs/ci/config/module.f.d.mts +2 -2
  43. package/fjs/ci/config/module.f.mjs +2 -2
  44. package/fjs/ci/nix/proof.f.d.mts +2 -0
  45. package/fjs/ci/nix/proof.f.mjs +2 -2
  46. package/fjs/ci/proof.f.d.mts +4 -2
  47. package/fjs/ci/proof.f.mjs +4 -3
  48. package/fjs/cli/proof.f.d.mts +4 -2
  49. package/fjs/cli/proof.f.mjs +4 -2
  50. package/fjs/common/monoid/module.f.d.mts +70 -12
  51. package/fjs/common/monoid/module.f.mjs +177 -14
  52. package/fjs/common/monoid/proof.f.d.mts +12 -1
  53. package/fjs/common/monoid/proof.f.mjs +88 -4
  54. package/fjs/common/monoid/types.d.ts +23 -0
  55. package/fjs/crypto/secp/proof.f.d.mts +3 -1
  56. package/fjs/crypto/secp/proof.f.mjs +3 -1
  57. package/fjs/crypto/sha2/proof.f.d.mts +3 -1
  58. package/fjs/crypto/sha2/proof.f.mjs +3 -1
  59. package/fjs/crypto/vdf/module.f.d.mts +23 -4
  60. package/fjs/crypto/vdf/module.f.mjs +6 -4
  61. package/fjs/dev/module.f.d.mts +5 -2
  62. package/fjs/dev/module.f.mjs +5 -4
  63. package/fjs/dev/package_json/module.f.d.mts +7 -0
  64. package/fjs/dev/package_json/module.f.mjs +10 -7
  65. package/fjs/dev/update/module.f.d.mts +3 -0
  66. package/fjs/dev/update/module.f.mjs +3 -2
  67. package/fjs/dev/update/proof.f.d.mts +3 -0
  68. package/fjs/dev/update/proof.f.mjs +1 -2
  69. package/fjs/djs/parser/module.f.d.mts +3 -0
  70. package/fjs/djs/parser/module.f.mjs +18 -0
  71. package/fjs/djs/parser/proof.f.d.mts +3 -0
  72. package/fjs/djs/parser/proof.f.mjs +13 -1
  73. package/fjs/djs/proof.f.d.mts +3 -0
  74. package/fjs/djs/proof.f.mjs +4 -1
  75. package/fjs/djs/serializer/module.f.mjs +5 -4
  76. package/fjs/djs/tokenizer/module.f.mjs +21 -13
  77. package/fjs/djs/tokenizer/proof.f.d.mts +3 -0
  78. package/fjs/djs/tokenizer/proof.f.mjs +14 -2
  79. package/fjs/djs/transpiler/module.f.d.mts +1 -12
  80. package/fjs/djs/transpiler/module.f.mjs +1 -20
  81. package/fjs/djs/transpiler/types.d.ts +25 -0
  82. package/fjs/effects/eff/module.f.d.mts +10 -0
  83. package/fjs/effects/eff/module.f.mjs +4 -2
  84. package/fjs/effects/eff/proof.f.d.mts +3 -0
  85. package/fjs/effects/eff/proof.f.mjs +4 -1
  86. package/fjs/effects/list/module.f.d.mts +10 -2
  87. package/fjs/effects/list/module.f.mjs +4 -2
  88. package/fjs/effects/memory/module.f.d.mts +4 -2
  89. package/fjs/effects/memory/module.f.mjs +4 -3
  90. package/fjs/effects/memory/proof.f.d.mts +4 -0
  91. package/fjs/effects/memory/proof.f.mjs +5 -2
  92. package/fjs/effects/mock/module.f.d.mts +10 -2
  93. package/fjs/effects/mock/module.f.mjs +4 -2
  94. package/fjs/effects/module.d.mts +8 -0
  95. package/fjs/effects/module.f.d.mts +6 -4
  96. package/fjs/effects/module.f.mjs +6 -5
  97. package/fjs/effects/module.mjs +9 -1
  98. package/fjs/effects/node/memory/module.d.mts +3 -0
  99. package/fjs/effects/node/memory/module.mjs +3 -2
  100. package/fjs/effects/node/memory/proof.d.mts +2 -0
  101. package/fjs/effects/node/memory/proof.mjs +2 -1
  102. package/fjs/effects/node/module.d.mts +5 -0
  103. package/fjs/effects/node/module.f.d.mts +17 -12
  104. package/fjs/effects/node/module.f.mjs +6 -12
  105. package/fjs/effects/node/module.mjs +5 -17
  106. package/fjs/effects/node/virtual/module.f.d.mts +6 -3
  107. package/fjs/effects/node/virtual/module.f.mjs +6 -5
  108. package/fjs/effects/node/virtual/proof.f.d.mts +4 -1
  109. package/fjs/effects/node/virtual/proof.f.mjs +13 -1
  110. package/fjs/effects/proof.f.d.mts +3 -0
  111. package/fjs/effects/proof.f.mjs +4 -1
  112. package/fjs/emergent_testing/all.test.d.mts +8 -0
  113. package/fjs/emergent_testing/all.test.mjs +14 -0
  114. package/fjs/emergent_testing/module.f.d.mts +6 -1
  115. package/fjs/emergent_testing/module.f.mjs +40 -66
  116. package/fjs/emergent_testing/proof.f.mjs +5 -5
  117. package/fjs/fsc/bnf.f.d.mts +3 -0
  118. package/fjs/fsc/bnf.f.mjs +4 -1
  119. package/fjs/fsc/json.f.d.mts +3 -0
  120. package/fjs/fsc/json.f.mjs +4 -1
  121. package/fjs/fsc/module.f.d.mts +9 -0
  122. package/fjs/fsc/module.f.mjs +5 -3
  123. package/fjs/fsm/proof.f.d.mts +3 -0
  124. package/fjs/fsm/proof.f.mjs +4 -1
  125. package/fjs/js/tokenizer/module.f.d.mts +7 -0
  126. package/fjs/js/tokenizer/module.f.mjs +19 -55
  127. package/fjs/mcp/module.f.d.mts +36 -1
  128. package/fjs/mcp/module.f.mjs +9 -7
  129. package/fjs/mcp/proof.f.d.mts +11 -1
  130. package/fjs/mcp/proof.f.mjs +11 -18
  131. package/fjs/media/html/module.f.d.mts +12 -0
  132. package/fjs/media/html/module.f.mjs +6 -4
  133. package/fjs/media/html/proof.f.d.mts +3 -0
  134. package/fjs/media/html/proof.f.mjs +4 -1
  135. package/fjs/media/json/parser/module.f.d.mts +1 -1
  136. package/fjs/media/json/parser/module.f.mjs +25 -8
  137. package/fjs/media/json/parser/types.d.ts +5 -0
  138. package/fjs/media/json/rtti/proof.f.d.mts +3 -0
  139. package/fjs/media/json/rtti/proof.f.mjs +3 -3
  140. package/fjs/media/json/schema/module.f.d.mts +61 -27
  141. package/fjs/media/json/schema/module.f.mjs +228 -63
  142. package/fjs/media/json/schema/proof.f.d.mts +41 -0
  143. package/fjs/media/json/schema/proof.f.mjs +219 -7
  144. package/fjs/media/json/serializer/module.f.d.mts +13 -0
  145. package/fjs/media/json/serializer/module.f.mjs +7 -7
  146. package/fjs/media/json/tokenizer/module.f.d.mts +8 -0
  147. package/fjs/media/json/tokenizer/module.f.mjs +24 -5
  148. package/fjs/media/nix/module.f.d.mts +13 -0
  149. package/fjs/media/nix/module.f.mjs +4 -2
  150. package/fjs/media/nix/proof.f.d.mts +3 -0
  151. package/fjs/media/nix/proof.f.mjs +4 -1
  152. package/fjs/media/revision/module.f.d.mts +5 -0
  153. package/fjs/media/revision/module.f.mjs +8 -11
  154. package/fjs/media/revision/proof.f.d.mts +4 -0
  155. package/fjs/media/revision/proof.f.mjs +5 -2
  156. package/fjs/media/type/module.f.d.mts +28 -11
  157. package/fjs/media/type/module.f.mjs +69 -85
  158. package/fjs/media/type/proof.f.d.mts +16 -0
  159. package/fjs/media/type/proof.f.mjs +44 -4
  160. package/fjs/module.d.mts +5 -0
  161. package/fjs/module.f.d.mts +8 -0
  162. package/fjs/module.f.mjs +4 -2
  163. package/fjs/module.mjs +6 -0
  164. package/fjs/path/module.f.d.mts +8 -0
  165. package/fjs/path/module.f.mjs +4 -2
  166. package/fjs/proof.f.d.mts +4 -0
  167. package/fjs/proof.f.mjs +5 -2
  168. package/fjs/protocol/json_rpc/module.f.d.mts +1 -1
  169. package/fjs/protocol/json_rpc/module.f.mjs +7 -4
  170. package/fjs/protocol/json_rpc/proof.f.d.mts +6 -0
  171. package/fjs/protocol/json_rpc/proof.f.mjs +22 -1
  172. package/fjs/protocol/mcp/proof.f.d.mts +4 -0
  173. package/fjs/protocol/mcp/proof.f.mjs +47 -24
  174. package/fjs/protocol/mcp/stdio/module.f.d.mts +2 -4
  175. package/fjs/protocol/mcp/stdio/module.f.mjs +1 -8
  176. package/fjs/protocol/mcp/stdio/proof.f.d.mts +1 -1
  177. package/fjs/protocol/mcp/stdio/proof.f.mjs +1 -1
  178. package/fjs/protocol/mcp/stdio/types.d.ts +14 -0
  179. package/fjs/sul/id/module.f.d.mts +5 -0
  180. package/fjs/sul/id/module.f.mjs +5 -4
  181. package/fjs/sul/level/hash/module.f.d.mts +4 -1
  182. package/fjs/sul/level/hash/module.f.mjs +4 -3
  183. package/fjs/sul/level/hash/proof.f.d.mts +4 -0
  184. package/fjs/sul/level/hash/proof.f.mjs +5 -2
  185. package/fjs/sul/level/literal/module.f.d.mts +4 -1
  186. package/fjs/sul/level/literal/module.f.mjs +4 -3
  187. package/fjs/sul/level/literal/proof.f.d.mts +3 -0
  188. package/fjs/sul/level/literal/proof.f.mjs +4 -1
  189. package/fjs/sul/module.f.d.mts +5 -3
  190. package/fjs/sul/module.f.mjs +5 -4
  191. package/fjs/sul/proof.f.d.mts +4 -0
  192. package/fjs/sul/proof.f.mjs +5 -2
  193. package/fjs/text/ascii/module.f.d.mts +26 -0
  194. package/fjs/text/ascii/module.f.mjs +49 -1
  195. package/fjs/text/ascii/proof.f.d.mts +10 -0
  196. package/fjs/text/ascii/proof.f.mjs +33 -1
  197. package/fjs/text/code_point/module.f.d.mts +21 -3
  198. package/fjs/text/code_point/module.f.mjs +24 -8
  199. package/fjs/text/code_point/proof.f.d.mts +1 -0
  200. package/fjs/text/code_point/proof.f.mjs +28 -0
  201. package/fjs/text/module.f.d.mts +4 -2
  202. package/fjs/text/module.f.mjs +4 -3
  203. package/fjs/text/proof.f.d.mts +3 -0
  204. package/fjs/text/proof.f.mjs +4 -1
  205. package/fjs/text/sgr/module.f.d.mts +4 -1
  206. package/fjs/text/sgr/module.f.mjs +4 -3
  207. package/fjs/text/sgr/proof.f.d.mts +3 -0
  208. package/fjs/text/sgr/proof.f.mjs +4 -1
  209. package/fjs/text/utf16/module.f.d.mts +5 -1
  210. package/fjs/text/utf16/module.f.mjs +31 -33
  211. package/fjs/text/utf16/proof.f.d.mts +3 -1
  212. package/fjs/text/utf16/proof.f.mjs +18 -1
  213. package/fjs/text/utf8/module.f.d.mts +9 -5
  214. package/fjs/text/utf8/module.f.mjs +16 -18
  215. package/fjs/types/array/module.f.d.mts +2 -1
  216. package/fjs/types/array/module.f.mjs +2 -2
  217. package/fjs/types/bigfloat/module.f.d.mts +21 -1
  218. package/fjs/types/bigfloat/module.f.mjs +33 -7
  219. package/fjs/types/bigfloat/proof.f.d.mts +1 -0
  220. package/fjs/types/bigfloat/proof.f.mjs +46 -0
  221. package/fjs/types/bigint/module.f.d.mts +4 -0
  222. package/fjs/types/bigint/module.f.mjs +4 -3
  223. package/fjs/types/bit_vec/module.f.d.mts +10 -14
  224. package/fjs/types/bit_vec/module.f.mjs +61 -71
  225. package/fjs/types/bit_vec/proof.f.d.mts +6 -0
  226. package/fjs/types/bit_vec/proof.f.mjs +29 -3
  227. package/fjs/types/btree/find/module.f.d.mts +5 -1
  228. package/fjs/types/btree/find/module.f.mjs +5 -5
  229. package/fjs/types/btree/find/proof.f.d.mts +5 -1
  230. package/fjs/types/btree/find/proof.f.mjs +5 -3
  231. package/fjs/types/btree/module.f.d.mts +3 -0
  232. package/fjs/types/btree/module.f.mjs +3 -2
  233. package/fjs/types/btree/proof.f.d.mts +5 -1
  234. package/fjs/types/btree/proof.f.mjs +5 -3
  235. package/fjs/types/btree/remove/module.f.d.mts +11 -0
  236. package/fjs/types/btree/remove/module.f.mjs +9 -9
  237. package/fjs/types/btree/remove/proof.f.d.mts +3 -0
  238. package/fjs/types/btree/remove/proof.f.mjs +4 -1
  239. package/fjs/types/btree/set/module.f.d.mts +9 -0
  240. package/fjs/types/btree/set/module.f.mjs +5 -6
  241. package/fjs/types/btree/set/proof.f.d.mts +3 -0
  242. package/fjs/types/btree/set/proof.f.mjs +4 -1
  243. package/fjs/types/btree/types/module.f.d.mts +2 -1
  244. package/fjs/types/btree/types/module.f.mjs +2 -1
  245. package/fjs/types/byte_set/module.f.d.mts +10 -1
  246. package/fjs/types/byte_set/module.f.mjs +5 -3
  247. package/fjs/types/byte_set/proof.f.d.mts +3 -1
  248. package/fjs/types/byte_set/proof.f.mjs +3 -1
  249. package/fjs/types/function/compare/module.f.d.mts +3 -2
  250. package/fjs/types/function/compare/module.f.mjs +3 -2
  251. package/fjs/types/function/module.f.d.mts +8 -1
  252. package/fjs/types/function/module.f.mjs +8 -1
  253. package/fjs/types/function/operator/module.f.d.mts +2 -1
  254. package/fjs/types/function/operator/module.f.mjs +2 -2
  255. package/fjs/types/list/module.f.d.mts +9 -2
  256. package/fjs/types/list/module.f.mjs +5 -3
  257. package/fjs/types/list/proof.f.d.mts +4 -1
  258. package/fjs/types/list/proof.f.mjs +4 -2
  259. package/fjs/types/nibble_set/module.f.d.mts +2 -1
  260. package/fjs/types/nibble_set/module.f.mjs +2 -2
  261. package/fjs/types/nominal/module.f.d.mts +2 -1
  262. package/fjs/types/nominal/module.f.mjs +2 -1
  263. package/fjs/types/nullable/module.f.d.mts +8 -2
  264. package/fjs/types/nullable/module.f.mjs +4 -2
  265. package/fjs/types/number/module.f.d.mts +4 -0
  266. package/fjs/types/number/module.f.mjs +4 -3
  267. package/fjs/types/object/module.f.d.mts +14 -2
  268. package/fjs/types/object/module.f.mjs +15 -6
  269. package/fjs/types/object/proof.f.d.mts +5 -2
  270. package/fjs/types/object/proof.f.mjs +6 -3
  271. package/fjs/types/object/structurally_same/module.f.d.mts +39 -0
  272. package/fjs/types/object/structurally_same/module.f.mjs +59 -0
  273. package/fjs/types/object/structurally_same/proof.f.d.mts +6 -0
  274. package/fjs/types/object/structurally_same/proof.f.mjs +73 -0
  275. package/fjs/types/ordered_map/module.f.d.mts +5 -0
  276. package/fjs/types/ordered_map/module.f.mjs +5 -4
  277. package/fjs/types/ordered_map/proof.f.d.mts +3 -0
  278. package/fjs/types/ordered_map/proof.f.mjs +4 -1
  279. package/fjs/types/patricia_trie/module.f.d.mts +2 -1
  280. package/fjs/types/patricia_trie/module.f.mjs +2 -2
  281. package/fjs/types/patricia_trie/proof.f.d.mts +3 -0
  282. package/fjs/types/patricia_trie/proof.f.mjs +4 -1
  283. package/fjs/types/prime_field/module.f.d.mts +3 -1
  284. package/fjs/types/prime_field/module.f.mjs +3 -2
  285. package/fjs/types/range/module.f.d.mts +2 -1
  286. package/fjs/types/range/module.f.mjs +2 -2
  287. package/fjs/types/range_map/module.f.d.mts +6 -0
  288. package/fjs/types/range_map/module.f.mjs +6 -9
  289. package/fjs/types/range_map/proof.f.d.mts +5 -1
  290. package/fjs/types/range_map/proof.f.mjs +5 -3
  291. package/fjs/types/range_set/module.f.d.mts +5 -0
  292. package/fjs/types/range_set/module.f.mjs +1 -0
  293. package/fjs/types/range_set/proof.f.d.mts +3 -0
  294. package/fjs/types/range_set/proof.f.mjs +4 -1
  295. package/fjs/types/result/module.d.mts +8 -0
  296. package/fjs/types/result/module.f.d.mts +37 -7
  297. package/fjs/types/result/module.f.mjs +38 -8
  298. package/fjs/types/result/module.mjs +9 -1
  299. package/fjs/types/result/proof.f.d.mts +5 -0
  300. package/fjs/types/result/proof.f.mjs +22 -2
  301. package/fjs/types/rtti/common/module.f.d.mts +35 -2
  302. package/fjs/types/rtti/common/module.f.mjs +9 -7
  303. package/fjs/types/rtti/common/proof.f.d.mts +4 -0
  304. package/fjs/types/rtti/common/proof.f.mjs +5 -2
  305. package/fjs/types/rtti/data/module.f.d.mts +120 -0
  306. package/fjs/types/rtti/data/module.f.mjs +1030 -0
  307. package/fjs/types/rtti/data/proof.f.d.mts +75 -0
  308. package/fjs/types/rtti/data/proof.f.mjs +566 -0
  309. package/fjs/types/rtti/data/types.d.ts +83 -0
  310. package/fjs/types/rtti/module.f.d.mts +12 -5
  311. package/fjs/types/rtti/module.f.mjs +7 -5
  312. package/fjs/types/rtti/parse/module.f.d.mts +38 -0
  313. package/fjs/types/rtti/parse/module.f.mjs +9 -7
  314. package/fjs/types/rtti/parse/proof.f.mjs +18 -38
  315. package/fjs/types/rtti/proof.f.d.mts +3 -1
  316. package/fjs/types/rtti/proof.f.mjs +3 -1
  317. package/fjs/types/rtti/ts/module.f.d.mts +68 -9
  318. package/fjs/types/rtti/ts/module.f.mjs +262 -30
  319. package/fjs/types/rtti/ts/proof.f.d.mts +44 -0
  320. package/fjs/types/rtti/ts/proof.f.mjs +152 -4
  321. package/fjs/types/rtti/ts/types.d.ts +11 -0
  322. package/fjs/types/rtti/types.d.ts +40 -0
  323. package/fjs/types/rtti/validate/module.f.d.mts +36 -1
  324. package/fjs/types/rtti/validate/module.f.mjs +6 -4
  325. package/fjs/types/sorted_list/module.f.d.mts +4 -1
  326. package/fjs/types/sorted_list/module.f.mjs +21 -12
  327. package/fjs/types/sorted_list/proof.f.d.mts +3 -1
  328. package/fjs/types/sorted_list/proof.f.mjs +3 -1
  329. package/fjs/types/sorted_set/module.f.d.mts +31 -1
  330. package/fjs/types/sorted_set/module.f.mjs +4 -2
  331. package/fjs/types/sorted_set/proof.f.d.mts +3 -1
  332. package/fjs/types/sorted_set/proof.f.mjs +3 -1
  333. package/fjs/types/string/module.f.d.mts +4 -0
  334. package/fjs/types/string/module.f.mjs +4 -3
  335. package/fjs/types/string_set/module.f.d.mts +3 -1
  336. package/fjs/types/string_set/module.f.mjs +3 -2
  337. package/fjs/types/ts/module.f.d.mts +2 -0
  338. package/fjs/types/ts/module.f.mjs +3 -3
  339. package/fjs/types/ts/proof.f.d.mts +1 -0
  340. package/fjs/types/ts/proof.f.mjs +5 -0
  341. package/fjs/types/ts/types.d.ts +6 -1
  342. package/fjs/types/uint8array/module.f.d.mts +13 -2
  343. package/fjs/types/uint8array/module.f.mjs +20 -15
  344. package/fjs/website/module.f.d.mts +3 -0
  345. package/fjs/website/module.f.mjs +3 -2
  346. package/package.json +3 -3
  347. package/fjs/asn.1/types.js +0 -6
  348. package/fjs/asserts/types.js +0 -6
  349. package/fjs/basen/types.js +0 -6
  350. package/fjs/bnf/data/types.js +0 -6
  351. package/fjs/bnf/descent/types.js +0 -6
  352. package/fjs/bnf/ll1/types.js +0 -6
  353. package/fjs/bnf/token_symbol/types.js +0 -6
  354. package/fjs/bnf/types.js +0 -6
  355. package/fjs/cas/evo/types.js +0 -7
  356. package/fjs/cas/types.js +0 -6
  357. package/fjs/ci/common/types.js +0 -1
  358. package/fjs/ci/nix/types.js +0 -6
  359. package/fjs/ci/types.js +0 -6
  360. package/fjs/cli/types.js +0 -6
  361. package/fjs/common/monoid/types.js +0 -6
  362. package/fjs/crypto/pow/types.js +0 -6
  363. package/fjs/crypto/secp/types.js +0 -6
  364. package/fjs/crypto/sha2/types.js +0 -6
  365. package/fjs/crypto/sign/types.js +0 -6
  366. package/fjs/crypto/vdf/types.js +0 -6
  367. package/fjs/dev/types.js +0 -6
  368. package/fjs/djs/ast/types.js +0 -8
  369. package/fjs/djs/parser/types.js +0 -7
  370. package/fjs/djs/tokenizer/types.js +0 -7
  371. package/fjs/djs/types.js +0 -7
  372. package/fjs/effects/eff/types.js +0 -6
  373. package/fjs/effects/list/types.js +0 -6
  374. package/fjs/effects/memory/types.js +0 -6
  375. package/fjs/effects/mock/types.js +0 -6
  376. package/fjs/effects/node/types.js +0 -6
  377. package/fjs/effects/node/virtual/types.js +0 -7
  378. package/fjs/effects/types.js +0 -6
  379. package/fjs/emergent_testing/all.test.d.ts +0 -1
  380. package/fjs/emergent_testing/all.test.js +0 -5
  381. package/fjs/emergent_testing/scenarios/all.d.ts +0 -1
  382. package/fjs/emergent_testing/scenarios/all.js +0 -1
  383. package/fjs/emergent_testing/scenarios/async-subtests.fail.d.ts +0 -6
  384. package/fjs/emergent_testing/scenarios/async-subtests.fail.js +0 -9
  385. package/fjs/emergent_testing/scenarios/async-subtests.pass.d.ts +0 -6
  386. package/fjs/emergent_testing/scenarios/async-subtests.pass.js +0 -9
  387. package/fjs/emergent_testing/scenarios/async.fail.d.ts +0 -3
  388. package/fjs/emergent_testing/scenarios/async.fail.js +0 -6
  389. package/fjs/emergent_testing/scenarios/async.pass.d.ts +0 -3
  390. package/fjs/emergent_testing/scenarios/async.pass.js +0 -5
  391. package/fjs/emergent_testing/scenarios/fail.fail.d.ts +0 -3
  392. package/fjs/emergent_testing/scenarios/fail.fail.js +0 -3
  393. package/fjs/emergent_testing/scenarios/return-value.pass.d.ts +0 -3
  394. package/fjs/emergent_testing/scenarios/return-value.pass.js +0 -4
  395. package/fjs/emergent_testing/scenarios/thenable.pass.d.ts +0 -5
  396. package/fjs/emergent_testing/scenarios/thenable.pass.js +0 -11
  397. package/fjs/emergent_testing/scenarios/thenable2.pass.d.ts +0 -5
  398. package/fjs/emergent_testing/scenarios/thenable2.pass.js +0 -3
  399. package/fjs/emergent_testing/scenarios/throw.pass.d.ts +0 -5
  400. package/fjs/emergent_testing/scenarios/throw.pass.js +0 -3
  401. package/fjs/emergent_testing/types.js +0 -6
  402. package/fjs/js/tokenizer/types.js +0 -6
  403. package/fjs/media/html/types.js +0 -6
  404. package/fjs/media/json/parser/types.js +0 -6
  405. package/fjs/media/json/tokenizer/types.js +0 -6
  406. package/fjs/media/json/types.js +0 -13
  407. package/fjs/media/nix/types.js +0 -6
  408. package/fjs/media/revision/types.js +0 -8
  409. package/fjs/media/type/types.js +0 -6
  410. package/fjs/media/types.js +0 -7
  411. package/fjs/nanvm/types.js +0 -11
  412. package/fjs/protocol/json_rpc/types.js +0 -8
  413. package/fjs/protocol/mcp/types.js +0 -8
  414. package/fjs/sul/id/types.js +0 -6
  415. package/fjs/sul/level/hash/types.js +0 -6
  416. package/fjs/sul/level/literal/types.js +0 -6
  417. package/fjs/sul/types.js +0 -6
  418. package/fjs/text/sgr/types.js +0 -6
  419. package/fjs/text/types.js +0 -6
  420. package/fjs/text/utf16/types.js +0 -6
  421. package/fjs/text/utf8/types.js +0 -6
  422. package/fjs/types/array/types.js +0 -6
  423. package/fjs/types/bigfloat/types.js +0 -6
  424. package/fjs/types/bigint/types.js +0 -6
  425. package/fjs/types/bit_vec/types.js +0 -6
  426. package/fjs/types/btree/find/types.js +0 -6
  427. package/fjs/types/btree/types/types.js +0 -6
  428. package/fjs/types/byte_set/types.js +0 -6
  429. package/fjs/types/function/compare/types.js +0 -6
  430. package/fjs/types/function/operator/types.js +0 -6
  431. package/fjs/types/function/types.js +0 -6
  432. package/fjs/types/list/types.js +0 -6
  433. package/fjs/types/nibble_set/types.js +0 -6
  434. package/fjs/types/nominal/types.js +0 -6
  435. package/fjs/types/nullable/types.js +0 -6
  436. package/fjs/types/object/types.js +0 -8
  437. package/fjs/types/option/types.js +0 -6
  438. package/fjs/types/ordered_map/types.js +0 -6
  439. package/fjs/types/patricia_trie/types.js +0 -6
  440. package/fjs/types/phantom/types.js +0 -11
  441. package/fjs/types/prime_field/types.js +0 -6
  442. package/fjs/types/range/types.js +0 -6
  443. package/fjs/types/range_map/types.js +0 -6
  444. package/fjs/types/result/types.js +0 -6
  445. package/fjs/types/rtti/common/types.js +0 -1
  446. package/fjs/types/rtti/parse/types.js +0 -1
  447. package/fjs/types/rtti/ts/types.js +0 -1
  448. package/fjs/types/rtti/types.js +0 -1
  449. package/fjs/types/rtti/validate/types.js +0 -1
  450. package/fjs/types/sorted_list/types.js +0 -6
  451. package/fjs/types/sorted_set/types.js +0 -6
  452. package/fjs/types/string_set/types.js +0 -6
  453. package/fjs/types/ts/types.js +0 -8
@@ -0,0 +1,75 @@
1
+ /**
2
+ * @import { Or } from '../types.ts'
3
+ * @import { Data } from './types.ts'
4
+ */
5
+ import type { Or } from '../types.ts';
6
+ import { number, string, unknown as unknownRtti } from '../module.f.mjs';
7
+ export type _List = () => readonly ['array', _List];
8
+ export type _Tree = () => readonly ['or', typeof number, _Forest];
9
+ export type _Forest = () => readonly ['array', _Tree];
10
+ export type _SelfOr = () => readonly ['or', typeof number, _SelfOr];
11
+ export type _OrA = () => readonly ['or', _OrB, typeof number];
12
+ export type _OrB = () => readonly ['or', _OrA, typeof string];
13
+ export type _Outer = () => readonly ['or', typeof string, _Inner];
14
+ export type _Inner = () => readonly ['or', _Outer, _T2];
15
+ export type _T2 = () => readonly ['array', _Inner];
16
+ export type _X = () => readonly ['array', _Y];
17
+ export type _Y = () => readonly ['array', _W];
18
+ export type _W = () => readonly ['or', _X, _Y, typeof number];
19
+ export type _TopOr = () => readonly ['or', typeof unknownRtti, _TopArr];
20
+ export type _TopArr = () => readonly ['array', _TopOr];
21
+ export type _B2 = () => readonly ['array', _B2];
22
+ export type _A2 = () => readonly ['array', readonly [_A2, _B2]];
23
+ export type _RecordSelf = () => readonly ['record', _RecordSelf];
24
+ export type _Even = () => readonly ['const', {
25
+ readonly value: typeof number;
26
+ readonly next: Or<readonly [_Odd, undefined]>;
27
+ }];
28
+ export type _Odd = () => readonly ['const', {
29
+ readonly value: typeof number;
30
+ readonly next: Or<readonly [_Even, undefined]>;
31
+ }];
32
+ export type _Rec = () => readonly ['array', _Rec];
33
+ export declare const proof: {
34
+ unitBits: () => void;
35
+ toData: {
36
+ primitives: () => void;
37
+ tag0: () => void;
38
+ containers: () => void;
39
+ constSchemas: () => void;
40
+ or: () => void;
41
+ orCanonicalIdentity: () => void;
42
+ recursion: () => void;
43
+ orCycles: () => void;
44
+ intern: () => void;
45
+ alphaEquivalence: () => void;
46
+ names: () => void;
47
+ collapse: () => void;
48
+ serializable: () => void;
49
+ };
50
+ cmp: {
51
+ totalOrder: () => void;
52
+ restOrder: () => void;
53
+ rules: () => void;
54
+ };
55
+ subset: {
56
+ literals: () => void;
57
+ arrays: () => void;
58
+ arrayRest: () => void;
59
+ objects: () => void;
60
+ recursion: () => void;
61
+ mixedObjectRecursion: () => void;
62
+ assumed: () => void;
63
+ };
64
+ validate: {
65
+ literals: () => void;
66
+ kinds: () => void;
67
+ arrays: () => void;
68
+ objects: () => void;
69
+ recursion: () => void;
70
+ throw: {
71
+ danglingReference: () => import("../common/types.ts").ResultE;
72
+ danglingPrototypeReference: () => import("../common/types.ts").ResultE;
73
+ };
74
+ };
75
+ };
@@ -0,0 +1,566 @@
1
+ /**
2
+ * @import { Or } from '../types.ts'
3
+ * @import { Data } from './types.ts'
4
+ */
5
+
6
+ import { assert, assertEq } from '../../../asserts/module.f.mjs'
7
+ import {
8
+ array,
9
+ bigint,
10
+ boolean,
11
+ never as neverRtti,
12
+ number,
13
+ option,
14
+ or,
15
+ record,
16
+ string,
17
+ unknown as unknownRtti,
18
+ } from '../module.f.mjs'
19
+ import { cmp, equal, never, subset, toData, unitBit, unitList, unknown, validate } from './module.f.mjs'
20
+
21
+ /** @type {(actual: Data) => (expected: Data) => void} */
22
+ const assertData = actual => expected =>
23
+ assert(equal(actual)(expected), [actual, expected])
24
+
25
+ /** A recursive list: `type _List = readonly _List[]`. */
26
+ /** @typedef {() => readonly ['array', _List]} _List */
27
+ /** @type {_List} */
28
+ const list = () => ['array', list]
29
+
30
+ /** Mutual recursion through a container: `_Tree = number | _Forest`, `_Forest = readonly _Tree[]`. */
31
+ /** @typedef {() => readonly ['or', typeof number, _Forest]} _Tree */
32
+ /** @typedef {() => readonly ['array', _Tree]} _Forest */
33
+ /** @type {_Tree} */
34
+ const tree = () => ['or', number, forest]
35
+ /** @type {_Forest} */
36
+ const forest = () => ['array', tree]
37
+
38
+ /** A pure `or` self-cycle: `_SelfOr = number | _SelfOr`. */
39
+ /** @typedef {() => readonly ['or', typeof number, _SelfOr]} _SelfOr */
40
+ /** @type {_SelfOr} */
41
+ const selfOr = () => ['or', number, selfOr]
42
+
43
+ /** A mutual `or` cycle: `_OrA = _OrB | number`, `_OrB = _OrA | string`. */
44
+ /** @typedef {() => readonly ['or', _OrB, typeof number]} _OrA */
45
+ /** @typedef {() => readonly ['or', _OrA, typeof string]} _OrB */
46
+ /** @type {_OrA} */
47
+ const orA = () => ['or', orB, number]
48
+ /** @type {_OrB} */
49
+ const orB = () => ['or', orA, string]
50
+
51
+ /** An `or` over a rule that still has pending merges when it is consumed. */
52
+ /** @typedef {() => readonly ['or', typeof string, _Inner]} _Outer */
53
+ /** @typedef {() => readonly ['or', _Outer, _T2]} _Inner */
54
+ /** @typedef {() => readonly ['array', _Inner]} _T2 */
55
+ /** @type {_Outer} */
56
+ const outer = () => ['or', string, inner]
57
+ /** @type {_Inner} */
58
+ const inner = () => ['or', outer, t2]
59
+ /** @type {_T2} */
60
+ const t2 = () => ['array', inner]
61
+
62
+ /** Two `or` operands deferred onto the same target rule. */
63
+ /** @typedef {() => readonly ['array', _Y]} _X */
64
+ /** @typedef {() => readonly ['array', _W]} _Y */
65
+ /** @typedef {() => readonly ['or', _X, _Y, typeof number]} _W */
66
+ /** @type {_X} */
67
+ const x = () => ['array', y]
68
+ /** @type {_Y} */
69
+ const y = () => ['array', w]
70
+ /** @type {_W} */
71
+ const w = () => ['or', x, y, number]
72
+
73
+ /** A cycle whose union is the whole value domain. */
74
+ /** @typedef {() => readonly ['or', typeof unknownRtti, _TopArr]} _TopOr */
75
+ /** @typedef {() => readonly ['array', _TopOr]} _TopArr */
76
+ /** @type {_TopOr} */
77
+ const topOr = () => ['or', unknownRtti, topArr]
78
+ /** @type {_TopArr} */
79
+ const topArr = () => ['array', topOr]
80
+
81
+ /** Two named rules where only one is referenced by the entry. */
82
+ /** @typedef {() => readonly ['array', _B2]} _B2 */
83
+ /** @typedef {() => readonly ['array', readonly [_A2, _B2]]} _A2 */
84
+ /** @type {_A2} */
85
+ const a2 = () => ['array', [a2, b2]]
86
+ /** @type {_B2} */
87
+ const b2 = () => ['array', b2]
88
+
89
+ /** A self-recursive record: rest-based object recursion. */
90
+ /** @typedef {() => readonly ['record', _RecordSelf]} _RecordSelf */
91
+ /** @type {_RecordSelf} */
92
+ const recordSelf = () => ['record', recordSelf]
93
+
94
+ /** Mutual recursion through object *properties* rather than containers. */
95
+ /** @typedef {() => readonly ['const', { readonly value: typeof number, readonly next: Or<readonly [_Odd, undefined]> }]} _Even */
96
+ /** @typedef {() => readonly ['const', { readonly value: typeof number, readonly next: Or<readonly [_Even, undefined]> }]} _Odd */
97
+ /** @type {_Even} */
98
+ const even = () => ['const', { value: number, next: option(odd) }]
99
+ /** @type {_Odd} */
100
+ const odd = () => ['const', { value: number, next: option(even) }]
101
+
102
+ /** @typedef {() => readonly ['array', _Rec]} _Rec */
103
+ /** Every call returns a fresh recursive thunk whose function name is `f`. */
104
+ /** @type {() => _Rec} */
105
+ const mkRec = () => {
106
+ /** @type {_Rec} */
107
+ const f = () => ['array', f]
108
+ return f
109
+ }
110
+
111
+ /** @type {(f: _Rec) => _Rec} */
112
+ const identityRec = f => f
113
+ /** A recursive thunk whose function name is the empty string. */
114
+ /** @type {_Rec} */
115
+ const anon = identityRec(() => ['array', anon])
116
+
117
+ const tupleNumber = /** @type {const} */ ([number])
118
+ const tupleString = /** @type {const} */ ([string])
119
+ const emptyTuple = /** @type {const} */ ([])
120
+
121
+ export const proof = {
122
+ unitBits: () => {
123
+ // the literal bits are the encoding under test
124
+ assertEq(unitList.join(), 'null,undefined,false,true')
125
+ assertEq(unitBit(null), 1)
126
+ assertEq(unitBit(undefined), 2)
127
+ assertEq(unitBit(false), 4)
128
+ assertEq(unitBit(true), 8)
129
+ },
130
+ toData: {
131
+ primitives: () => {
132
+ assertData(toData(null))([{}, { unit: unitBit(null) }])
133
+ assertData(toData(undefined))([{}, { unit: unitBit(undefined) }])
134
+ assertData(toData(false))([{}, { unit: unitBit(false) }])
135
+ assertData(toData(true))([{}, { unit: unitBit(true) }])
136
+ assertData(toData(42))([{}, { number: [42] }])
137
+ assertData(toData('hi'))([{}, { string: ['hi'] }])
138
+ assertData(toData(7n))([{}, { bigint: [7n] }])
139
+ assert(!equal(toData(0))(toData(-0)))
140
+ },
141
+ tag0: () => {
142
+ assertData(toData(boolean))([{}, { unit: unitBit(false) | unitBit(true) }])
143
+ assertData(toData(number))([{}, { number: true }])
144
+ assertData(toData(string))([{}, { string: true }])
145
+ assertData(toData(bigint))([{}, { bigint: true }])
146
+ assertData(toData(unknownRtti))([{}, unknown])
147
+ assertData(toData(neverRtti))([{}, never])
148
+ },
149
+ containers: () => {
150
+ assertData(toData(array(number)))([{}, { array: [{ prefix: [], rest: { number: true } }] }])
151
+ assertData(toData(record(string)))([{}, { object: [{ props: {}, rest: { string: true } }] }])
152
+ assertData(toData(array(unknownRtti)))([{}, { array: true }])
153
+ assertData(toData(record(unknownRtti)))([{}, { object: true }])
154
+ assertData(toData(array(neverRtti)))([{}, { array: [{ prefix: [] }] }])
155
+ assertData(toData(record(neverRtti)))([{}, { object: [{ props: {}, rest: {} }] }])
156
+ assertData(toData(emptyTuple))([{}, { array: [{ prefix: [] }] }])
157
+ assertData(toData(/** @type {const} */ ([number, 42])))(
158
+ [{}, { array: [{ prefix: [{ number: true }, { number: [42] }] }] }])
159
+ assertData(toData({}))([{}, { object: true }])
160
+ assertData(toData({ b: string, a: number }))(
161
+ [{}, { object: [{ props: { a: { number: true }, b: { string: true } } }] }])
162
+ assertData(toData({ a: unknownRtti }))([{}, { object: true }])
163
+ assertData(toData(/** @type {const} */ ([neverRtti])))([{}, never])
164
+ assertData(toData({ a: neverRtti }))([{}, never])
165
+ },
166
+ constSchemas: () => {
167
+ assertData(toData(() => /** @type {const} */ (['const', 42])))([{}, { number: [42] }])
168
+ assertData(toData(() => /** @type {const} */ (['const', null])))([{}, { unit: unitBit(null) }])
169
+ assertData(toData(() => /** @type {const} */ (['const', { a: 42 }])))(toData({ a: 42 }))
170
+ // a shared container converts once and is inlined at each use
171
+ assertData(toData(/** @type {const} */ ([tupleNumber, tupleNumber])))([{}, {
172
+ array: [{
173
+ prefix: [
174
+ { array: [{ prefix: [{ number: true }] }] },
175
+ { array: [{ prefix: [{ number: true }] }] },
176
+ ],
177
+ }],
178
+ }])
179
+ },
180
+ or: () => {
181
+ assertData(toData(or()))([{}, never])
182
+ assertData(toData(or(true, false)))([{}, { unit: unitBit(false) | unitBit(true) }])
183
+ assertData(toData(or(boolean, null, undefined)))(
184
+ [{}, { unit: unitBit(null) | unitBit(undefined) | unitBit(false) | unitBit(true) }])
185
+ assertData(toData(or(42, number)))([{}, { number: true }])
186
+ assertData(toData(or(1, 1)))([{}, { number: [1] }])
187
+ assertData(toData(or(2, 1)))([{}, { number: [1, 2] }])
188
+ assertData(toData(or(NaN, NaN)))([{}, { number: [NaN] }])
189
+ assertData(toData(or(NaN, 1)))([{}, { number: [1, NaN] }])
190
+ assertData(toData(or(1, NaN)))([{}, { number: [1, NaN] }])
191
+ assertData(toData(or(-0, 0)))([{}, { number: [-0, 0] }])
192
+ assertData(toData(or(0, -0)))([{}, { number: [-0, 0] }])
193
+ assertData(toData(or('b', 'a')))([{}, { string: ['a', 'b'] }])
194
+ assertData(toData(or(2n, 1n)))([{}, { bigint: [1n, 2n] }])
195
+ assertData(toData(option(string)))([{}, { unit: unitBit(undefined), string: true }])
196
+ assertData(toData(or(unknownRtti, number)))([{}, unknown])
197
+ assertData(toData(or(number, or(string, boolean))))(
198
+ [{}, { unit: unitBit(false) | unitBit(true), number: true, string: true }])
199
+ assertData(toData(or(1, or(1, 2))))([{}, { number: [1, 2] }])
200
+ },
201
+ orCanonicalIdentity: () => {
202
+ assertData(toData(or(number, string)))(toData(or(string, number)))
203
+ const a = array(number)
204
+ const b = array(string)
205
+ assertData(toData(or(a, b)))(toData(or(b, a)))
206
+ assertData(toData(or(tupleNumber, tupleString)))(toData(or(tupleString, tupleNumber)))
207
+ },
208
+ recursion: () => {
209
+ assertData(toData(list))([{ list: { array: [{ prefix: [], rest: 'list' }] } }, 'list'])
210
+ assertData(toData(tree))(
211
+ [{ tree: { number: true, array: [{ prefix: [], rest: 'tree' }] } }, 'tree'])
212
+ assertData(toData(forest))([
213
+ { tree: { number: true, array: [{ prefix: [], rest: 'tree' }] } },
214
+ { array: [{ prefix: [], rest: 'tree' }] },
215
+ ])
216
+ assertData(toData(record(list)))([
217
+ { list: { array: [{ prefix: [], rest: 'list' }] } },
218
+ { object: [{ props: {}, rest: 'list' }] },
219
+ ])
220
+ assertData(toData({ p: list }))([
221
+ { list: { array: [{ prefix: [], rest: 'list' }] } },
222
+ { object: [{ props: { p: 'list' } }] },
223
+ ])
224
+ assertData(toData(a2))([
225
+ {
226
+ a2: { array: [{ prefix: [], rest: { array: [{ prefix: ['a2', 'b2'] }] } }] },
227
+ b2: { array: [{ prefix: [], rest: 'b2' }] },
228
+ },
229
+ 'a2',
230
+ ])
231
+ },
232
+ orCycles: () => {
233
+ // a pure `or` self-cycle contributes nothing: _X = number | _X is number
234
+ assertData(toData(selfOr))(toData(number))
235
+ // a mutual `or` cycle is the union of the non-cyclic content
236
+ assertData(toData(orA))(toData(or(number, string)))
237
+ // `outer` and `inner` denote the same set; the interning step
238
+ // recognizes the inlined entry as `inner`'s body
239
+ assertData(toData(outer))([
240
+ { inner: { string: true, array: [{ prefix: [], rest: 'inner' }] } },
241
+ 'inner',
242
+ ])
243
+ assertData(toData(outer))(toData(inner))
244
+ assertData(toData(x))([
245
+ { w: { number: true, array: [{ prefix: [], rest: 'w' }] } },
246
+ { array: [{ prefix: [], rest: { array: [{ prefix: [], rest: 'w' }] } }] },
247
+ ])
248
+ assertData(toData(topArr))([{ topOr: unknown }, { array: [{ prefix: [], rest: 'topOr' }] }])
249
+ },
250
+ intern: () => {
251
+ // a union equal to a rule's body reads back as a reference,
252
+ // so `or` is idempotent on recursive schemas
253
+ assertData(toData(or(list)))(toData(list))
254
+ assertData(toData(or(list, list)))(toData(list))
255
+ assertData(toData(or(tree, tree)))(toData(tree))
256
+ // a re-stated fixpoint collapses: `list = readonly list[]`,
257
+ // so `array(list)` is `list` itself
258
+ assertData(toData(array(list)))(toData(list))
259
+ assertData(toData(array(or(list))))(toData(list))
260
+ // in nested positions too
261
+ assertData(toData({ p: or(list) }))(toData({ p: list }))
262
+ },
263
+ alphaEquivalence: () => {
264
+ // two α-equivalent recursive rules under different names spell
265
+ // the same set two ways; their union keeps the spelling that
266
+ // sorts first instead of dropping the mutually-subsumed pair
267
+ const listB = mkRec()
268
+ assertData(toData(or(list, listB)))(toData(listB))
269
+ assertData(toData(or(listB, list)))(toData(listB))
270
+ assert(subset(toData(list))(toData(or(list, listB))))
271
+ assert(subset(toData(listB))(toData(or(list, listB))))
272
+ assertEq(validate(toData(or(list, listB)))([[]])[0], 'ok')
273
+ // the pair is a mutual subset, yet `equal` stays structural
274
+ assert(subset(toData(list))(toData(listB)))
275
+ assert(subset(toData(listB))(toData(list)))
276
+ assert(!equal(toData(list))(toData(listB)))
277
+ // bisimilar mixed-kind recursions collapse the same way
278
+ assertData(toData(or(tree, y)))(toData(tree))
279
+ },
280
+ names: () => {
281
+ // colliding function names are disambiguated with a counter
282
+ assertData(toData(/** @type {const} */ ([mkRec(), mkRec()])))([
283
+ {
284
+ f: { array: [{ prefix: [], rest: 'f' }] },
285
+ f0: { array: [{ prefix: [], rest: 'f0' }] },
286
+ },
287
+ { array: [{ prefix: ['f', 'f0'] }] },
288
+ ])
289
+ assertData(toData(anon))([{ '': { array: [{ prefix: [], rest: '' }] } }, ''])
290
+ },
291
+ collapse: () => {
292
+ // readonly [number] ⊂ readonly number[] — the tuple pattern is dropped
293
+ assertData(toData(or(tupleNumber, array(number))))(toData(array(number)))
294
+ // the empty tuple is a member of every uniform array set
295
+ assertData(toData(or(emptyTuple, array(number))))(toData(array(number)))
296
+ assertData(toData(or(array(number), emptyTuple)))(toData(array(number)))
297
+ // kept when neither pattern subsumes the other
298
+ assertData(toData(or(tupleNumber, tupleString)))(
299
+ [{}, { array: [{ prefix: [{ string: true }] }, { prefix: [{ number: true }] }] }])
300
+ // the collapse recurses into inline positions
301
+ assertData(toData(array(or(tupleNumber, array(number)))))(toData(array(array(number))))
302
+ assertData(toData(record(or(tupleNumber, array(number)))))(toData(record(array(number))))
303
+ assertData(toData({ a: or(tupleNumber, array(number)) }))(toData({ a: array(number) }))
304
+ // collapsing innards can make two patterns identical — deduplicated
305
+ assertData(toData(or(array(or(tupleNumber, array(number))), array(array(number)))))(
306
+ toData(array(array(number))))
307
+ // subsumed object patterns are dropped, `true` absorbs patterns
308
+ assertData(toData(or({ a: 42 }, { a: number })))(toData({ a: number }))
309
+ assertData(toData(or({ a: number }, {})))(toData({}))
310
+ },
311
+ serializable: () => {
312
+ const d = toData(or(string, array(number), null))
313
+ assertEq(
314
+ JSON.stringify(d),
315
+ '[{},{"unit":1,"string":true,"array":[{"prefix":[],"rest":{"number":true}}]}]')
316
+ assertEq(
317
+ JSON.stringify(toData(list)),
318
+ '[{"list":{"array":[{"prefix":[],"rest":"list"}]}},"list"]')
319
+ },
320
+ },
321
+ cmp: {
322
+ totalOrder: () => {
323
+ assertEq(cmp(toData(number))(toData(number)), 0)
324
+ assertEq(cmp(toData(list))(toData(list)), 0)
325
+ assert(cmp(toData(null))(toData(true)) < 0)
326
+ assert(cmp(toData(1))(toData(2)) < 0)
327
+ assert(cmp(toData(or(1, 2)))(toData(or(1, 2, 3))) < 0)
328
+ assert(cmp(toData(1))(toData(number)) < 0)
329
+ assert(cmp(toData(number))(toData(1)) > 0)
330
+ assert(cmp(toData(neverRtti))(toData(number)) < 0)
331
+ assert(cmp(toData(number))(toData(neverRtti)) > 0)
332
+ assert(cmp(toData('a'))(toData('b')) < 0)
333
+ assert(cmp(toData(1n))(toData(2n)) < 0)
334
+ assert(cmp(toData(2n))(toData(1n)) > 0)
335
+ assert(cmp(toData(string))(toData(bigint)) !== 0)
336
+ assert(cmp(toData(array(number)))(toData(array(string))) !== 0)
337
+ assert(cmp(toData({ a: number }))(toData({ a: string })) !== 0)
338
+ assert(cmp(toData({ a: number }))(toData({ b: number })) !== 0)
339
+ // an inline union sorts before a reference
340
+ assert(cmp(toData(number))(toData(list)) < 0)
341
+ assert(cmp(toData(list))(toData(number)) > 0)
342
+ },
343
+ restOrder: () => {
344
+ // a pattern without a rest sorts before one with a rest
345
+ /** @type {Data} */
346
+ const arrayNoRest = [{}, { array: [{ prefix: [{ number: true }] }] }]
347
+ /** @type {Data} */
348
+ const arrayRest = [{}, { array: [{ prefix: [{ number: true }], rest: { number: true } }] }]
349
+ assert(cmp(arrayNoRest)(arrayRest) < 0)
350
+ assert(cmp(arrayRest)(arrayNoRest) > 0)
351
+ /** @type {Data} */
352
+ const structNoRest = [{}, { object: [{ props: { a: { number: true } } }] }]
353
+ /** @type {Data} */
354
+ const structRest = [{}, { object: [{ props: { a: { number: true } }, rest: { number: true } }] }]
355
+ assert(cmp(structNoRest)(structRest) < 0)
356
+ assert(cmp(structRest)(structNoRest) > 0)
357
+ // rests compared when the prefixes and props tie
358
+ assertData(toData(or(array(number), array(string))))(
359
+ [{}, { array: [{ prefix: [], rest: { string: true } }, { prefix: [], rest: { number: true } }] }])
360
+ assertData(toData(or(record(number), record(string))))(
361
+ [{}, { object: [{ props: {}, rest: { string: true } }, { props: {}, rest: { number: true } }] }])
362
+ // fewer props sort before more props
363
+ assertData(toData(or({ a: number }, record(number))))(
364
+ [{}, { object: [{ props: {}, rest: { number: true } }, { props: { a: { number: true } } }] }])
365
+ },
366
+ rules: () => {
367
+ /** @type {Data} */
368
+ const ra = [{ r: { number: true } }, 'r']
369
+ /** @type {Data} */
370
+ const rb = [{ r: { string: true } }, 'r']
371
+ assert(cmp(ra)(rb) !== 0)
372
+ assert(!equal(ra)(rb))
373
+ },
374
+ },
375
+ subset: {
376
+ literals: () => {
377
+ assert(subset(toData(true))(toData(boolean)))
378
+ assert(!subset(toData(boolean))(toData(true)))
379
+ assert(!subset(toData(null))(toData(number)))
380
+ assert(subset(toData(42))(toData(number)))
381
+ assert(!subset(toData(number))(toData(42)))
382
+ assert(subset(toData(or(1, 2)))(toData(or(1, 2, 3))))
383
+ assert(!subset(toData(or(1, 4)))(toData(or(1, 2, 3))))
384
+ assert(subset(toData('a'))(toData(string)))
385
+ assert(subset(toData(1n))(toData(or(1n, 2n))))
386
+ assert(!subset(toData(1n))(toData(2n)))
387
+ assert(!subset(toData(42))(toData(string)))
388
+ assert(subset(toData(neverRtti))(toData(42)))
389
+ assert(subset(toData(or(number, string)))(toData(unknownRtti)))
390
+ },
391
+ arrays: () => {
392
+ assert(subset(toData(tupleNumber))(toData(array(number))))
393
+ assert(!subset(toData(array(number)))(toData(tupleNumber)))
394
+ assert(subset(toData(array(number)))(toData(unknownRtti)))
395
+ assert(!subset(toData(array(unknownRtti)))(toData(array(number))))
396
+ assert(subset(toData(array(number)))(toData(array(or(number, string)))))
397
+ assert(!subset(toData(tupleNumber))(toData(tupleString)))
398
+ assert(!subset(toData(tupleNumber))(toData(/** @type {const} */ ([number, number]))))
399
+ },
400
+ arrayRest: () => {
401
+ /** @type {Data} */
402
+ const oneOrMoreNumbers = [{}, { array: [{ prefix: [{ number: true }], rest: { number: true } }] }]
403
+ assert(subset(oneOrMoreNumbers)(toData(array(number))))
404
+ assert(!subset(toData(array(number)))(oneOrMoreNumbers))
405
+ assert(subset(toData(/** @type {const} */ ([number, number])))(oneOrMoreNumbers))
406
+ assert(!subset(toData(emptyTuple))(oneOrMoreNumbers))
407
+ /** @type {Data} */
408
+ const oneNumberThenStrings = [{}, { array: [{ prefix: [{ number: true }], rest: { string: true } }] }]
409
+ assert(!subset(oneOrMoreNumbers)(oneNumberThenStrings))
410
+ },
411
+ objects: () => {
412
+ assert(subset(toData({ a: number }))(toData({})))
413
+ assert(subset(toData({ a: 42 }))(toData({ a: number })))
414
+ assert(!subset(toData({ a: number }))(toData({ a: 42 })))
415
+ assert(subset(toData({ a: number, b: string }))(toData({ a: number })))
416
+ assert(subset(toData(record(number)))(toData(record(or(number, string)))))
417
+ assert(!subset(toData(record(or(number, string))))(toData(record(number))))
418
+ // a record's keys may be absent, a required key excludes that
419
+ assert(!subset(toData(record(number)))(toData({ a: number })))
420
+ assert(subset(toData(record(number)))(toData({ a: option(number) })))
421
+ // a struct leaves undeclared keys unconstrained, a record does not
422
+ assert(!subset(toData({ a: number }))(toData(record(number))))
423
+ // a key inherited from Object.prototype is not a declared prop
424
+ assert(!subset(toData({ a: number }))(toData({ toString: number })))
425
+ assert(subset(toData({ toString: /** @type {const} */ (42) }))(toData({ toString: number })))
426
+ },
427
+ recursion: () => {
428
+ assert(subset(toData(list))(toData(list)))
429
+ assert(subset(toData(forest))(toData(tree)))
430
+ assert(!subset(toData(tree))(toData(forest)))
431
+ assert(!subset(toData(list))(toData(array(number))))
432
+ assert(subset(toData(array(neverRtti)))(toData(list)))
433
+ },
434
+ mixedObjectRecursion: () => {
435
+ // rest-based and property-based object recursion compared in one
436
+ // union used to overflow the stack: the synthesized `rest ∪
437
+ // undefined` read-sets never reached the coinductive memo
438
+ const v = validate(toData(or(recordSelf, even)))
439
+ assertEq(v({})[0], 'ok')
440
+ assertEq(v({ value: 1 })[0], 'ok')
441
+ assertEq(v({ value: 'x' })[0], 'error')
442
+ assert(!subset(toData(recordSelf))(toData(even)))
443
+ assert(!subset(toData(even))(toData(recordSelf)))
444
+ assert(subset(toData(recordSelf))(toData(or(recordSelf, even))))
445
+ assert(subset(toData(even))(toData(or(recordSelf, even))))
446
+ assert(subset(toData(even))(toData(odd)))
447
+ },
448
+ assumed: () => {
449
+ // one left rule checked against two right rules on one path
450
+ /** @type {Data} */
451
+ const left = [{ A: { array: [{ prefix: [], rest: 'A' }] } }, 'A']
452
+ /** @type {Data} */
453
+ const right = [
454
+ {
455
+ B: { array: [{ prefix: [], rest: 'C' }] },
456
+ C: { array: [{ prefix: [], rest: 'C' }] },
457
+ },
458
+ 'B',
459
+ ]
460
+ assert(subset(left)(right))
461
+ },
462
+ },
463
+ validate: {
464
+ literals: () => {
465
+ const v = validate(toData(or(1, 'a', 2n, null, true)))
466
+ assertEq(v(1)[0], 'ok')
467
+ assertEq(v('a')[0], 'ok')
468
+ assertEq(v(2n)[0], 'ok')
469
+ assertEq(v(null)[0], 'ok')
470
+ assertEq(v(true)[0], 'ok')
471
+ assertEq(v(2)[0], 'error')
472
+ assertEq(v('b')[0], 'error')
473
+ assertEq(v(3n)[0], 'error')
474
+ assertEq(v(undefined)[0], 'error')
475
+ assertEq(v(false)[0], 'error')
476
+ },
477
+ kinds: () => {
478
+ assertEq(validate(toData(number))(NaN)[0], 'ok')
479
+ assertEq(validate(toData(string))('x')[0], 'ok')
480
+ assertEq(validate(toData(bigint))(1n)[0], 'ok')
481
+ assertEq(validate(toData(boolean))(false)[0], 'ok')
482
+ assertEq(validate(toData(NaN))(NaN)[0], 'ok')
483
+ assertEq(validate(toData(-0))(0)[0], 'error')
484
+ assertEq(validate(toData(unknownRtti))([1])[0], 'ok')
485
+ assertEq(validate(toData(unknownRtti))({ a: 1 })[0], 'ok')
486
+ assertEq(validate(toData(neverRtti))(1)[0], 'error')
487
+ assertEq(validate(toData(number))([])[0], 'error')
488
+ assertEq(validate(toData(number))({})[0], 'error')
489
+ },
490
+ arrays: () => {
491
+ const v = validate(toData(array(number)))
492
+ assertEq(v([])[0], 'ok')
493
+ assertEq(v([1, 2])[0], 'ok')
494
+ assertEq(
495
+ JSON.stringify(v([1, 'x'])),
496
+ '["error",{"path":["1"],"message":"unexpected value"}]')
497
+ const vt = validate(toData(/** @type {const} */ ([number, string])))
498
+ assertEq(vt([1, 'a'])[0], 'ok')
499
+ assertEq(vt([1])[0], 'error')
500
+ assertEq(vt([1, 'a', 2])[0], 'error')
501
+ /** @type {Data} */
502
+ const onePlus = [{}, { array: [{ prefix: [{ number: true }], rest: { string: true } }] }]
503
+ const vp = validate(onePlus)
504
+ assertEq(vp([])[0], 'error')
505
+ assertEq(vp([1])[0], 'ok')
506
+ assertEq(vp([1, 'a', 'b'])[0], 'ok')
507
+ assertEq(vp([1, 2])[0], 'error')
508
+ const vm = validate(toData(or(tupleNumber, tupleString)))
509
+ assertEq(vm([1])[0], 'ok')
510
+ assertEq(vm(['a'])[0], 'ok')
511
+ assertEq(
512
+ JSON.stringify(vm([true])),
513
+ '["error",{"path":[],"message":"no match"}]')
514
+ },
515
+ objects: () => {
516
+ const v = validate(toData({ a: number, b: option(string) }))
517
+ assertEq(v({ a: 1 })[0], 'ok')
518
+ assertEq(v({ a: 1, b: 's' })[0], 'ok')
519
+ assertEq(v({ a: 1, extra: true })[0], 'ok')
520
+ assertEq(
521
+ JSON.stringify(v({ b: 's' })),
522
+ '["error",{"path":["a"],"message":"unexpected value"}]')
523
+ assertEq(v({ a: 1, b: 1 })[0], 'error')
524
+ const vr = validate(toData(record(number)))
525
+ assertEq(vr({})[0], 'ok')
526
+ assertEq(vr({ p: 1 })[0], 'ok')
527
+ // a key inherited from Object.prototype is still an extra key
528
+ assertEq(vr({ toString: 1 })[0], 'ok')
529
+ assertEq(vr({ toString: 'x' })[0], 'error')
530
+ assertEq(
531
+ JSON.stringify(vr({ p: 'a' })),
532
+ '["error",{"path":["p"],"message":"unexpected value"}]')
533
+ // declared keys are not re-checked against the rest
534
+ /** @type {Data} */
535
+ const structRest = [{}, { object: [{ props: { a: { number: true } }, rest: { string: true } }] }]
536
+ const vs = validate(structRest)
537
+ assertEq(vs({ a: 1, b: 's' })[0], 'ok')
538
+ assertEq(vs({ a: 1, b: 2 })[0], 'error')
539
+ },
540
+ recursion: () => {
541
+ const v = validate(toData(list))
542
+ assertEq(v([])[0], 'ok')
543
+ assertEq(v([[], [[]]])[0], 'ok')
544
+ assertEq(v([[], [1]])[0], 'error')
545
+ const vt = validate(toData(tree))
546
+ assertEq(vt(5)[0], 'ok')
547
+ assertEq(vt([5, [6]])[0], 'ok')
548
+ assertEq(vt('x')[0], 'error')
549
+ const vp = validate(toData({ p: list }))
550
+ assertEq(vp({ p: [] })[0], 'ok')
551
+ assertEq(vp({ p: 0 })[0], 'error')
552
+ // the thunk-direct validator cannot terminate on a pure `or`
553
+ // cycle for a non-matching value; the data form dissolves the
554
+ // cycle to its least fixpoint and answers
555
+ const vs = validate(toData(selfOr))
556
+ assertEq(vs(5)[0], 'ok')
557
+ assertEq(vs('x')[0], 'error')
558
+ },
559
+ throw: {
560
+ // a dangling reference is malformed data — even one naming an
561
+ // `Object.prototype` member, which own-property lookup rejects
562
+ danglingReference: () => validate([{}, 'nope'])(1),
563
+ danglingPrototypeReference: () => validate([{}, 'toString'])(1),
564
+ },
565
+ },
566
+ }