functionalscript 0.45.0 → 0.46.1

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 (296) 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 +10 -0
  4. package/fjs/asn.1/proof.f.mjs +16 -0
  5. package/fjs/basen/base128/module.f.mjs +22 -5
  6. package/fjs/bnf/data/module.f.d.mts +32 -6
  7. package/fjs/bnf/data/module.f.mjs +112 -7
  8. package/fjs/bnf/data/proof.f.d.mts +2 -0
  9. package/fjs/bnf/data/proof.f.mjs +74 -3
  10. package/fjs/bnf/data/types.d.ts +20 -2
  11. package/fjs/bnf/descent/module.f.d.mts +28 -14
  12. package/fjs/bnf/descent/module.f.mjs +122 -77
  13. package/fjs/bnf/descent/proof.f.d.mts +2 -0
  14. package/fjs/bnf/descent/proof.f.mjs +117 -31
  15. package/fjs/bnf/descent/types.d.ts +12 -14
  16. package/fjs/bnf/ll1/module.f.d.mts +64 -22
  17. package/fjs/bnf/ll1/module.f.mjs +214 -154
  18. package/fjs/bnf/ll1/proof.f.d.mts +15 -2
  19. package/fjs/bnf/ll1/proof.f.mjs +323 -149
  20. package/fjs/bnf/ll1/types.d.ts +16 -24
  21. package/fjs/bnf/matcher/module.f.d.mts +66 -0
  22. package/fjs/bnf/matcher/module.f.mjs +81 -0
  23. package/fjs/bnf/matcher/proof.f.d.mts +10 -0
  24. package/fjs/bnf/matcher/proof.f.mjs +79 -0
  25. package/fjs/bnf/matcher/types.d.ts +54 -0
  26. package/fjs/bnf/testlib.f.d.mts +31 -0
  27. package/fjs/bnf/testlib.f.mjs +80 -0
  28. package/fjs/cas/cli/module.f.d.mts +1 -1
  29. package/fjs/cas/cli/module.f.mjs +14 -20
  30. package/fjs/cas/cli/proof.f.d.mts +1 -3
  31. package/fjs/cas/cli/proof.f.mjs +44 -33
  32. package/fjs/cas/evo/module.f.d.mts +64 -18
  33. package/fjs/cas/evo/module.f.mjs +148 -70
  34. package/fjs/cas/evo/proof.f.d.mts +10 -1
  35. package/fjs/cas/evo/proof.f.mjs +305 -223
  36. package/fjs/cas/evo/types.d.ts +45 -9
  37. package/fjs/cas/module.f.d.mts +18 -32
  38. package/fjs/cas/module.f.mjs +129 -128
  39. package/fjs/cas/proof.f.d.mts +11 -8
  40. package/fjs/cas/proof.f.mjs +259 -147
  41. package/fjs/cas/types.d.ts +24 -10
  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/module.f.d.mts +5 -5
  45. package/fjs/ci/module.f.mjs +8 -7
  46. package/fjs/ci/nix/module.f.d.mts +7 -5
  47. package/fjs/ci/nix/module.f.mjs +13 -12
  48. package/fjs/ci/nix/proof.f.mjs +2 -2
  49. package/fjs/ci/proof.f.mjs +9 -5
  50. package/fjs/cli/module.f.d.mts +4 -6
  51. package/fjs/cli/module.f.mjs +4 -8
  52. package/fjs/cli/proof.f.mjs +17 -16
  53. package/fjs/cli/types.d.ts +2 -3
  54. package/fjs/common/monoid/types.d.ts +1 -1
  55. package/fjs/crypto/hmac/module.f.mjs +2 -2
  56. package/fjs/crypto/sha2/module.f.mjs +3 -1
  57. package/fjs/crypto/sha2/proof.f.d.mts +1 -0
  58. package/fjs/crypto/sha2/proof.f.mjs +24 -0
  59. package/fjs/crypto/sha2/types.d.ts +11 -0
  60. package/fjs/crypto/sign/module.f.mjs +2 -2
  61. package/fjs/dev/module.f.d.mts +13 -4
  62. package/fjs/dev/module.f.mjs +56 -27
  63. package/fjs/dev/update/module.f.d.mts +9 -4
  64. package/fjs/dev/update/module.f.mjs +14 -10
  65. package/fjs/dev/update/proof.f.d.mts +1 -3
  66. package/fjs/dev/update/proof.f.mjs +10 -5
  67. package/fjs/djs/module.f.d.mts +13 -5
  68. package/fjs/djs/module.f.mjs +31 -16
  69. package/fjs/djs/parser/module.f.d.mts +13 -3
  70. package/fjs/djs/parser/module.f.mjs +117 -16
  71. package/fjs/djs/parser/proof.f.d.mts +5 -1
  72. package/fjs/djs/parser/proof.f.mjs +274 -12
  73. package/fjs/djs/parser/types.d.ts +7 -1
  74. package/fjs/djs/proof.f.d.mts +18 -2
  75. package/fjs/djs/proof.f.mjs +187 -12
  76. package/fjs/djs/serializer/module.f.d.mts +25 -8
  77. package/fjs/djs/serializer/module.f.mjs +61 -15
  78. package/fjs/djs/serializer/proof.f.d.mts +5 -0
  79. package/fjs/djs/serializer/proof.f.mjs +23 -1
  80. package/fjs/djs/tokenizer/module.f.d.mts +17 -5
  81. package/fjs/djs/tokenizer/module.f.mjs +99 -60
  82. package/fjs/djs/tokenizer/proof.f.d.mts +1 -1
  83. package/fjs/djs/tokenizer/proof.f.mjs +74 -67
  84. package/fjs/djs/transpiler/module.f.d.mts +12 -7
  85. package/fjs/djs/transpiler/module.f.mjs +82 -56
  86. package/fjs/djs/transpiler/types.d.ts +7 -3
  87. package/fjs/djs/types.d.ts +7 -1
  88. package/fjs/effects/list/module.f.d.mts +14 -11
  89. package/fjs/effects/list/module.f.mjs +13 -11
  90. package/fjs/effects/list/types.d.ts +27 -7
  91. package/fjs/effects/memory/module.f.d.mts +2 -1
  92. package/fjs/effects/memory/module.f.mjs +3 -4
  93. package/fjs/effects/memory/proof.f.mjs +13 -7
  94. package/fjs/effects/memory/types.d.ts +4 -3
  95. package/fjs/effects/mock/module.f.d.mts +20 -4
  96. package/fjs/effects/mock/module.f.mjs +37 -5
  97. package/fjs/effects/mock/types.d.ts +10 -1
  98. package/fjs/effects/module.d.mts +4 -2
  99. package/fjs/effects/module.f.d.mts +466 -280
  100. package/fjs/effects/module.f.mjs +537 -299
  101. package/fjs/effects/module.mjs +2 -1
  102. package/fjs/effects/node/memory/module.d.mts +4 -2
  103. package/fjs/effects/node/memory/module.mjs +6 -3
  104. package/fjs/effects/node/memory/proof.mjs +10 -4
  105. package/fjs/effects/node/module.d.mts +4 -3
  106. package/fjs/effects/node/module.f.d.mts +168 -33
  107. package/fjs/effects/node/module.f.mjs +256 -52
  108. package/fjs/effects/node/module.mjs +57 -34
  109. package/fjs/effects/node/proof.f.d.mts +28 -2
  110. package/fjs/effects/node/proof.f.mjs +161 -42
  111. package/fjs/effects/node/types.d.ts +106 -18
  112. package/fjs/effects/node/virtual/module.f.d.mts +18 -4
  113. package/fjs/effects/node/virtual/module.f.mjs +110 -68
  114. package/fjs/effects/node/virtual/proof.f.d.mts +28 -2
  115. package/fjs/effects/node/virtual/proof.f.mjs +190 -9
  116. package/fjs/effects/proof.f.d.mts +69 -37
  117. package/fjs/effects/proof.f.mjs +410 -130
  118. package/fjs/effects/types.d.ts +161 -33
  119. package/fjs/emergent_testing/module.f.d.mts +19 -12
  120. package/fjs/emergent_testing/module.f.mjs +93 -33
  121. package/fjs/emergent_testing/proof.f.d.mts +21 -7
  122. package/fjs/emergent_testing/proof.f.mjs +166 -32
  123. package/fjs/emergent_testing/types.d.ts +22 -4
  124. package/fjs/fsm/module.f.d.mts +14 -4
  125. package/fjs/fsm/module.f.mjs +54 -37
  126. package/fjs/fsm/proof.f.d.mts +2 -0
  127. package/fjs/fsm/proof.f.mjs +83 -114
  128. package/fjs/js/keywords/module.f.d.mts +52 -0
  129. package/fjs/js/keywords/module.f.mjs +72 -0
  130. package/fjs/js/keywords/proof.f.d.mts +3 -0
  131. package/fjs/js/keywords/proof.f.mjs +13 -0
  132. package/fjs/js/tokenizer/module.f.d.mts +26 -6
  133. package/fjs/js/tokenizer/module.f.mjs +145 -159
  134. package/fjs/js/tokenizer/proof.f.d.mts +1 -0
  135. package/fjs/js/tokenizer/proof.f.mjs +54 -24
  136. package/fjs/js/tokenizer/types.d.ts +33 -24
  137. package/fjs/mcp/cas/module.f.d.mts +1 -6
  138. package/fjs/mcp/cas/module.f.mjs +55 -51
  139. package/fjs/mcp/cas/proof.f.d.mts +15 -0
  140. package/fjs/mcp/cas/proof.f.mjs +174 -0
  141. package/fjs/mcp/evo/module.f.d.mts +19 -10
  142. package/fjs/mcp/evo/module.f.mjs +48 -27
  143. package/fjs/mcp/evo/proof.f.d.mts +6 -1
  144. package/fjs/mcp/evo/proof.f.mjs +115 -31
  145. package/fjs/mcp/module.f.d.mts +4 -4
  146. package/fjs/mcp/module.f.mjs +6 -6
  147. package/fjs/mcp/proof.f.d.mts +5 -3
  148. package/fjs/mcp/proof.f.mjs +112 -46
  149. package/fjs/media/html/module.f.mjs +1 -1
  150. package/fjs/media/json/extended/module.f.d.mts +82 -0
  151. package/fjs/media/json/extended/module.f.mjs +153 -0
  152. package/fjs/media/json/extended/proof.f.d.mts +42 -0
  153. package/fjs/media/json/extended/proof.f.mjs +127 -0
  154. package/fjs/media/json/extended/types.d.ts +23 -0
  155. package/fjs/media/json/module.f.d.mts +8 -2
  156. package/fjs/media/json/module.f.mjs +43 -41
  157. package/fjs/media/json/number/module.f.d.mts +59 -0
  158. package/fjs/media/json/number/module.f.mjs +136 -0
  159. package/fjs/media/json/number/proof.f.d.mts +24 -0
  160. package/fjs/media/json/number/proof.f.mjs +86 -0
  161. package/fjs/media/json/number/types.d.ts +28 -0
  162. package/fjs/media/json/parser/module.f.d.mts +25 -13
  163. package/fjs/media/json/parser/module.f.mjs +114 -70
  164. package/fjs/media/json/parser/proof.f.d.mts +5 -0
  165. package/fjs/media/json/parser/proof.f.mjs +31 -1
  166. package/fjs/media/json/parser/types.d.ts +33 -14
  167. package/fjs/media/json/rtti/module.f.d.mts +1 -1
  168. package/fjs/media/json/rtti/module.f.mjs +1 -1
  169. package/fjs/media/json/rtti/proof.f.mjs +9 -9
  170. package/fjs/media/json/schema/module.f.mjs +3 -13
  171. package/fjs/media/json/schema/proof.f.d.mts +0 -1
  172. package/fjs/media/json/schema/proof.f.mjs +1 -2
  173. package/fjs/media/json/serializer/module.f.d.mts +32 -1
  174. package/fjs/media/json/serializer/module.f.mjs +64 -2
  175. package/fjs/media/json/tokenizer/module.f.mjs +7 -3
  176. package/fjs/media/json/tokenizer/proof.f.d.mts +6 -0
  177. package/fjs/media/json/tokenizer/proof.f.mjs +62 -21
  178. package/fjs/media/json/types.d.ts +36 -10
  179. package/fjs/media/lock/module.f.d.mts +100 -0
  180. package/fjs/media/lock/module.f.mjs +125 -0
  181. package/fjs/media/lock/proof.f.d.mts +33 -0
  182. package/fjs/media/lock/proof.f.mjs +196 -0
  183. package/fjs/media/lock/types.d.ts +15 -0
  184. package/fjs/media/module.f.d.mts +6 -5
  185. package/fjs/media/module.f.mjs +8 -7
  186. package/fjs/media/note/module.f.d.mts +121 -0
  187. package/fjs/media/note/module.f.mjs +131 -0
  188. package/fjs/media/note/proof.f.d.mts +29 -0
  189. package/fjs/media/note/proof.f.mjs +150 -0
  190. package/fjs/media/note/types.d.ts +10 -0
  191. package/fjs/media/proof.f.d.mts +4 -1
  192. package/fjs/media/proof.f.mjs +40 -21
  193. package/fjs/media/revision/module.f.d.mts +78 -7
  194. package/fjs/media/revision/module.f.mjs +119 -12
  195. package/fjs/media/revision/proof.f.d.mts +10 -0
  196. package/fjs/media/revision/proof.f.mjs +88 -0
  197. package/fjs/media/revision/types.d.ts +34 -5
  198. package/fjs/media/type/module.f.d.mts +33 -15
  199. package/fjs/media/type/module.f.mjs +35 -29
  200. package/fjs/media/type/proof.f.d.mts +2 -1
  201. package/fjs/media/type/proof.f.mjs +30 -10
  202. package/fjs/module.f.mjs +29 -8
  203. package/fjs/nanvm/proof.f.mjs +3 -3
  204. package/fjs/nanvm/rust/module.f.mjs +1 -1
  205. package/fjs/nanvm/update/module.f.d.mts +4 -4
  206. package/fjs/nanvm/update/module.f.mjs +8 -9
  207. package/fjs/nanvm/update/proof.f.mjs +4 -3
  208. package/fjs/proof.f.d.mts +3 -3
  209. package/fjs/proof.f.mjs +36 -10
  210. package/fjs/protocol/json_rpc/module.f.d.mts +2 -2
  211. package/fjs/protocol/json_rpc/module.f.mjs +3 -3
  212. package/fjs/protocol/json_rpc/proof.f.mjs +4 -4
  213. package/fjs/protocol/mcp/module.f.d.mts +10 -13
  214. package/fjs/protocol/mcp/module.f.mjs +74 -58
  215. package/fjs/protocol/mcp/proof.f.d.mts +13 -4
  216. package/fjs/protocol/mcp/proof.f.mjs +193 -61
  217. package/fjs/protocol/mcp/stdio/module.f.d.mts +15 -7
  218. package/fjs/protocol/mcp/stdio/module.f.mjs +38 -25
  219. package/fjs/protocol/mcp/stdio/proof.f.d.mts +4 -2
  220. package/fjs/protocol/mcp/stdio/proof.f.mjs +45 -12
  221. package/fjs/protocol/mcp/stdio/types.d.ts +1 -1
  222. package/fjs/protocol/mcp/types.d.ts +17 -6
  223. package/fjs/sul/id/module.f.d.mts +0 -1
  224. package/fjs/sul/id/module.f.mjs +2 -3
  225. package/fjs/sul/level/hash/module.f.mjs +2 -1
  226. package/fjs/sul/level/hash/proof.f.mjs +2 -2
  227. package/fjs/sul/module.f.mjs +18 -13
  228. package/fjs/text/code_point/module.f.d.mts +8 -0
  229. package/fjs/text/code_point/module.f.mjs +8 -1
  230. package/fjs/text/code_point/proof.f.d.mts +1 -0
  231. package/fjs/text/code_point/proof.f.mjs +11 -0
  232. package/fjs/text/sgr/module.f.d.mts +4 -6
  233. package/fjs/text/sgr/module.f.mjs +6 -7
  234. package/fjs/text/utf16/module.f.mjs +7 -2
  235. package/fjs/text/utf16/proof.f.mjs +3 -3
  236. package/fjs/text/utf8/module.f.mjs +4 -2
  237. package/fjs/types/array/module.f.mjs +14 -2
  238. package/fjs/types/bit_vec/module.f.d.mts +0 -2
  239. package/fjs/types/bit_vec/module.f.mjs +46 -32
  240. package/fjs/types/bit_vec/proof.f.mjs +2 -2
  241. package/fjs/types/btree/remove/module.f.mjs +1 -1
  242. package/fjs/types/btree/set/module.f.mjs +9 -11
  243. package/fjs/types/btree/set/proof.f.mjs +12 -0
  244. package/fjs/types/byte_set/module.f.d.mts +11 -4
  245. package/fjs/types/byte_set/module.f.mjs +14 -6
  246. package/fjs/types/byte_set/proof.f.mjs +7 -7
  247. package/fjs/types/function/compare/module.f.mjs +10 -3
  248. package/fjs/types/list/module.f.d.mts +1 -1
  249. package/fjs/types/list/module.f.mjs +1 -1
  250. package/fjs/types/nullable/module.f.d.mts +18 -4
  251. package/fjs/types/nullable/module.f.mjs +21 -4
  252. package/fjs/types/nullable/proof.f.d.mts +4 -0
  253. package/fjs/types/nullable/proof.f.mjs +15 -0
  254. package/fjs/types/object/module.f.d.mts +12 -2
  255. package/fjs/types/object/module.f.mjs +11 -1
  256. package/fjs/types/patricia_trie/module.f.mjs +26 -11
  257. package/fjs/types/result/module.f.d.mts +3 -3
  258. package/fjs/types/result/module.f.mjs +3 -3
  259. package/fjs/types/rtti/common/module.f.d.mts +25 -28
  260. package/fjs/types/rtti/common/module.f.mjs +36 -32
  261. package/fjs/types/rtti/common/proof.f.mjs +5 -5
  262. package/fjs/types/rtti/data/module.f.d.mts +14 -0
  263. package/fjs/types/rtti/data/module.f.mjs +25 -2
  264. package/fjs/types/rtti/data/proof.f.d.mts +1 -0
  265. package/fjs/types/rtti/data/proof.f.mjs +25 -2
  266. package/fjs/types/rtti/parse/module.f.d.mts +24 -14
  267. package/fjs/types/rtti/parse/module.f.mjs +37 -28
  268. package/fjs/types/rtti/parse/proof.f.d.mts +3 -2
  269. package/fjs/types/rtti/parse/proof.f.mjs +33 -14
  270. package/fjs/types/rtti/proof.f.mjs +3 -1
  271. package/fjs/types/rtti/ts/module.f.mjs +13 -17
  272. package/fjs/types/rtti/ts/types.d.ts +14 -1
  273. package/fjs/types/rtti/validate/module.f.d.mts +81 -19
  274. package/fjs/types/rtti/validate/module.f.mjs +107 -61
  275. package/fjs/types/rtti/validate/proof.f.d.mts +13 -10
  276. package/fjs/types/rtti/validate/proof.f.mjs +186 -197
  277. package/fjs/types/sorted_set/module.f.d.mts +18 -0
  278. package/fjs/types/sorted_set/module.f.mjs +22 -0
  279. package/fjs/types/sorted_set/proof.f.d.mts +1 -0
  280. package/fjs/types/sorted_set/proof.f.mjs +16 -1
  281. package/fjs/types/uint8array/module.f.d.mts +1 -1
  282. package/fjs/types/uint8array/module.f.mjs +1 -1
  283. package/fjs/website/module.f.d.mts +3 -3
  284. package/fjs/website/module.f.mjs +4 -7
  285. package/fjs/website/proof.f.mjs +2 -1
  286. package/package.json +2 -2
  287. package/fjs/dev/package_json/module.f.d.mts +0 -39
  288. package/fjs/dev/package_json/module.f.mjs +0 -40
  289. package/fjs/dev/package_json/proof.f.d.mts +0 -6
  290. package/fjs/dev/package_json/proof.f.mjs +0 -32
  291. package/fjs/effects/eff/module.f.d.mts +0 -20
  292. package/fjs/effects/eff/module.f.mjs +0 -70
  293. package/fjs/effects/eff/proof.f.d.mts +0 -15
  294. package/fjs/effects/eff/proof.f.mjs +0 -69
  295. package/fjs/effects/eff/types.d.ts +0 -71
  296. package/fjs/types/rtti/validate/types.d.ts +0 -6
