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.
- package/README.md +88 -311
- package/dist/examples/canceler.d.ts +2 -0
- package/dist/examples/canceler.d.ts.map +1 -0
- package/dist/examples/canceler.js +30 -0
- package/dist/examples/canceler.js.map +1 -0
- package/dist/examples/demo.d.ts +3 -0
- package/dist/examples/demo.d.ts.map +1 -0
- package/dist/examples/demo.js +40 -30
- package/dist/examples/demo.js.map +1 -0
- package/dist/examples/fiberFinalizer.d.ts +2 -0
- package/dist/examples/fiberFinalizer.d.ts.map +1 -0
- package/dist/examples/fiberFinalizer.js +28 -5
- package/dist/examples/fiberFinalizer.js.map +1 -0
- package/dist/examples/fromPromise.d.ts +3 -0
- package/dist/examples/fromPromise.d.ts.map +1 -0
- package/dist/examples/fromPromise.js +44 -0
- package/dist/examples/fromPromise.js.map +1 -0
- package/dist/examples/index.d.ts +7 -0
- package/dist/examples/index.d.ts.map +1 -0
- package/dist/examples/index.js +9 -0
- package/dist/examples/index.js.map +1 -0
- package/dist/examples/resourceExample.d.ts +2 -0
- package/dist/examples/resourceExample.d.ts.map +1 -0
- package/dist/examples/resourceExample.js +4 -4
- package/dist/examples/resourceExample.js.map +1 -0
- package/dist/examples/toPromise.d.ts +2 -0
- package/dist/examples/toPromise.d.ts.map +1 -0
- package/dist/examples/toPromise.js +13 -0
- package/dist/examples/toPromise.js.map +1 -0
- package/dist/fibers/fiber.d.ts +24 -0
- package/dist/fibers/fiber.d.ts.map +1 -0
- package/dist/fibers/fiber.js +100 -33
- package/dist/fibers/fiber.js.map +1 -0
- package/dist/{index.js → index.cjs} +2 -3
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/scheduler/scheduler.d.ts +11 -0
- package/dist/scheduler/scheduler.d.ts.map +1 -0
- package/dist/scheduler/scheduler.js +36 -11
- package/dist/scheduler/scheduler.js.map +1 -0
- package/dist/scheduler/scope.d.ts +28 -0
- package/dist/scheduler/scope.d.ts.map +1 -0
- package/dist/scheduler/scope.js +20 -3
- package/dist/scheduler/scope.js.map +1 -0
- package/dist/stream/buffer.d.ts +3 -0
- package/dist/stream/buffer.d.ts.map +1 -0
- package/dist/stream/buffer.js +81 -0
- package/dist/stream/buffer.js.map +1 -0
- package/dist/stream/queue.d.ts +9 -0
- package/dist/stream/queue.d.ts.map +1 -0
- package/dist/stream/queue.js +98 -0
- package/dist/stream/queue.js.map +1 -0
- package/dist/stream/stream.d.ts +37 -0
- package/dist/stream/stream.d.ts.map +1 -0
- package/dist/stream/stream.js +70 -37
- package/dist/stream/stream.js.map +1 -0
- package/dist/stream/structuredConcurrency.d.ts +25 -0
- package/dist/stream/structuredConcurrency.d.ts.map +1 -0
- package/dist/stream/structuredConcurrency.js +1 -0
- package/dist/stream/structuredConcurrency.js.map +1 -0
- package/dist/types/asyncEffect.d.ts +44 -0
- package/dist/types/asyncEffect.d.ts.map +1 -0
- package/dist/types/asyncEffect.js +42 -0
- package/dist/types/asyncEffect.js.map +1 -0
- package/dist/types/cancel.d.ts +21 -0
- package/dist/types/cancel.d.ts.map +1 -0
- package/dist/types/cancel.js +1 -0
- package/dist/types/cancel.js.map +1 -0
- package/dist/types/effect.d.ts +20 -0
- package/dist/types/effect.d.ts.map +1 -0
- package/dist/types/effect.js +19 -123
- package/dist/types/effect.js.map +1 -0
- package/dist/types/option.d.ts +11 -0
- package/dist/types/option.d.ts.map +1 -0
- package/dist/types/option.js +1 -0
- package/dist/types/option.js.map +1 -0
- package/package.json +21 -7
- package/dist/scheduler/acquireRelease.js +0 -16
- 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
|
-
|
|
12
|
-
|
|
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(
|
|
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(
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
|
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,
|
|
18
|
+
(0, scope_1.withScope)(scope => {
|
|
20
19
|
const env = {};
|
|
21
|
-
const program = (0,
|
|
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 @@
|
|
|
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"}
|
package/dist/fibers/fiber.js
CHANGED
|
@@ -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
|
-
|
|
43
|
+
this.blockedOnAsync = false;
|
|
44
|
+
this.schedule("interrupt-step");
|
|
37
45
|
}
|
|
38
|
-
|
|
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
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
|
63
|
-
if (!
|
|
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 =
|
|
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;
|
|
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 "
|
|
101
|
-
|
|
102
|
-
|
|
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
|
-
|
|
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();
|
|
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/
|
|
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
|
-
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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"}
|