brass-runtime 1.0.1 → 1.2.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 (80) hide show
  1. package/README.md +88 -311
  2. package/dist/examples/canceler.d.ts +2 -0
  3. package/dist/examples/canceler.d.ts.map +1 -0
  4. package/dist/examples/canceler.js +30 -0
  5. package/dist/examples/canceler.js.map +1 -0
  6. package/dist/examples/demo.d.ts +3 -0
  7. package/dist/examples/demo.d.ts.map +1 -0
  8. package/dist/examples/demo.js +40 -30
  9. package/dist/examples/demo.js.map +1 -0
  10. package/dist/examples/fiberFinalizer.d.ts +2 -0
  11. package/dist/examples/fiberFinalizer.d.ts.map +1 -0
  12. package/dist/examples/fiberFinalizer.js +28 -5
  13. package/dist/examples/fiberFinalizer.js.map +1 -0
  14. package/dist/examples/fromPromise.d.ts +3 -0
  15. package/dist/examples/fromPromise.d.ts.map +1 -0
  16. package/dist/examples/fromPromise.js +44 -0
  17. package/dist/examples/fromPromise.js.map +1 -0
  18. package/dist/examples/index.d.ts +7 -0
  19. package/dist/examples/index.d.ts.map +1 -0
  20. package/dist/examples/index.js +9 -0
  21. package/dist/examples/index.js.map +1 -0
  22. package/dist/examples/resourceExample.d.ts +2 -0
  23. package/dist/examples/resourceExample.d.ts.map +1 -0
  24. package/dist/examples/resourceExample.js +4 -4
  25. package/dist/examples/resourceExample.js.map +1 -0
  26. package/dist/examples/toPromise.d.ts +2 -0
  27. package/dist/examples/toPromise.d.ts.map +1 -0
  28. package/dist/examples/toPromise.js +13 -0
  29. package/dist/examples/toPromise.js.map +1 -0
  30. package/dist/fibers/fiber.d.ts +24 -0
  31. package/dist/fibers/fiber.d.ts.map +1 -0
  32. package/dist/fibers/fiber.js +100 -33
  33. package/dist/fibers/fiber.js.map +1 -0
  34. package/dist/{index.js → index.cjs} +2 -3
  35. package/dist/index.d.ts +9 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/scheduler/scheduler.d.ts +11 -0
  39. package/dist/scheduler/scheduler.d.ts.map +1 -0
  40. package/dist/scheduler/scheduler.js +36 -11
  41. package/dist/scheduler/scheduler.js.map +1 -0
  42. package/dist/scheduler/scope.d.ts +28 -0
  43. package/dist/scheduler/scope.d.ts.map +1 -0
  44. package/dist/scheduler/scope.js +20 -3
  45. package/dist/scheduler/scope.js.map +1 -0
  46. package/dist/stream/buffer.d.ts +3 -0
  47. package/dist/stream/buffer.d.ts.map +1 -0
  48. package/dist/stream/buffer.js +81 -0
  49. package/dist/stream/buffer.js.map +1 -0
  50. package/dist/stream/queue.d.ts +9 -0
  51. package/dist/stream/queue.d.ts.map +1 -0
  52. package/dist/stream/queue.js +98 -0
  53. package/dist/stream/queue.js.map +1 -0
  54. package/dist/stream/stream.d.ts +37 -0
  55. package/dist/stream/stream.d.ts.map +1 -0
  56. package/dist/stream/stream.js +70 -37
  57. package/dist/stream/stream.js.map +1 -0
  58. package/dist/stream/structuredConcurrency.d.ts +25 -0
  59. package/dist/stream/structuredConcurrency.d.ts.map +1 -0
  60. package/dist/stream/structuredConcurrency.js +1 -0
  61. package/dist/stream/structuredConcurrency.js.map +1 -0
  62. package/dist/types/asyncEffect.d.ts +44 -0
  63. package/dist/types/asyncEffect.d.ts.map +1 -0
  64. package/dist/types/asyncEffect.js +42 -0
  65. package/dist/types/asyncEffect.js.map +1 -0
  66. package/dist/types/cancel.d.ts +21 -0
  67. package/dist/types/cancel.d.ts.map +1 -0
  68. package/dist/types/cancel.js +1 -0
  69. package/dist/types/cancel.js.map +1 -0
  70. package/dist/types/effect.d.ts +20 -0
  71. package/dist/types/effect.d.ts.map +1 -0
  72. package/dist/types/effect.js +19 -123
  73. package/dist/types/effect.js.map +1 -0
  74. package/dist/types/option.d.ts +11 -0
  75. package/dist/types/option.d.ts.map +1 -0
  76. package/dist/types/option.js +1 -0
  77. package/dist/types/option.js.map +1 -0
  78. package/package.json +21 -7
  79. package/dist/scheduler/acquireRelease.js +0 -16
  80. package/dist/scheduler/withScope.js +0 -19