@@ -5,6 +5,7 @@
5
5
  * @module
6
6
  *
7
7
  * @import { Effect, Operation, ToAsyncOperationMap } from './types.ts'
8
+ * @import { Result } from '../types/result/types.ts'
8
9
  */
9
10
 
10
11
  import { match } from './module.f.mjs'
@@ -12,7 +13,7 @@ import { match } from './module.f.mjs'
12
13
  /**
13
14
  * @template {Operation} O
14
15
  * @param {ToAsyncOperationMap<O>} map
15
- * @returns {<T>(effect: Effect<O, T>) => Promise<T>}
16
+ * @returns {<T, E>(effect: Effect<O, T, E>) => Promise<Result<T, E>>}
16
17
  */
17
18
  export const asyncRun = map => async effect => {
18
19
  const next = match(map)
@@ -4,9 +4,11 @@
4
4
  * @module
5
5
  *
6
6
  * @import { Effect, ToAsyncOperationMap } from '../../types.ts'
7
+ * @import { Result } from '../../../types/result/types.ts'
7
8
  * @import { Key, MemOp } from '../../memory/types.ts'
8
9
  */
9
10
  import type { Effect, ToAsyncOperationMap } from '../../types.ts';
11
+ import type { Result } from '../../../types/result/types.ts';
10
12
  import type { MemOp } from '../../memory/types.ts';
11
13
  export type MemoryOperationMap = ToAsyncOperationMap<MemOp>;
12
14
  export type Uuid = () => string;
@@ -22,6 +24,6 @@ export type Uuid = () => string;
22
24
  export declare const memoryOperationMap: (uuid?: Uuid) => MemoryOperationMap;
23
25
  /**
24
26
  * Runs a memory-only effect using a fresh memory store.
25
- * @type {<T>(effect: Effect<MemOp, T>) => Promise<T>}
27
+ * @type {<T, E>(effect: Effect<MemOp, T, E>) => Promise<Result<T, E>>}
26
28
  */
27
- export declare const run: <T>(effect: Effect<MemOp, T>) => Promise<T>;
29
+ export declare const run: <T, E>(effect: Effect<MemOp, T, E>) => Promise<Result<T, E>>;
@@ -4,11 +4,13 @@
4
4
  * @module
5
5
  *
6
6
  * @import { Effect, ToAsyncOperationMap } from '../../types.ts'
7
+ * @import { Result } from '../../../types/result/types.ts'
7
8
  * @import { Key, MemOp } from '../../memory/types.ts'
8
9
  */
9
10
 
10
11
  import { randomUUID } from 'node:crypto'
11
12
  import { asyncRun } from '../../module.mjs'
13
+ import { ok } from '../../../types/result/module.f.mjs'
12
14
  import { asBase, asNominal } from '../../memory/module.f.mjs'
13
15
 
14
16
  /** @typedef {ToAsyncOperationMap<MemOp>} MemoryOperationMap */
@@ -37,24 +39,25 @@ export const memoryOperationMap = (uuid = randomUUID) => {
37
39
  /** @type {Key<unknown>} */
38
40
  const key = asNominal(id)
39
41
  store.set(id, value)
40
- return key
42
+ return ok(key)
41
43
  },
42
44
  memRead: async key => {
43
45
  const id = asBase(key)
44
46
  if (!store.has(id)) { throw missingKey(id) }
45
- return store.get(id)
47
+ return ok(store.get(id))
46
48
  },
47
49
  memWrite: async (key, value) => {
48
50
  const id = asBase(key)
49
51
  if (!store.has(id)) { throw missingKey(id) }
50
52
  store.set(id, value)
53
+ return ok(undefined)
51
54
  },
52
55
  }
53
56
  }
54
57
 
55
58
  /**
56
59
  * Runs a memory-only effect using a fresh memory store.
57
- * @type {<T>(effect: Effect<MemOp, T>) => Promise<T>}
60
+ * @type {<T, E>(effect: Effect<MemOp, T, E>) => Promise<Result<T, E>>}
58
61
  */
59
62
  export const run = effect =>
60
63
  asyncRun(/** @type {ToAsyncOperationMap<MemOp>} */ (memoryOperationMap()))(effect)
@@ -7,13 +7,15 @@
7
7
  */
8
8
 
9
9
  import { asyncRun } from '../../module.mjs'
10
+ import { errorSummary } from '../module.f.mjs'
10
11
  import {
11
12
  asNominal,
12
13
  create, read, write,
13
14
  } from '../../memory/module.f.mjs'
14
15
  import { memoryOperationMap, run } from './module.mjs'
15
16
  import { assert, assertEq } from '../../../asserts/module.f.mjs'
16
- import { step } from '../../module.f.mjs'
17
+ import { unwrap } from "../../../types/result/module.f.mjs"
18
+ import { step, unwrapStep } from '../../module.f.mjs'
17
19
 
18
20
  export const proof = {
19
21
  nodeInterpreter: async () => {
@@ -22,13 +24,17 @@ export const proof = {
22
24
  key => step(
23
25
  write(key, 2),
24
26
  () => read(key)))
25
- assertEq(await run(x), 2)
27
+ const r = await run(x)
28
+ assert(r[0] === 'ok', r)
29
+ assertEq(r[1], 2)
26
30
  },
27
31
  reusedOperationMapPersists: async () => {
28
32
  const runner = asyncRun(/** @type {import('../../types.ts').ToAsyncOperationMap<MemOp>} */ (memoryOperationMap()))
29
- const key = await runner(create(1))
33
+ // `unwrapStep` empties the channel, so what the runner hands back is
34
+ // an `ok` and these unwraps are total.
35
+ const key = unwrap(await runner(unwrapStep(create(1), errorSummary)))
30
36
  await runner(write(key, 2))
31
- const result = await runner(read(key))
37
+ const result = unwrap(await runner(unwrapStep(read(key), errorSummary)))
32
38
  assertEq(result, 2)
33
39
  },
34
40
  missingKeyThrows: async () => {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Node.js effect runner: interprets `Effect<NodeOp, T>` directly against the
2
+ * Node.js effect runner: interprets `Effect<NodeOp, T, E>` directly against the
3
3
  * Node globals and built-in modules (`fs`, `http`, `child_process`, `process`,
4
4
  * `fetch`, …).
5
5
  *
@@ -13,12 +13,13 @@
13
13
  * @module
14
14
  *
15
15
  * @import { Effect } from '../types.ts'
16
- * @import { Server as EffectServer, Headers, Module, NodeOp, RequestListener as Erl, NodeProgram, NodeProgramOptions, WriteConsoles, TestContext, TestFn, } from './types.ts'
16
+ * @import { IoResult, Server as EffectServer, Headers, Module, NodeOp, RequestListener as Erl, NodeProgram, NodeProgramOptions, WriteConsoles, TestContext, TestFn, } from './types.ts'
17
17
  * @import { Result } from '../../types/result/types.ts'
18
18
  * @import { StringMap } from '../../types/object/types.ts'
19
19
  */
20
20
  import type { Effect } from '../types.ts';
21
21
  import type { Headers, NodeOp, NodeProgram } from './types.ts';
22
+ import type { Result } from '../../types/result/types.ts';
22
23
  import type { StringMap } from '../../types/object/types.ts';
23
24
  export type _Server = {
24
25
  readonly listen: (port: number) => void;
@@ -34,7 +35,7 @@ export type _ServerResponse = {
34
35
  readonly end: (body: Uint8Array) => void;
35
36
  };
36
37
  export type _RequestListener = (req: _IncomingMessage, res: _ServerResponse) => Promise<void>;
37
- export type _EffectToPromise = <T>(effect: Effect<NodeOp, T>) => Promise<T>;
38
+ export type _EffectToPromise = <T, E>(effect: Effect<NodeOp, T, E>) => Promise<Result<T, E>>;
38
39
  export type _FrameworkRegister = (name: string, fn: () => Promise<void>) => Promise<void>;
39
40
  /**
40
41
  * Runs a `NodeProgram` against the real Node globals and process arguments,
@@ -11,37 +11,99 @@
11
11
  * @module
12
12
  *
13
13
  * @import { Vec } from '../../types/bit_vec/types.ts'
14
- * @import { Effect, Func, Operation } from '../types.ts'
14
+ * @import { Result } from '../../types/result/types.ts'
15
+ * @import { Commands, CommandSet, Effect, Func, NotImplemented, Operation } from '../types.ts'
15
16
  * @import { List } from '../list/types.ts'
16
- * @import { All, Access, Await, Console, CreateExclusive, CreateServer, Dirent, Engine, Env, Exec, ExecResult, Fetch, FileStat, Forever, Fs, Headers, Http, IncomingMessage, Import, IoResult, Listen, MakeDirectoryOptions, Mkdir, Module, Now, NodeOp, NodeProgramOptions, RandomInt, Read, ReadBytes, ReadConsoles, ReadFile, Readdir, ReaddirOptions, RequestListener, Rename, Rm, Sandbox, SandboxResult, Server, ServerResponse, Stat, Test, TestContext, TestFn, Write, WriteBytes, WriteConsoles, WriteFile, _UtfList, _WriteLoop, } from './types.ts'
17
+ * @import { All, Access, Await, Console, CreateExclusive, CreateServer, Dirent, Engine, Env, Exec, ExecResult, Fetch, FileStat, Forever, Fs, Headers, Http, IncomingMessage, Import, IoChannel, IoError, IoErrorInfo, Listen, MakeDirectoryOptions, Mkdir, Module, Now, NodeOp, NodeProgramOptions, RandomInt, Read, ReadBytes, ReadConsoles, ReadFile, Readdir, ReaddirOptions, RequestListener, Rename, Rm, Sandbox, SandboxResult, Server, ServerResponse, Stat, Test, TestContext, TestFn, Write, WriteBytes, WriteConsoles, WriteFile, _UtfList, _WriteLoop } from './types.ts'
17
18
  */
18
19
  import type { Vec } from '../../types/bit_vec/types.ts';
19
- import type { Effect, Func, Operation } from '../types.ts';
20
+ import type { Result } from '../../types/result/types.ts';
21
+ import type { Commands, Effect, Func, NotImplemented, Operation } from '../types.ts';
20
22
  import type { List } from '../list/types.ts';
21
- import type { All, Access, Await, Console, CreateExclusive, CreateServer, Engine, Exec, Fetch, Forever, Import, IoResult, Listen, Mkdir, Now, RandomInt, Read, ReadBytes, ReadConsoles, ReadFile, Readdir, RequestListener, Rename, Rm, Sandbox, Server, Stat, Test, Write, WriteBytes, WriteFile } from './types.ts';
23
+ import type { All, Access, Await, Console, CreateExclusive, CreateServer, Engine, Exec, Fetch, Forever, Import, IoChannel, IoError, IoErrorInfo, Listen, Mkdir, Now, NodeOp, RandomInt, Read, ReadBytes, ReadConsoles, ReadFile, Readdir, RequestListener, Rename, Rm, Sandbox, Server, Stat, Test, Write, WriteBytes, WriteFile } from './types.ts';
24
+ /**
25
+ * Builds a normalized host error. The constructor exists so the shape is
26
+ * written once: every runner reports its failures through it, and a consumer
27
+ * matching on `'ioError'` knows what the payload holds.
28
+ *
29
+ * @type {(info: IoErrorInfo) => IoError}
30
+ */
31
+ export declare const ioError: (info: IoErrorInfo) => IoError;
32
+ /**
33
+ * Normalizes a **thrown** value into an {@link IoError}: the OS error code when
34
+ * the host attached a string one, and a message that is the `Error`'s own or
35
+ * the value's string form.
36
+ *
37
+ * This is the boundary where an impure runner's `catch` becomes ordinary effect
38
+ * data. Nothing past it sees the thrown object, which is the point — a stack, a
39
+ * `cause`, and arbitrary own properties do not survive a wire hop, and a
40
+ * program that branched on them would be reading the host's implementation
41
+ * rather than the operation's contract.
42
+ *
43
+ * @type {(e: unknown) => IoError}
44
+ */
45
+ export declare const toIoError: (e: unknown) => IoError;
22
46
  /**
23
47
  * True if `e` is a "file or directory does not exist" (`ENOENT`) error.
24
48
  *
25
- * Node's filesystem rejections are `Error`s carrying `code: 'ENOENT'`; the
26
- * virtual interpreter mirrors that shape for absent paths. Lets callers swallow
27
- * only the missing-path case (e.g. a fresh store) while propagating genuine
28
- * failures (permissions, corruption) rather than masking them.
49
+ * Node's filesystem rejections are `Error`s carrying `code: 'ENOENT'`, which
50
+ * {@link toIoError} keeps; the virtual interpreter reports the same code for
51
+ * absent paths. Lets callers swallow only the missing-path case (e.g. a fresh
52
+ * store) while propagating genuine failures (permissions, corruption) rather
53
+ * than masking them.
54
+ *
55
+ * A {@link NotImplemented} is never "not found": a runner that cannot perform
56
+ * the operation has not looked for the path at all, so the two must not
57
+ * collapse into one benign branch — which is exactly what a bare `unknown`
58
+ * error channel used to allow.
59
+ *
60
+ * @type {(e: IoChannel) => boolean}
61
+ */
62
+ export declare const isNotFound: (e: IoChannel) => boolean;
63
+ /**
64
+ * The commands of {@link nodeCommandSet}, in the form a partial runner tests
65
+ * membership against. The cast is the one `Object.keys` always needs: it
66
+ * answers `string[]` for a record whose keys the type system knows exactly.
29
67
  *
30
- * @type {(e: unknown) => boolean}
68
+ * @type {Commands<NodeOp>}
31
69
  */
32
- export declare const isNotFound: (e: unknown) => boolean;
70
+ export declare const nodeCommands: Commands<NodeOp>;
33
71
  /**
34
72
  * To run the operation `O` should be known by the runner/engine.
35
- * This is the reason why we merge `O` with `All` in the resulted `Effect`.
73
+ * This is the reason why we merge `O` with `All` in the resulting effect.
36
74
  */
37
- export declare const all: <O extends Operation, T>(...a: readonly Effect<O, T>[]) => Effect<O | All, readonly T[]>;
75
+ export declare const all: <O extends Operation, T, E>(...a: readonly Effect<O, T, E>[]) => Effect<O | All, readonly Result<T, E>[], NotImplemented>;
76
+ /**
77
+ * {@link all} in the `ok` channel: collects the values when every effect
78
+ * succeeded, and answers with the first failure otherwise.
79
+ *
80
+ * `all` alone cannot serve a fallible chain. Its envelope is the runner's
81
+ * (`OpResult`, saying whether the *operation* could be dispatched), so handing
82
+ * it `Effect`s nests one `Result` inside another and the caller receives
83
+ * `readonly Result<T, E>[]`. That has to be collapsed before the chain can
84
+ * `step` again, and a continuation that forgets to is the value-discarding
85
+ * hazard this migration exists to remove — one level in, where it is harder to
86
+ * see.
87
+ *
88
+ * **Every effect still runs.** The short-circuit is in the *result*, not in the
89
+ * execution: `all` performs them concurrently and this reads the answers once
90
+ * they are all in, so a failure does not cancel its siblings the way it stops
91
+ * the sequential `forEachStep` in `./module.f.mjs`. The error channel
92
+ * unions the runner's
93
+ * `NotImplemented` with the effects' own `E` for the same reason every other
94
+ * step does — either can be what went wrong.
95
+ *
96
+ * @type {<O extends Operation, T, E>(...a: readonly Effect<O, T, E>[]) => Effect<O | All, readonly T[], NotImplemented | E>}
97
+ */
98
+ export declare const allOk: <O extends Operation, T, E>(...a: readonly Effect<O, T, E>[]) => Effect<O | All, readonly T[], NotImplemented | E>;
38
99
  /**
39
100
  * @template {Operation} O0
40
101
  * @template T0
41
- * @param {Effect<O0, T0>} a
42
- * @returns {<O1 extends Operation, T1>(b: Effect<O1, T1>) => Effect<O0 | O1 | All, readonly[T0, T1]>}
102
+ * @template E0
103
+ * @param {Effect<O0, T0, E0>} a
104
+ * @returns {<O1 extends Operation, T1, E1>(b: Effect<O1, T1, E1>) => Effect<O0 | O1 | All, readonly[Result<T0, E0>, Result<T1, E1>], NotImplemented>}
43
105
  */
44
- export declare const both: <O0 extends Operation, T0>(a: Effect<O0, T0>) => <O1 extends Operation, T1>(b: Effect<O1, T1>) => Effect<O0 | O1 | All, readonly [T0, T1]>;
106
+ export declare const both: <O0 extends Operation, T0, E0>(a: Effect<O0, T0, E0>) => <O1 extends Operation, T1, E1>(b: Effect<O1, T1, E1>) => Effect<O0 | O1 | All, readonly [Result<T0, E0>, Result<T1, E1>], NotImplemented>;
45
107
  /** @type {Func<Fetch>} */
46
108
  export declare const fetch: Func<Fetch>;
47
109
  /** @type {Func<Mkdir>} */
@@ -51,13 +113,13 @@ export declare const readFile: Func<ReadFile>;
51
113
  /**
52
114
  * Reads a file as UTF-8 text.
53
115
  *
54
- * Preserves the `IoResult` instead of unwrapping so callers can pattern-match
55
- * on errors (e.g. convert them into domain-specific errors) or `unwrap` at the
56
- * call site.
116
+ * Preserves the error channel instead of unwrapping so callers can
117
+ * pattern-match on it (e.g. convert a failure into a domain-specific error) or
118
+ * `unwrap` at the call site.
57
119
  *
58
- * @type {(path: string) => Effect<ReadFile, IoResult<string>>}
120
+ * @type {(path: string) => Effect<ReadFile, string, IoChannel>}
59
121
  */
60
- export declare const readUtf8File: (path: string) => Effect<ReadFile, IoResult<string>>;
122
+ export declare const readUtf8File: (path: string) => Effect<ReadFile, string, IoChannel>;
61
123
  /** @type {Func<Readdir>} */
62
124
  export declare const readdir: Func<Readdir>;
63
125
  /** @type {Func<WriteFile>} */
@@ -65,9 +127,9 @@ export declare const writeFile: Func<WriteFile>;
65
127
  /**
66
128
  * Writes a string to `path` as UTF-8 bytes.
67
129
  *
68
- * @type {(path: string, content: string) => Effect<WriteFile, IoResult<void>>}
130
+ * @type {(path: string, content: string) => Effect<WriteFile, void, IoChannel>}
69
131
  */
70
- export declare const writeUtf8File: (path: string, content: string) => Effect<WriteFile, IoResult<void>>;
132
+ export declare const writeUtf8File: (path: string, content: string) => Effect<WriteFile, void, IoChannel>;
71
133
  /** @type {Func<Rm>} */
72
134
  export declare const rm: Func<Rm>;
73
135
  /** @type {Func<Rename>} */
@@ -87,10 +149,10 @@ export declare const writeBytes: Func<WriteBytes>;
87
149
  /**
88
150
  * @template {Operation} O
89
151
  * @param {string} path
90
- * @param {List<O, IoResult<Vec>>} e
91
- * @returns {Effect<O | WriteBytes | CreateExclusive, IoResult<void>>}
152
+ * @param {List<O, Vec, IoChannel>} e
153
+ * @returns {Effect<O | WriteBytes | CreateExclusive, void, IoChannel>}
92
154
  */
93
- export declare const writeFromStream: <O extends Operation>(path: string, e: List<O, IoResult<Vec>>) => Effect<O | WriteBytes | CreateExclusive, IoResult<void>>;
155
+ export declare const writeFromStream: <O extends Operation>(path: string, e: List<O, Vec, IoChannel>) => Effect<O | WriteBytes | CreateExclusive, void, IoChannel>;
94
156
  /** @type {Func<Stat>} */
95
157
  export declare const stat: Func<Stat>;
96
158
  export declare const createServer: <O extends Operation>(listener: RequestListener<O>) => Effect<O | CreateServer, Server>;
@@ -101,12 +163,16 @@ export declare const forever: Func<Forever>;
101
163
  /** @type {Func<Import>} */
102
164
  export declare const import_: Func<Import>;
103
165
  /** Emits a `Write` effect to the given named stream. */
166
+ /** @type {Func<Write>} */
104
167
  export declare const write: Func<Write>;
105
168
  /** Writes a line to `stdout`. Replaces the retired `Log` effect. */
169
+ /** @type {Console} */
106
170
  export declare const log: Console;
107
171
  /** Writes a line to `stderr`. Replaces the retired `Error` effect. */
172
+ /** @type {Console} */
108
173
  export declare const error: Console;
109
174
  /** Emits a `Read` effect, yielding the next input byte or `null` at EOF. */
175
+ /** @type {Func<Read>} */
110
176
  export declare const read: Func<Read>;
111
177
  /**
112
178
  * Reads one line from `stream` as a pure combinator over the byte-level
@@ -122,9 +188,12 @@ export declare const read: Func<Read>;
122
188
  * reversed and decoded once at the terminator, so a large line costs O(n)
123
189
  * rather than the O(n²) of copying a growing array on every byte.
124
190
  *
125
- * @type {(stream: ReadConsoles) => Effect<Read, string | null>}
191
+ * A failed `read` a runner without the operation — propagates: the line is
192
+ * not silently truncated into a `null` that a caller would read as EOF.
193
+ *
194
+ * @type {(stream: ReadConsoles) => Effect<Read, string | null, NotImplemented>}
126
195
  */
127
- export declare const readLine: (stream: ReadConsoles) => Effect<Read, string | null>;
196
+ export declare const readLine: (stream: ReadConsoles) => Effect<Read, string | null, NotImplemented>;
128
197
  /** @type {Func<Now>} */
129
198
  export declare const now: Func<Now>;
130
199
  /**
@@ -148,18 +217,84 @@ export declare const now: Func<Now>;
148
217
  * @type {Func<Sandbox>}
149
218
  */
150
219
  export declare const sandbox: Func<Sandbox>;
151
- /** @type {(p: unknown) => Effect<Await, unknown>} */
152
- export declare const awaitIfPromise: (p: unknown) => Effect<Await, unknown>;
220
+ /** @type {(p: unknown) => Effect<Await, unknown, NotImplemented>} */
221
+ export declare const awaitIfPromise: (p: unknown) => Effect<Await, unknown, NotImplemented>;
153
222
  /** @type {Func<Test>} */
154
223
  export declare const test: Func<Test>;
155
224
  /**
156
- * Writes an error line to `stderr` and yields exit code `1`. The canonical
225
+ * Writes an error line to `stderr` and fails with exit code `1`. The canonical
157
226
  * "fail with a message" program for a `NodeProgram`. For non-`1` exit codes,
158
- * compose `mapStep(error(s), () => n)` directly.
227
+ * compose `resultMapStep(error(s), () => resultError(n))` directly.
228
+ *
229
+ * **It never succeeds, and the type says so.** `E` is `number` and `T` is
230
+ * `never`, so `step`'s continuation takes a `never` and can never run. That is
231
+ * a continuation nobody reaches, not a compile error: writing one still type-
232
+ * checks, because a function accepting `never` accepts anything. What the type
233
+ * buys is that no *value* can be invented for the success branch, so nothing
234
+ * downstream can proceed as if this had succeeded.
235
+ *
236
+ * **The write's own outcome is deliberately discarded**, which is why this is
237
+ * `resultMapStep` rather than `mapStep`. The program is already failing and
238
+ * the exit code is `1` whether or not `stderr` accepted the bytes; propagating
239
+ * here would hand every caller a "failed to report a failure" branch with no
240
+ * better answer available to it than the one taken here.
241
+ *
242
+ * @type {(s: string) => Effect<Write, never, number>}
243
+ */
244
+ export declare const errorExit: (s: string) => Effect<Write, never, number>;
245
+ /**
246
+ * The exit code a {@link Program} answered, from whichever branch it came.
247
+ *
248
+ * `Result<0, number>` puts a number at `[1]` on both sides — `ok(0)` for
249
+ * success, `error(n)` for failure — so reading the code never asks which
250
+ * branch produced it, while a caller that cares *whether* it failed still asks
251
+ * `[0]`. That is why the success type is the literal `0` rather than `void`.
252
+ *
253
+ * A non-zero code belongs in the `error` branch and `0` in the `ok` branch; the
254
+ * type cannot say so, since there is no "non-zero number", and nothing depends
255
+ * on it — this reads `[1]` either way.
256
+ *
257
+ * @type {(r: Result<0, number>) => number}
258
+ */
259
+ export declare const exitCode: (r: Result<0, number>) => number;
260
+ /**
261
+ * Renders a channel error as a human line: an {@link IoError}'s own message, or
262
+ * the command name a runner could not dispatch.
263
+ *
264
+ * @type {(e: IoChannel) => string}
265
+ */
266
+ export declare const errorMessage: (e: IoChannel) => string;
267
+ /**
268
+ * Renders a channel error for a **remote** caller: the command name for a
269
+ * {@link NotImplemented}, the OS error code for an `IoError`, and nothing else.
270
+ *
271
+ * {@link errorMessage} is for the operator of the program, who is entitled to
272
+ * the host's own words — including the path that failed. A protocol client is
273
+ * not, and the difference is not stylistic: `payload.message` is where the
274
+ * host puts the absolute path it could not read, so answering an MCP tool call
275
+ * with it publishes the server's filesystem layout to whoever is on the other
276
+ * end. The code (`ENOENT`, `EACCES`) says *what* went wrong without saying
277
+ * *where*, which is the part a client can act on anyway.
278
+ *
279
+ * A host that attached no code leaves nothing safe to forward, so the answer is
280
+ * the bare kind. That is deliberate: guessing which part of a free-text message
281
+ * is path-free is exactly the mistake this exists to prevent.
282
+ *
283
+ * @type {(e: IoChannel) => string}
284
+ */
285
+ export declare const errorSummary: (e: IoChannel) => string;
286
+ /**
287
+ * Ends a program with an exit code that reflects `e`: `ok` yields `0`, and a
288
+ * failure is reported on `stderr` and yields `1` ({@link errorExit}).
289
+ *
290
+ * This is the exit-code policy a `NodeProgram` needs at the end of its chain,
291
+ * and the reason a program does not have to invent one per command. It is the
292
+ * counterpart of {@link isNotFound} at the other end of the channel: where that
293
+ * one asks which failure this is, this one stops asking and reports.
159
294
  *
160
- * @type {(s: string) => Effect<Write, number>}
295
+ * @type {<O extends Operation, T>(e: Effect<O, T, IoChannel>) => Effect<O | Write, 0, number>}
161
296
  */
162
- export declare const errorExit: (s: string) => Effect<Write, number>;
297
+ export declare const exitStep: <O extends Operation, T>(e: Effect<O, T, IoChannel>) => Effect<O | Write, 0, number>;
163
298
  /**
164
299
  * Compares semantic versions numerically by major, minor, then patch.
165
300
  *