@@ -1,23 +1,46 @@
1
1
  "use strict";
2
- // fiberFinalizer.ts
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ // fiberFinalizer.ts
4
4
  const asyncEffect_1 = require("../types/asyncEffect");
5
5
  const fiber_1 = require("../fibers/fiber");
6
6
  const demo_1 = require("./demo");
7
+ function formatExit(exit) {
8
+ if (!exit || typeof exit !== "object")
9
+ return String(exit);
10
+ if (exit._tag === "Success")
11
+ return `Success(value=${JSON.stringify(exit.value)})`;
12
+ if (exit._tag === "Failure")
13
+ return `Failure(error=${JSON.stringify(exit.error)})`;
14
+ return JSON.stringify(exit);
15
+ }
7
16
  function main() {
8
17
  const env = {};
18
+ const t0 = Date.now();
9
19
  const eff = (0, asyncEffect_1.asyncFlatMap)((0, asyncEffect_1.asyncTotal)(() => console.log("Start")), () => (0, asyncEffect_1.asyncFlatMap)((0, demo_1.sleep)(1000), () => (0, asyncEffect_1.asyncTotal)(() => "done")));
10
20
  const fiber = (0, fiber_1.fork)(eff, env);
11
- fiber.addFinalizer(exit => (0, asyncEffect_1.asyncTotal)(() => {
12
- console.log("RUNNING FINALIZER → exit =", exit._tag);
21
+ // 👇 Instrumentación del finalizer
22
+ let finCount = 0;
23
+ fiber.addFinalizer((exit) => (0, asyncEffect_1.asyncTotal)(() => {
24
+ var _a;
25
+ finCount += 1;
26
+ const ms = Date.now() - t0;
27
+ const stack = (_a = new Error().stack) === null || _a === void 0 ? void 0 : _a.split("\n").slice(1, 8).join("\n");
28
+ console.log("\n================ FINALIZER START ================");
29
+ console.log(`time: +${ms}ms`);
30
+ console.log(`finalizer call #: ${finCount}`);
31
+ console.log(`exit: ${formatExit(exit)}`);
32
+ console.log("raw exit object:", exit);
33
+ console.log("stack (where finalizer ran):\n" + stack);
34
+ console.log("================= FINALIZER END =================\n");
13
35
  }));
14
36
  // cancelamos antes de terminar para ver que el finalizer corre
15
37
  setTimeout(() => {
16
- console.log("Interrupting fiber...");
38
+ console.log(`\n[+${Date.now() - t0}ms] Interrupting fiber...`);
17
39
  fiber.interrupt();
18
40
  }, 500);
19
41
  fiber.join((exit) => {
20
- console.log("Fiber completed:", exit);
42
+ console.log(`\n[+${Date.now() - t0}ms] Fiber completed:`, exit);
21
43
  });
22
44
  }
23
45
  main();
46
+ //# sourceMappingURL=fiberFinalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiberFinalizer.js","sourceRoot":"","sources":["../../src/examples/fiberFinalizer.ts"],"names":[],"mappings":";;AAAA,oBAAoB;AACpB,sDAAgE;AAChE,2CAAuC;AACvC,iCAA+B;AAE/B,SAAS,UAAU,CAAC,IAAS;IACzB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3D,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,iBAAiB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;IACnF,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,iBAAiB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;IACnF,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,IAAI;IACT,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEtB,MAAM,GAAG,GACL,IAAA,0BAAY,EAAC,IAAA,wBAAU,EAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CACtD,IAAA,0BAAY,EAAC,IAAA,YAAK,EAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAC3B,IAAA,wBAAU,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAC3B,CACJ,CAAC;IAEN,MAAM,KAAK,GAAG,IAAA,YAAI,EAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAE7B,mCAAmC;IACnC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CACxB,IAAA,wBAAU,EAAC,GAAG,EAAE;;QACZ,QAAQ,IAAI,CAAC,CAAC;QACd,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;QAE3B,MAAM,KAAK,GAAG,MAAA,IAAI,KAAK,EAAE,CAAC,KAAK,0CACzB,KAAK,CAAC,IAAI,EACX,KAAK,CAAC,CAAC,EAAE,CAAC,EACV,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhB,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,SAAS,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,gCAAgC,GAAG,KAAK,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACvE,CAAC,CAAC,CACL,CAAC;IAEF,+DAA+D;IAC/D,UAAU,CAAC,GAAG,EAAE;QACZ,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,2BAA2B,CAAC,CAAC;QAC/D,KAAK,CAAC,SAAS,EAAE,CAAC;IACtB,CAAC,EAAE,GAAG,CAAC,CAAC;IAER,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QAChB,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,sBAAsB,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACP,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ZStream } from "../stream/stream";
2
+ export declare function slowRangeFromPromise(start: number, end: number, msPerElem: number): ZStream<unknown, never, number>;
3
+ //# sourceMappingURL=fromPromise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fromPromise.d.ts","sourceRoot":"","sources":["../../src/examples/fromPromise.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,OAAO,EAAC,MAAM,kBAAkB,CAAC;AAclE,wBAAgB,oBAAoB,CAChC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAmBjC"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.slowRangeFromPromise = slowRangeFromPromise;
4
+ const asyncEffect_1 = require("../types/asyncEffect");
5
+ const option_1 = require("../types/option");
6
+ const stream_1 = require("../stream/stream");
7
+ const buffer_1 = require("../stream/buffer");
8
+ // delay abortable en Promise
9
+ function sleepAbortable(ms, signal) {
10
+ return new Promise((res, rej) => {
11
+ const t = setTimeout(res, ms);
12
+ signal.addEventListener("abort", () => {
13
+ clearTimeout(t);
14
+ rej(new Error("aborted"));
15
+ });
16
+ });
17
+ }
18
+ function slowRangeFromPromise(start, end, msPerElem) {
19
+ const go = (i) => (0, stream_1.fromPull)(i > end
20
+ ? (0, asyncEffect_1.asyncFail)(option_1.none)
21
+ : (0, asyncEffect_1.asyncFlatMap)((0, asyncEffect_1.fromPromiseAbortable)(async (_env, signal) => {
22
+ await sleepAbortable(msPerElem, signal);
23
+ return i;
24
+ },
25
+ // en este stream no queremos “errores reales”, solo fin => never
26
+ () => undefined), (v) => (0, asyncEffect_1.asyncSucceed)([v, go(i + 1)])));
27
+ return go(start);
28
+ }
29
+ async function test_fromPromise_buffer() {
30
+ const s = slowRangeFromPromise(1, 10, 30);
31
+ const sb = (0, buffer_1.buffer)(s, 4, "backpressure");
32
+ const out = await (0, asyncEffect_1.toPromise)((0, stream_1.collectStream)(sb), undefined);
33
+ console.log("buffered out length =", out.length);
34
+ console.log(out);
35
+ }
36
+ async function test_fromPromise_emits() {
37
+ const s = slowRangeFromPromise(1, 5, 10);
38
+ const out = await (0, asyncEffect_1.toPromise)((0, stream_1.collectStream)(s), undefined);
39
+ console.log("out =", out);
40
+ // esperado: [1,2,3,4,5]
41
+ }
42
+ test_fromPromise_emits().catch(console.error);
43
+ test_fromPromise_buffer().catch(console.error);
44
+ //# sourceMappingURL=fromPromise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fromPromise.js","sourceRoot":"","sources":["../../src/examples/fromPromise.ts"],"names":[],"mappings":";;AAgBA,oDAuBC;AAvCD,sDAA4G;AAC5G,4CAAuC;AACvC,6CAAkE;AAClE,6CAAwC;AAExC,6BAA6B;AAC7B,SAAS,cAAc,CAAC,EAAU,EAAE,MAAmB;IACnD,OAAO,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC5B,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9B,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YAClC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChB,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,oBAAoB,CAChC,KAAa,EACb,GAAW,EACX,SAAiB;IAEjB,MAAM,EAAE,GAAG,CAAC,CAAS,EAAmC,EAAE,CACtD,IAAA,iBAAQ,EACJ,CAAC,GAAG,GAAG;QACH,CAAC,CAAC,IAAA,uBAAS,EAAC,aAAI,CAAC;QACjB,CAAC,CAAC,IAAA,0BAAY,EACV,IAAA,kCAAoB,EAChB,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;YACnB,MAAM,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACxC,OAAO,CAAC,CAAC;QACb,CAAC;QACD,iEAAiE;QACjE,GAAG,EAAE,CAAE,SAAmB,CAC7B,EACD,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,0BAAY,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAA8C,CAAC,CACnF,CACR,CAAC;IAEN,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;AACrB,CAAC;AAGD,KAAK,UAAU,uBAAuB;IAClC,MAAM,CAAC,GAAG,oBAAoB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,EAAE,GAAG,IAAA,eAAM,EAAC,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;IAExC,MAAM,GAAG,GAAG,MAAM,IAAA,uBAAS,EAAC,IAAA,sBAAa,EAAC,EAAE,CAAC,EAAE,SAAgB,CAAC,CAAC;IAEjE,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AACD,KAAK,UAAU,sBAAsB;IACjC,MAAM,CAAC,GAAG,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzC,MAAM,GAAG,GAAG,MAAM,IAAA,uBAAS,EAAC,IAAA,sBAAa,EAAC,CAAC,CAAC,EAAE,SAAgB,CAAC,CAAC;IAEhE,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC1B,wBAAwB;AAC5B,CAAC;AAED,sBAAsB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAE9C,uBAAuB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import "./demo";
2
+ import "./fiberFinalizer";
3
+ import "./resourceExample";
4
+ import "./canceler";
5
+ import "./toPromise";
6
+ import "./fromPromise";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/examples/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,CAAC;AAChB,OAAO,kBAAkB,CAAC;AAC1B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,YAAY,CAAC;AACpB,OAAO,aAAa,CAAA;AACpB,OAAO,eAAe,CAAA"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("./demo");
4
+ require("./fiberFinalizer");
5
+ require("./resourceExample");
6
+ require("./canceler");
7
+ require("./toPromise");
8
+ require("./fromPromise");
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/examples/index.ts"],"names":[],"mappings":";;AAAA,kBAAgB;AAChB,4BAA0B;AAC1B,6BAA2B;AAC3B,sBAAoB;AACpB,uBAAoB;AACpB,yBAAsB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resourceExample.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resourceExample.d.ts","sourceRoot":"","sources":["../../src/examples/resourceExample.ts"],"names":[],"mappings":""}
@@ -1,9 +1,8 @@
1
1
  "use strict";
2
2
  // src/resourceExample.ts
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- const acquireRelease_1 = require("../scheduler/acquireRelease");
4
+ const scope_1 = require("../scheduler/scope");
5
5
  const asyncEffect_1 = require("../types/asyncEffect");
6
- const withScope_1 = require("../scheduler/withScope");
7
6
  function openFile(name) {
8
7
  console.log("OPEN FILE:", name);
9
8
  return {
@@ -16,9 +15,9 @@ function openFile(name) {
16
15
  };
17
16
  }
18
17
  function main() {
19
- (0, withScope_1.withScope)(scope => {
18
+ (0, scope_1.withScope)(scope => {
20
19
  const env = {};
21
- const program = (0, acquireRelease_1.acquireRelease)((0, asyncEffect_1.asyncTotal)(() => openFile("data.txt")), (file, exit) => (0, asyncEffect_1.asyncTotal)(() => {
20
+ const program = (0, asyncEffect_1.acquireRelease)((0, asyncEffect_1.asyncTotal)(() => openFile("data.txt")), (file, exit) => (0, asyncEffect_1.asyncTotal)(() => {
22
21
  console.log("Finalizer running due to:", exit._tag);
23
22
  file.close();
24
23
  }), scope);
@@ -39,3 +38,4 @@ function sleep(ms) {
39
38
  });
40
39
  }
41
40
  main();
41
+ //# sourceMappingURL=resourceExample.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resourceExample.js","sourceRoot":"","sources":["../../src/examples/resourceExample.ts"],"names":[],"mappings":";AAAA,yBAAyB;;AAEzB,8CAA6C;AAC7C,sDAA0G;AAS1G,SAAS,QAAQ,CAAC,IAAY;IAC1B,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAChC,OAAO;QACH,IAAI;QACJ,MAAM,EAAE,KAAK;QACb,KAAK;YACD,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACvB,CAAC;KACJ,CAAC;AACN,CAAC;AAED,SAAS,IAAI;IACT,IAAA,iBAAS,EAAC,KAAK,CAAC,EAAE;QACd,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,MAAM,OAAO,GACT,IAAA,4BAAc,EACV,IAAA,wBAAU,EAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EACtC,CAAC,IAAI,EAAE,IAAoB,EAAE,EAAE,CAC3B,IAAA,wBAAU,EAAC,GAAG,EAAE;YACZ,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACpD,IAAI,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC,CAAC,EACN,KAAK,CACR,CAAC;QAEN,mBAAmB;QACnB,KAAK,CAAC,IAAI,CACN,IAAA,0BAAY,EAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CACzB,IAAA,0BAAY,EAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAC3B,IAAA,0BAAY,EAAC,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,CACnC,CACJ,EACD,GAAG,CACN,CAAC;QAEF,8CAA8C;QAC9C,UAAU,CAAC,GAAG,EAAE;YACZ,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,KAAK,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,EAAE,GAAG,CAAC,CAAC;IACZ,CAAC,CAAC,CAAC;AACP,CAAC;AACD,SAAS,KAAK,CAAC,EAAU;IACrB,OAAO,IAAA,mBAAK,EAAC,CAAC,CAAC,EAAE,EAAqC,EAAE,EAAE;QACtD,UAAU,CAAC,GAAG,EAAE;YACZ,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9C,CAAC,EAAE,EAAE,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACP,CAAC;AACD,IAAI,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=toPromise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toPromise.d.ts","sourceRoot":"","sources":["../../src/examples/toPromise.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const buffer_1 = require("../stream/buffer");
4
+ const stream_1 = require("../stream/stream");
5
+ const asyncEffect_1 = require("../types/asyncEffect");
6
+ async function testBuffer() {
7
+ const s = (0, stream_1.rangeStream)(1, 10);
8
+ const sb = (0, buffer_1.buffer)(s, 4, "backpressure");
9
+ const out = await (0, asyncEffect_1.toPromise)((0, stream_1.collectStream)(sb), undefined);
10
+ console.log(out);
11
+ }
12
+ testBuffer().catch(console.error);
13
+ //# sourceMappingURL=toPromise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toPromise.js","sourceRoot":"","sources":["../../src/examples/toPromise.ts"],"names":[],"mappings":";;AAAA,6CAAwC;AACxC,6CAA4D;AAC5D,sDAA+C;AAG/C,KAAK,UAAU,UAAU;IACrB,MAAM,CAAC,GAAG,IAAA,oBAAW,EAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,IAAA,eAAM,EAAC,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;IAExC,MAAM,GAAG,GAAG,MAAM,IAAA,uBAAS,EAAC,IAAA,sBAAa,EAAC,EAAE,CAAC,EAAE,SAAgB,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAED,UAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { Exit } from "../types/effect";
2
+ import { Async } from "../types/asyncEffect";
3
+ import { Scheduler } from "../scheduler/scheduler";
4
+ export type FiberId = number;
5
+ export type FiberStatus = "Running" | "Done" | "Interrupted";
6
+ export type Interrupted = {
7
+ readonly _tag: "Interrupted";
8
+ };
9
+ export type Fiber<E, A> = {
10
+ readonly id: FiberId;
11
+ readonly status: () => FiberStatus;
12
+ readonly join: (cb: (exit: Exit<E | Interrupted, A>) => void) => void;
13
+ readonly interrupt: () => void;
14
+ readonly addFinalizer: (f: (exit: Exit<E | Interrupted, A>) => void) => void;
15
+ };
16
+ export type BrassError = {
17
+ _tag: "Abort";
18
+ } | {
19
+ _tag: "PromiseRejected";
20
+ reason: unknown;
21
+ };
22
+ export declare function fork<R, E, A>(effect: Async<R, E, A>, env: R, scheduler?: Scheduler): Fiber<E, A>;
23
+ export declare function unsafeRunAsync<R, E, A>(effect: Async<R, E, A>, env: R, cb: (exit: Exit<E | Interrupted, A>) => void): void;
24
+ //# sourceMappingURL=fiber.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiber.d.ts","sourceRoot":"","sources":["../../src/fibers/fiber.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAC,KAAK,EAAY,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAkB,SAAS,EAAC,MAAM,wBAAwB,CAAC;AAGlE,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAC7B,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,aAAa,CAAC;AAC7D,MAAM,MAAM,WAAW,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAE3D,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI;IACtB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,WAAW,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,WAAW,EAAE,CAAC,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC;IACtE,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,WAAW,EAAE,CAAC,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC;CAChF,CAAC;AAMF,MAAM,MAAM,UAAU,GAChB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AA4NnD,wBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACxB,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACtB,GAAG,EAAE,CAAC,EACN,SAAS,GAAE,SAA2B,GACvC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAIb;AAID,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAClC,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACtB,GAAG,EAAE,CAAC,EACN,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,WAAW,EAAE,CAAC,CAAC,KAAK,IAAI,GAC7C,IAAI,CAGN"}
@@ -7,12 +7,17 @@ let nextId = 1;
7
7
  class RuntimeFiber {
8
8
  constructor(effect, env, scheduler) {
9
9
  this.scheduler = scheduler;
10
+ this.closing = null;
11
+ this.finishing = false;
10
12
  this.statusValue = "Running";
11
13
  this.interrupted = false;
12
14
  this.result = null;
13
15
  this.joiners = [];
14
16
  this.stack = [];
15
17
  this.fiberFinalizers = [];
18
+ this.scheduled = false;
19
+ this.finalizersDrained = false;
20
+ this.blockedOnAsync = false;
16
21
  this.id = nextId++;
17
22
  this.current = effect;
18
23
  this.env = env;
@@ -24,57 +29,86 @@ class RuntimeFiber {
24
29
  return this.statusValue;
25
30
  }
26
31
  join(cb) {
27
- if (this.result != null) {
32
+ if (this.result != null)
28
33
  cb(this.result);
29
- }
30
- else {
34
+ else
31
35
  this.joiners.push(cb);
32
- }
33
36
  }
34
37
  interrupt() {
38
+ if (this.result != null)
39
+ return;
40
+ if (this.interrupted)
41
+ return;
35
42
  this.interrupted = true;
36
- // cancelación cooperativa: el código async puede chequear flags externos
43
+ this.blockedOnAsync = false;
44
+ this.schedule("interrupt-step");
37
45
  }
38
- runFiberFinalizers(exit) {
46
+ schedule(tag = "step") {
47
+ if (this.result != null)
48
+ return;
49
+ if (this.scheduled)
50
+ return;
51
+ this.scheduled = true;
52
+ this.scheduler.schedule(() => {
53
+ this.scheduled = false;
54
+ this.step();
55
+ }, `fiber#${this.id}.${tag}`);
56
+ }
57
+ runFinalizersOnce(exit) {
58
+ if (this.finalizersDrained)
59
+ return;
60
+ this.finalizersDrained = true;
39
61
  while (this.fiberFinalizers.length > 0) {
40
62
  const fin = this.fiberFinalizers.pop();
41
- fin(exit); // fire-and-forget (igual que ZIO)
63
+ try {
64
+ fin(exit);
65
+ }
66
+ catch { }
42
67
  }
43
68
  }
44
- /** Programa un paso de la fibra en el scheduler */
45
- schedule() {
46
- this.scheduler.schedule(() => this.step());
47
- }
48
69
  notify(exit) {
49
70
  if (this.result != null)
50
71
  return;
51
- // ejecutar finalizers de fibra
52
- this.runFiberFinalizers(exit);
53
- // marcar estado final
72
+ if (this.closing != null)
73
+ return;
74
+ this.finishing = true;
75
+ this.closing = exit;
76
+ // ✅ ejecutar finalizers YA (garantiza clearInterval)
77
+ this.runFinalizersOnce(exit);
78
+ // completar
54
79
  this.statusValue = this.interrupted ? "Interrupted" : "Done";
55
80
  this.result = exit;
56
- // notificar joiners
57
81
  for (const j of this.joiners)
58
82
  j(exit);
59
83
  this.joiners.length = 0;
60
84
  }
61
85
  onSuccess(value) {
62
- const cont = this.stack.pop();
63
- if (!cont) {
64
- // terminamos con éxito
86
+ const frame = this.stack.pop();
87
+ if (!frame) {
65
88
  this.notify({ _tag: "Success", value });
66
89
  return;
67
90
  }
68
- this.current = cont(value);
69
- this.schedule(); // siguiente paso
91
+ this.current = frame._tag === "SuccessCont" ? frame.k(value) : frame.onSuccess(value);
70
92
  }
71
93
  onFailure(error) {
94
+ while (this.stack.length > 0) {
95
+ const frame = this.stack.pop();
96
+ if (frame._tag === "FoldCont") {
97
+ this.current = frame.onFailure(error);
98
+ return;
99
+ }
100
+ }
72
101
  this.notify({ _tag: "Failure", error });
73
102
  }
74
- /** Un *paso* de evaluación de la fibra */
75
103
  step() {
76
104
  if (this.result != null)
77
- return; // ya terminó
105
+ return;
106
+ if (this.blockedOnAsync)
107
+ return;
108
+ if (this.interrupted && this.closing == null) {
109
+ this.notify({ _tag: "Failure", error: { _tag: "Interrupted" } });
110
+ return;
111
+ }
78
112
  const current = this.current;
79
113
  switch (current._tag) {
80
114
  case "Succeed":
@@ -93,30 +127,62 @@ class RuntimeFiber {
93
127
  }
94
128
  return;
95
129
  case "FlatMap":
96
- this.stack.push(current.andThen);
130
+ this.stack.push({ _tag: "SuccessCont", k: current.andThen });
97
131
  this.current = current.first;
98
- this.schedule(); // reducimos el first en otro paso
99
132
  return;
100
- case "Async":
101
- current.register(this.env, (exit) => {
102
- if (this.interrupted && exit._tag === "Success") {
133
+ case "Fold":
134
+ this.stack.push({ _tag: "FoldCont", onFailure: current.onFailure, onSuccess: current.onSuccess });
135
+ this.current = current.first;
136
+ return;
137
+ case "Async": {
138
+ if (this.finishing)
139
+ return;
140
+ this.blockedOnAsync = true;
141
+ let pending = null;
142
+ let completedSync = false;
143
+ const resume = () => {
144
+ if (!pending)
145
+ return;
146
+ const exit = pending;
147
+ pending = null;
148
+ this.blockedOnAsync = false;
149
+ if (this.result != null || this.closing != null)
150
+ return;
151
+ if (this.interrupted) {
103
152
  this.onFailure({ _tag: "Interrupted" });
153
+ return;
104
154
  }
105
- else if (exit._tag === "Success") {
155
+ if (exit._tag === "Success")
106
156
  this.onSuccess(exit.value);
107
- }
108
- else {
157
+ else
109
158
  this.onFailure(exit.error);
110
- }
159
+ this.schedule("async-resume");
160
+ };
161
+ const canceler = current.register(this.env, (exit) => {
162
+ // guardamos el resultado, pero NO ejecutamos todavía
163
+ pending = exit;
164
+ completedSync = true;
165
+ // no llamamos resume acá
111
166
  });
167
+ if (typeof canceler === "function") {
168
+ this.addFinalizer((_exit) => {
169
+ try {
170
+ canceler();
171
+ }
172
+ catch { }
173
+ });
174
+ }
175
+ if (completedSync) {
176
+ this.scheduler.schedule(resume, `fiber#${this.id}.async-sync-resume`);
177
+ }
112
178
  return;
179
+ }
113
180
  }
114
181
  }
115
182
  }
116
- // API pública: fork + helper unsafeRunAsync
117
183
  function fork(effect, env, scheduler = scheduler_1.globalScheduler) {
118
184
  const fiber = new RuntimeFiber(effect, env, scheduler);
119
- fiber.schedule(); // arrancamos la primera reducción
185
+ fiber.schedule("initial-step");
120
186
  return fiber;
121
187
  }
122
188
  // “correr” un Async como antes, pero apoyado en fibras + scheduler
@@ -124,3 +190,4 @@ function unsafeRunAsync(effect, env, cb) {
124
190
  const fiber = fork(effect, env);
125
191
  fiber.join(cb);
126
192
  }
193
+ //# sourceMappingURL=fiber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiber.js","sourceRoot":"","sources":["../../src/fibers/fiber.ts"],"names":[],"mappings":"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"}
@@ -19,8 +19,7 @@ __exportStar(require("./types/asyncEffect"), exports);
19
19
  __exportStar(require("./stream/stream"), exports);
20
20
  __exportStar(require("./types/option"), exports);
21
21
  __exportStar(require("./types/effect"), exports);
22
- __exportStar(require("./scheduler/withScope"), exports);
23
- __exportStar(require("./scheduler/acquireRelease"), exports);
22
+ __exportStar(require("./scheduler/scope"), exports);
24
23
  __exportStar(require("./scheduler/scheduler"), exports);
25
24
  __exportStar(require("./types/cancel"), exports);
26
- __exportStar(require("./scheduler/scope"), exports);
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,9 @@
1
+ export * from "./types/effect";
2
+ export * from "./types/asyncEffect";
3
+ export * from "./stream/stream";
4
+ export * from "./types/option";
5
+ export * from "./types/effect";
6
+ export * from "./scheduler/scope";
7
+ export * from "./scheduler/scheduler";
8
+ export * from "./types/cancel";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAE/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,sDAAoC;AACpC,kDAAgC;AAChC,iDAA+B;AAC/B,iDAA+B;AAE/B,oDAAkC;AAClC,wDAAsC;AACtC,iDAA+B"}
@@ -0,0 +1,11 @@
1
+ export type Task = () => void;
2
+ export declare class Scheduler {
3
+ private queue;
4
+ private flushing;
5
+ private requested;
6
+ schedule(task: Task, tag?: string): void;
7
+ private requestFlush;
8
+ private flush;
9
+ }
10
+ export declare const globalScheduler: Scheduler;
11
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/scheduler/scheduler.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;AAO9B,qBAAa,SAAS;IAClB,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAG1B,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,GAAE,MAAoB,GAAG,IAAI;IAarD,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,KAAK;CAehB;AAED,eAAO,MAAM,eAAe,WAAkB,CAAC"}
@@ -5,23 +5,48 @@ class Scheduler {
5
5
  constructor() {
6
6
  this.queue = [];
7
7
  this.flushing = false;
8
+ this.requested = false;
8
9
  }
9
- schedule(task) {
10
- this.queue.push(task);
11
- if (!this.flushing) {
12
- this.flush();
13
- }
10
+ // ✅ tag opcional
11
+ schedule(task, tag = "anonymous") {
12
+ var _a;
13
+ this.queue.push({ tag, task });
14
+ this.requestFlush();
15
+ // log: tamaño + próximos tags (head)
16
+ console.log("SCHEDULER", {
17
+ flushing: this.flushing,
18
+ q: this.queue.length,
19
+ next: (_a = this.queue[0]) === null || _a === void 0 ? void 0 : _a.tag,
20
+ head: this.queue.slice(0, 5).map(t => t.tag),
21
+ });
22
+ }
23
+ requestFlush() {
24
+ if (this.requested)
25
+ return;
26
+ this.requested = true;
27
+ queueMicrotask(() => this.flush());
14
28
  }
15
29
  flush() {
30
+ if (this.flushing)
31
+ return;
16
32
  this.flushing = true;
17
- // Versión simple: drena todo de una
18
- while (this.queue.length > 0) {
19
- const t = this.queue.shift();
20
- t();
33
+ this.requested = false;
34
+ try {
35
+ while (this.queue.length > 0) {
36
+ const { task } = this.queue.shift();
37
+ try {
38
+ task();
39
+ }
40
+ catch { }
41
+ }
42
+ }
43
+ finally {
44
+ this.flushing = false;
45
+ if (this.queue.length > 0)
46
+ this.requestFlush();
21
47
  }
22
- this.flushing = false;
23
48
  }
24
49
  }
25
50
  exports.Scheduler = Scheduler;
26
- // Un scheduler global para todo el runtime
27
51
  exports.globalScheduler = new Scheduler();
52
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/scheduler/scheduler.ts"],"names":[],"mappings":";;;AAOA,MAAa,SAAS;IAAtB;QACY,UAAK,GAAiB,EAAE,CAAC;QACzB,aAAQ,GAAG,KAAK,CAAC;QACjB,cAAS,GAAG,KAAK,CAAC;IAsC9B,CAAC;IApCG,iBAAiB;IACjB,QAAQ,CAAC,IAAU,EAAE,MAAc,WAAW;;QAC1C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,qCAAqC;QACrC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,MAAA,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,0CAAE,GAAG;YACxB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;SAC/C,CAAC,CAAC;IACP,CAAC;IAEO,YAAY;QAChB,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACvC,CAAC;IAEO,KAAK;QACT,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAEvB,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC;gBACrC,IAAI,CAAC;oBAAC,IAAI,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YAC5B,CAAC;QACL,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,YAAY,EAAE,CAAC;QACnD,CAAC;IACL,CAAC;CACJ;AAzCD,8BAyCC;AAEY,QAAA,eAAe,GAAG,IAAI,SAAS,EAAE,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { Fiber, Interrupted } from "../fibers/fiber";
2
+ import { Exit } from "../types/effect";
3
+ import { Async } from "../types/asyncEffect";
4
+ export type ScopeId = number;
5
+ export declare class Scope<R> {
6
+ private readonly env;
7
+ readonly id: ScopeId;
8
+ private closed;
9
+ private readonly children;
10
+ private readonly subScopes;
11
+ private readonly finalizers;
12
+ constructor(env: R);
13
+ /** registra un finalizer (LIFO) */
14
+ addFinalizer(f: (exit: Exit<any, any>) => Async<R, any, any>): void;
15
+ /** crea un sub scope */
16
+ subScope(): Scope<R>;
17
+ /** fork en este scope */
18
+ fork<E, A>(eff: Async<R, E, A>, env: R): Fiber<E | Interrupted, A>;
19
+ /** Cierre estructurado */
20
+ close(exit?: Exit<any, any>): void;
21
+ isClosed(): boolean;
22
+ }
23
+ /**
24
+ * Ejecuta una función dentro de un scope estructurado.
25
+ * Al final (éxito o error), se cierra el scope garantizando cleanup.
26
+ */
27
+ export declare function withScope<R, A>(body: (scope: Scope<R>) => A): A;
28
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/scheduler/scope.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAE,WAAW,EAAM,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAC,IAAI,EAAC,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAC,KAAK,EAAC,MAAM,sBAAsB,CAAC;AAE3C,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAI7B,qBAAa,KAAK,CAAC,CAAC;IASJ,OAAO,CAAC,QAAQ,CAAC,GAAG;IARhC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IAErB,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IACjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA2D;gBAEzD,GAAG,EAAE,CAAC;IAInC,mCAAmC;IACnC,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI;IAOnE,wBAAwB;IACxB,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC;IAOpB,yBAAyB;IACzB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,WAAW,EAAE,CAAC,CAAC;IAalE,0BAA0B;IAC1B,KAAK,CAAC,IAAI,GAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAyC,GAAG,IAAI;IAyBzE,QAAQ,IAAI,OAAO;CAGtB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAC1B,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAC7B,CAAC,CAOH"}