@zk-tech/bedrock 0.0.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.
- package/README.md +24 -0
- package/dist/array/index.cjs +22 -0
- package/dist/array/index.cjs.map +1 -0
- package/dist/array/index.d.cts +13 -0
- package/dist/array/index.d.ts +13 -0
- package/dist/array/index.js +19 -0
- package/dist/array/index.js.map +1 -0
- package/dist/assert/index.cjs +29 -0
- package/dist/assert/index.cjs.map +1 -0
- package/dist/assert/index.d.cts +25 -0
- package/dist/assert/index.d.ts +25 -0
- package/dist/assert/index.js +24 -0
- package/dist/assert/index.js.map +1 -0
- package/dist/async/index.cjs +746 -0
- package/dist/async/index.cjs.map +1 -0
- package/dist/async/index.d.cts +47 -0
- package/dist/async/index.d.ts +47 -0
- package/dist/async/index.js +738 -0
- package/dist/async/index.js.map +1 -0
- package/dist/barrier-316Xonfd.d.cts +18 -0
- package/dist/barrier-316Xonfd.d.ts +18 -0
- package/dist/byte/index.cjs +59 -0
- package/dist/byte/index.cjs.map +1 -0
- package/dist/byte/index.d.cts +12 -0
- package/dist/byte/index.d.ts +12 -0
- package/dist/byte/index.js +49 -0
- package/dist/byte/index.js.map +1 -0
- package/dist/cache/index.cjs +418 -0
- package/dist/cache/index.cjs.map +1 -0
- package/dist/cache/index.d.cts +40 -0
- package/dist/cache/index.d.ts +40 -0
- package/dist/cache/index.js +415 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cancellation-BIIv2UJm.d.cts +25 -0
- package/dist/cancellation-ClqPPsV1.d.ts +25 -0
- package/dist/context/index.cjs +59 -0
- package/dist/context/index.cjs.map +1 -0
- package/dist/context/index.d.cts +33 -0
- package/dist/context/index.d.ts +33 -0
- package/dist/context/index.js +51 -0
- package/dist/context/index.js.map +1 -0
- package/dist/di/index.cjs +1965 -0
- package/dist/di/index.cjs.map +1 -0
- package/dist/di/index.d.cts +140 -0
- package/dist/di/index.d.ts +140 -0
- package/dist/di/index.js +1949 -0
- package/dist/di/index.js.map +1 -0
- package/dist/disposable-t-B15Nu57y.d.ts +93 -0
- package/dist/disposable-t-CVsiyHPL.d.cts +93 -0
- package/dist/dispose/index.cjs +356 -0
- package/dist/dispose/index.cjs.map +1 -0
- package/dist/dispose/index.d.cts +26 -0
- package/dist/dispose/index.d.ts +26 -0
- package/dist/dispose/index.js +340 -0
- package/dist/dispose/index.js.map +1 -0
- package/dist/dispose-base-CAeXDpjg.d.cts +6 -0
- package/dist/dispose-base-CAeXDpjg.d.ts +6 -0
- package/dist/emitter-CAfCtSTg.d.cts +35 -0
- package/dist/emitter-DeM5mlEm.d.ts +35 -0
- package/dist/error/index.cjs +145 -0
- package/dist/error/index.cjs.map +1 -0
- package/dist/error/index.d.cts +45 -0
- package/dist/error/index.d.ts +45 -0
- package/dist/error/index.js +126 -0
- package/dist/error/index.js.map +1 -0
- package/dist/error-base-B4zaiJ5m.d.cts +32 -0
- package/dist/error-base-B4zaiJ5m.d.ts +32 -0
- package/dist/event/index.cjs +550 -0
- package/dist/event/index.cjs.map +1 -0
- package/dist/event/index.d.cts +139 -0
- package/dist/event/index.d.ts +139 -0
- package/dist/event/index.js +538 -0
- package/dist/event/index.js.map +1 -0
- package/dist/function/index.cjs +132 -0
- package/dist/function/index.cjs.map +1 -0
- package/dist/function/index.d.cts +26 -0
- package/dist/function/index.d.ts +26 -0
- package/dist/function/index.js +129 -0
- package/dist/function/index.js.map +1 -0
- package/dist/graph-BGbNOniY.d.cts +23 -0
- package/dist/graph-BGbNOniY.d.ts +23 -0
- package/dist/hash/index.cjs +54 -0
- package/dist/hash/index.cjs.map +1 -0
- package/dist/hash/index.d.cts +5 -0
- package/dist/hash/index.d.ts +5 -0
- package/dist/hash/index.js +50 -0
- package/dist/hash/index.js.map +1 -0
- package/dist/instantiation-service.interface-CVFMBUUD.d.cts +78 -0
- package/dist/instantiation-service.interface-CVFMBUUD.d.ts +78 -0
- package/dist/json/index.cjs +28 -0
- package/dist/json/index.cjs.map +1 -0
- package/dist/json/index.d.cts +8 -0
- package/dist/json/index.d.ts +8 -0
- package/dist/json/index.js +26 -0
- package/dist/json/index.js.map +1 -0
- package/dist/launch/index.cjs +213 -0
- package/dist/launch/index.cjs.map +1 -0
- package/dist/launch/index.d.cts +46 -0
- package/dist/launch/index.d.ts +46 -0
- package/dist/launch/index.js +211 -0
- package/dist/launch/index.js.map +1 -0
- package/dist/linked-list-CUkue5DZ.d.cts +24 -0
- package/dist/linked-list-CUkue5DZ.d.ts +24 -0
- package/dist/lock/index.cjs +662 -0
- package/dist/lock/index.cjs.map +1 -0
- package/dist/lock/index.d.cts +145 -0
- package/dist/lock/index.d.ts +145 -0
- package/dist/lock/index.js +656 -0
- package/dist/lock/index.js.map +1 -0
- package/dist/lodash-es/index.cjs +14 -0
- package/dist/lodash-es/index.cjs.map +1 -0
- package/dist/lodash-es/index.d.cts +1 -0
- package/dist/lodash-es/index.d.ts +1 -0
- package/dist/lodash-es/index.js +3 -0
- package/dist/lodash-es/index.js.map +1 -0
- package/dist/math/index.cjs +161 -0
- package/dist/math/index.cjs.map +1 -0
- package/dist/math/index.d.cts +76 -0
- package/dist/math/index.d.ts +76 -0
- package/dist/math/index.js +156 -0
- package/dist/math/index.js.map +1 -0
- package/dist/network/index.cjs +91 -0
- package/dist/network/index.cjs.map +1 -0
- package/dist/network/index.d.cts +62 -0
- package/dist/network/index.d.ts +62 -0
- package/dist/network/index.js +82 -0
- package/dist/network/index.js.map +1 -0
- package/dist/objects/index.cjs +80 -0
- package/dist/objects/index.cjs.map +1 -0
- package/dist/objects/index.d.cts +11 -0
- package/dist/objects/index.d.ts +11 -0
- package/dist/objects/index.js +77 -0
- package/dist/objects/index.js.map +1 -0
- package/dist/platform/index.cjs +62 -0
- package/dist/platform/index.cjs.map +1 -0
- package/dist/platform/index.d.cts +21 -0
- package/dist/platform/index.d.ts +21 -0
- package/dist/platform/index.js +48 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/promise/index.cjs +639 -0
- package/dist/promise/index.cjs.map +1 -0
- package/dist/promise/index.d.cts +63 -0
- package/dist/promise/index.d.ts +63 -0
- package/dist/promise/index.js +633 -0
- package/dist/promise/index.js.map +1 -0
- package/dist/scheduler/index.cjs +599 -0
- package/dist/scheduler/index.cjs.map +1 -0
- package/dist/scheduler/index.d.cts +57 -0
- package/dist/scheduler/index.d.ts +57 -0
- package/dist/scheduler/index.js +594 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/sprintf/index.cjs +101 -0
- package/dist/sprintf/index.cjs.map +1 -0
- package/dist/sprintf/index.d.cts +3 -0
- package/dist/sprintf/index.d.ts +3 -0
- package/dist/sprintf/index.js +99 -0
- package/dist/sprintf/index.js.map +1 -0
- package/dist/structure/index.cjs +300 -0
- package/dist/structure/index.cjs.map +1 -0
- package/dist/structure/index.d.cts +21 -0
- package/dist/structure/index.d.ts +21 -0
- package/dist/structure/index.js +296 -0
- package/dist/structure/index.js.map +1 -0
- package/dist/type/index.cjs +4 -0
- package/dist/type/index.cjs.map +1 -0
- package/dist/type/index.d.cts +20 -0
- package/dist/type/index.d.ts +20 -0
- package/dist/type/index.js +3 -0
- package/dist/type/index.js.map +1 -0
- package/dist/undo-redo-stack/index.cjs +545 -0
- package/dist/undo-redo-stack/index.cjs.map +1 -0
- package/dist/undo-redo-stack/index.d.cts +130 -0
- package/dist/undo-redo-stack/index.d.ts +130 -0
- package/dist/undo-redo-stack/index.js +542 -0
- package/dist/undo-redo-stack/index.js.map +1 -0
- package/dist/uuid/index.cjs +67 -0
- package/dist/uuid/index.cjs.map +1 -0
- package/dist/uuid/index.d.cts +17 -0
- package/dist/uuid/index.d.ts +17 -0
- package/dist/uuid/index.js +61 -0
- package/dist/uuid/index.js.map +1 -0
- package/dist/worker/index.cjs +271 -0
- package/dist/worker/index.cjs.map +1 -0
- package/dist/worker/index.d.cts +66 -0
- package/dist/worker/index.d.ts +66 -0
- package/dist/worker/index.js +267 -0
- package/dist/worker/index.js.map +1 -0
- package/package.json +285 -0
- package/src/_internal/logger.ts +59 -0
- package/src/array/array.test.ts +35 -0
- package/src/array/array.ts +25 -0
- package/src/array/index.ts +1 -0
- package/src/assert/assert.test.ts +86 -0
- package/src/assert/assert.ts +42 -0
- package/src/assert/index.ts +2 -0
- package/src/async/barrier.test.ts +90 -0
- package/src/async/barrier.ts +58 -0
- package/src/async/cancellation.test.ts +85 -0
- package/src/async/cancellation.ts +193 -0
- package/src/async/index.ts +18 -0
- package/src/async/queue/queue.test.ts +70 -0
- package/src/async/queue/queue.ts +56 -0
- package/src/async/queue/task.test.ts +155 -0
- package/src/async/queue/task.ts +67 -0
- package/src/async/utils.test.ts +28 -0
- package/src/async/utils.ts +8 -0
- package/src/async/wait.ts +9 -0
- package/src/byte/format.test.ts +64 -0
- package/src/byte/format.ts +44 -0
- package/src/byte/index.ts +2 -0
- package/src/byte/node_modules/.vitest/results.json +1 -0
- package/src/byte/var.ts +11 -0
- package/src/cache/index.ts +2 -0
- package/src/cache/lru-with-timeout.test.ts +88 -0
- package/src/cache/lru-with-timeout.ts +85 -0
- package/src/cache/lru.test.ts +56 -0
- package/src/cache/lru.ts +59 -0
- package/src/context/context.test.ts +17 -0
- package/src/context/context.ts +60 -0
- package/src/context/index.ts +8 -0
- package/src/di/base.ts +73 -0
- package/src/di/container-service.test.ts +179 -0
- package/src/di/context.web.tsx +41 -0
- package/src/di/descriptor.ts +31 -0
- package/src/di/idle-value.test.ts +73 -0
- package/src/di/idle-value.ts +63 -0
- package/src/di/index.common.ts +32 -0
- package/src/di/index.ts +2 -0
- package/src/di/instantiation-service.interface.ts +46 -0
- package/src/di/instantiation-service.test.ts +337 -0
- package/src/di/instantiation-service.ts +468 -0
- package/src/di/lazy/foo.mock.ts +28 -0
- package/src/di/lazy/idle-load.ts +39 -0
- package/src/di/lazy/index.ts +4 -0
- package/src/di/lazy/lazy-service.test.ts +65 -0
- package/src/di/lazy/lazy-service.ts +71 -0
- package/src/di/lazy/type.ts +5 -0
- package/src/di/node_modules/.vitest/results.json +1 -0
- package/src/di/proxy-builder.test.ts +45 -0
- package/src/di/proxy-builder.ts +38 -0
- package/src/di/service-collection.test.ts +27 -0
- package/src/di/service-collection.ts +46 -0
- package/src/di/service-ownership-collection.test.ts +39 -0
- package/src/di/service-ownership-collection.ts +38 -0
- package/src/di/service-registry.test.ts +66 -0
- package/src/di/service-registry.ts +99 -0
- package/src/di/trace.ts +85 -0
- package/src/dispose/disposable-store.test.ts +57 -0
- package/src/dispose/disposable-store.ts +80 -0
- package/src/dispose/disposable-t.test.ts +123 -0
- package/src/dispose/disposable-t.ts +238 -0
- package/src/dispose/disposable-utils.test.ts +15 -0
- package/src/dispose/disposable-utils.ts +28 -0
- package/src/dispose/dispose-base.ts +9 -0
- package/src/dispose/index.ts +34 -0
- package/src/dispose/logger.test.ts +65 -0
- package/src/dispose/logger.ts +39 -0
- package/src/dispose/timer.test.ts +30 -0
- package/src/dispose/timer.ts +16 -0
- package/src/dispose/tracker.test.ts +51 -0
- package/src/dispose/tracker.ts +105 -0
- package/src/error/error-base.ts +45 -0
- package/src/error/error-code.ts +39 -0
- package/src/error/error-const.test.ts +30 -0
- package/src/error/error-const.ts +16 -0
- package/src/error/error-or.test.ts +44 -0
- package/src/error/error-or.ts +2 -0
- package/src/error/error-t.test.ts +116 -0
- package/src/error/error-t.ts +100 -0
- package/src/error/index.ts +24 -0
- package/src/error/node_modules/.vitest/results.json +1 -0
- package/src/event/disposable-linked-list.ts +29 -0
- package/src/event/emitter.test.ts +191 -0
- package/src/event/emitter.ts +162 -0
- package/src/event/error-handler.ts +22 -0
- package/src/event/index.ts +34 -0
- package/src/event/once.ts +29 -0
- package/src/event/phase-emitter.test.ts +212 -0
- package/src/event/phase-emitter.ts +209 -0
- package/src/event/shortcut-event-utils.ts +33 -0
- package/src/event/utils.ts +6 -0
- package/src/event/when.ts +40 -0
- package/src/function/debounce.test.ts +274 -0
- package/src/function/debounce.ts +168 -0
- package/src/function/index.ts +2 -0
- package/src/function/node_modules/.vitest/results.json +1 -0
- package/src/function/throttle.test.ts +179 -0
- package/src/function/throttle.ts +26 -0
- package/src/hash/hash-t.test.ts +100 -0
- package/src/hash/hash-t.ts +51 -0
- package/src/hash/index.ts +3 -0
- package/src/json/index.ts +1 -0
- package/src/json/node_modules/.vitest/results.json +1 -0
- package/src/json/parse.ts +19 -0
- package/src/launch/abstract-job.ts +45 -0
- package/src/launch/cost-recorder.ts +22 -0
- package/src/launch/index.ts +2 -0
- package/src/launch/job-scheduler.test.ts +122 -0
- package/src/launch/job-scheduler.ts +118 -0
- package/src/launch/node_modules/.vitest/deps/_metadata.json +8 -0
- package/src/launch/node_modules/.vitest/deps/package.json +3 -0
- package/src/launch/node_modules/.vitest/results.json +1 -0
- package/src/lock/README.md +11 -0
- package/src/lock/capability.test.ts +110 -0
- package/src/lock/capability.ts +89 -0
- package/src/lock/index.ts +15 -0
- package/src/lock/node_modules/.vitest/results.json +1 -0
- package/src/lock/semaphore.ts +21 -0
- package/src/lock/shared-mutex.test.ts +537 -0
- package/src/lock/shared-mutex.ts +242 -0
- package/src/lock/utils.test.ts +165 -0
- package/src/lock/utils.ts +135 -0
- package/src/lodash-es/index.ts +1 -0
- package/src/math/degree.ts +16 -0
- package/src/math/index.ts +7 -0
- package/src/math/math.test.ts +40 -0
- package/src/math/math.ts +64 -0
- package/src/math/node_modules/.vitest/results.json +1 -0
- package/src/math/vector.test.ts +73 -0
- package/src/math/vector.ts +114 -0
- package/src/network/client.interface.ts +104 -0
- package/src/network/client.web.ts +24 -0
- package/src/network/index.common.ts +10 -0
- package/src/network/index.ts +2 -0
- package/src/network/plugins/retry.ts +98 -0
- package/src/objects/deep-clone.test.ts +40 -0
- package/src/objects/deep-clone.ts +13 -0
- package/src/objects/deep-equal.test.ts +86 -0
- package/src/objects/deep-equal.ts +60 -0
- package/src/objects/index.ts +4 -0
- package/src/platform/index.ts +64 -0
- package/src/promise/index.ts +16 -0
- package/src/promise/promise.test.ts +254 -0
- package/src/promise/promise.ts +212 -0
- package/src/scheduler/callback-token.ts +31 -0
- package/src/scheduler/core/actuator-args.test.ts +47 -0
- package/src/scheduler/core/actuator.test.ts +82 -0
- package/src/scheduler/core/actuator.ts +58 -0
- package/src/scheduler/core/chunk-scheduler.test.ts +54 -0
- package/src/scheduler/core/chunk-scheduler.ts +28 -0
- package/src/scheduler/core/node_modules/.vitest/results.json +1 -0
- package/src/scheduler/core/scheduler.test.ts +328 -0
- package/src/scheduler/core/scheduler.ts +172 -0
- package/src/scheduler/core/task-queue.test.ts +78 -0
- package/src/scheduler/core/task-queue.ts +44 -0
- package/src/scheduler/core/task.test.ts +34 -0
- package/src/scheduler/core/task.ts +52 -0
- package/src/scheduler/core/utils.ts +48 -0
- package/src/scheduler/executor/abstract-executor.test.ts +44 -0
- package/src/scheduler/executor/abstract-executor.ts +38 -0
- package/src/scheduler/executor/executor.interface.ts +39 -0
- package/src/scheduler/executor/idle-callback-executor.test.ts +70 -0
- package/src/scheduler/executor/idle-callback-executor.ts +98 -0
- package/src/scheduler/executor/make-executor.ts +18 -0
- package/src/scheduler/executor/post-message-executor.test.ts +66 -0
- package/src/scheduler/executor/post-message-executor.ts +52 -0
- package/src/scheduler/index.ts +15 -0
- package/src/scheduler/lv-scheduler-callback.ts +19 -0
- package/src/scheduler/lv-scheduler-config.ts +17 -0
- package/src/scheduler/type.ts +48 -0
- package/src/sprintf/index.ts +2 -0
- package/src/sprintf/sprintf.test.ts +95 -0
- package/src/sprintf/sprintf.ts +97 -0
- package/src/structure/graph.test.ts +181 -0
- package/src/structure/graph.ts +105 -0
- package/src/structure/index.ts +8 -0
- package/src/structure/linked-list.test.ts +74 -0
- package/src/structure/linked-list.ts +145 -0
- package/src/structure/min-heap.test.ts +71 -0
- package/src/structure/min-heap.ts +91 -0
- package/src/type/REAME.md +2 -0
- package/src/type/distributive-omit.interface.ts +4 -0
- package/src/type/index.ts +3 -0
- package/src/type/object-key-paths.interface.ts +40 -0
- package/src/undo-redo-stack/README.md +61 -0
- package/src/undo-redo-stack/action-stack.test.ts +330 -0
- package/src/undo-redo-stack/action-stack.ts +150 -0
- package/src/undo-redo-stack/element.ts +4 -0
- package/src/undo-redo-stack/index.ts +7 -0
- package/src/undo-redo-stack/state-stack.test.ts +118 -0
- package/src/undo-redo-stack/state-stack.ts +133 -0
- package/src/uuid/index.ts +7 -0
- package/src/uuid/uuid.ts +86 -0
- package/src/worker/cors-worker.ts +38 -0
- package/src/worker/index.ts +4 -0
- package/src/worker/node_modules/.vitest/results.json +1 -0
- package/src/worker/promise-worker-main-thread.test.ts +91 -0
- package/src/worker/promise-worker-main-thread.ts +76 -0
- package/src/worker/promise-worker-worker-thread.ts +64 -0
- package/src/worker/promise-worker.interface.ts +15 -0
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
// src/_internal/logger.ts
|
|
2
|
+
var Logger = {
|
|
3
|
+
error(...data) {
|
|
4
|
+
if (typeof console.error === "function") {
|
|
5
|
+
console.error(...data);
|
|
6
|
+
}
|
|
7
|
+
},
|
|
8
|
+
info(...data) {
|
|
9
|
+
if (typeof console.info === "function") {
|
|
10
|
+
console.info(...data);
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
log(...data) {
|
|
14
|
+
if (typeof console.log === "function") {
|
|
15
|
+
console.log(...data);
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
time(label) {
|
|
19
|
+
if (typeof console.time === "function") {
|
|
20
|
+
console.time(label);
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
timeEnd(label) {
|
|
24
|
+
if (typeof console.timeEnd === "function") {
|
|
25
|
+
console.timeEnd(label);
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
timeLog(label, ...data) {
|
|
29
|
+
if (typeof console.timeLog === "function") {
|
|
30
|
+
console.timeLog(label, ...data);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
timeStamp(label) {
|
|
34
|
+
if (typeof console.timeStamp === "function") {
|
|
35
|
+
console.timeStamp(label);
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
trace(...data) {
|
|
39
|
+
if (typeof console.trace === "function") {
|
|
40
|
+
console.trace(...data);
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
warn(...data) {
|
|
44
|
+
if (typeof console.warn === "function") {
|
|
45
|
+
console.warn(...data);
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
profile(label) {
|
|
49
|
+
if (typeof console.profile === "function") {
|
|
50
|
+
console.profile(label);
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
profileEnd(label) {
|
|
54
|
+
if (typeof console.profileEnd === "function") {
|
|
55
|
+
console.profileEnd(label);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
// src/dispose/dispose-base.ts
|
|
61
|
+
var EmptyDispose = Object.freeze({ dispose() {
|
|
62
|
+
} });
|
|
63
|
+
|
|
64
|
+
// src/assert/assert.ts
|
|
65
|
+
function abort(reason) {
|
|
66
|
+
throw new Error(`lvAssert(${reason})`);
|
|
67
|
+
}
|
|
68
|
+
function lvAssert(expr, reason) {
|
|
69
|
+
if (!expr) {
|
|
70
|
+
abort("#expr is false");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// src/dispose/disposable-t.ts
|
|
75
|
+
var SafeDisposable = class {
|
|
76
|
+
constructor(value) {
|
|
77
|
+
this._value = value;
|
|
78
|
+
}
|
|
79
|
+
get value() {
|
|
80
|
+
return this._value;
|
|
81
|
+
}
|
|
82
|
+
isEmpty() {
|
|
83
|
+
return this._value === void 0;
|
|
84
|
+
}
|
|
85
|
+
dispose() {
|
|
86
|
+
if (!this._value) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
this._value.dispose();
|
|
90
|
+
this._value = void 0;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
// src/dispose/disposable-utils.ts
|
|
95
|
+
function makeSafeDisposable(fn) {
|
|
96
|
+
const disposable = new SafeDisposable({
|
|
97
|
+
dispose: fn
|
|
98
|
+
});
|
|
99
|
+
return disposable;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// src/structure/linked-list.ts
|
|
103
|
+
var ListNode = class {
|
|
104
|
+
constructor(value, next = null, prev = null) {
|
|
105
|
+
this.value = value;
|
|
106
|
+
this.next = next;
|
|
107
|
+
this.prev = prev;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
var LinkedList = class {
|
|
111
|
+
constructor() {
|
|
112
|
+
this._head = null;
|
|
113
|
+
this._tail = null;
|
|
114
|
+
this._count = 0;
|
|
115
|
+
}
|
|
116
|
+
get size() {
|
|
117
|
+
return this._count;
|
|
118
|
+
}
|
|
119
|
+
get firstNode() {
|
|
120
|
+
return this._head;
|
|
121
|
+
}
|
|
122
|
+
isEmpty() {
|
|
123
|
+
return this._head === null;
|
|
124
|
+
}
|
|
125
|
+
clear() {
|
|
126
|
+
let current = this._head;
|
|
127
|
+
while (current !== null) {
|
|
128
|
+
const next = current.next;
|
|
129
|
+
current.prev = null;
|
|
130
|
+
current.next = null;
|
|
131
|
+
current = next;
|
|
132
|
+
}
|
|
133
|
+
this._head = null;
|
|
134
|
+
this._tail = null;
|
|
135
|
+
this._count = 0;
|
|
136
|
+
}
|
|
137
|
+
unshift(value) {
|
|
138
|
+
const node = new ListNode(value);
|
|
139
|
+
if (this.isEmpty()) {
|
|
140
|
+
this._head = node;
|
|
141
|
+
this._tail = node;
|
|
142
|
+
} else {
|
|
143
|
+
const oldHead = this._head;
|
|
144
|
+
this._head = node;
|
|
145
|
+
node.next = oldHead;
|
|
146
|
+
oldHead.prev = node;
|
|
147
|
+
}
|
|
148
|
+
this._count++;
|
|
149
|
+
return this;
|
|
150
|
+
}
|
|
151
|
+
push(value) {
|
|
152
|
+
const node = new ListNode(value);
|
|
153
|
+
if (this.isEmpty()) {
|
|
154
|
+
this._head = node;
|
|
155
|
+
this._tail = node;
|
|
156
|
+
} else {
|
|
157
|
+
const oldTail = this._tail;
|
|
158
|
+
this._tail = node;
|
|
159
|
+
node.prev = oldTail;
|
|
160
|
+
oldTail.next = node;
|
|
161
|
+
}
|
|
162
|
+
this._count++;
|
|
163
|
+
return this;
|
|
164
|
+
}
|
|
165
|
+
shift() {
|
|
166
|
+
if (this.isEmpty()) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
const node = this._head;
|
|
170
|
+
const value = node.value;
|
|
171
|
+
this._remove(node);
|
|
172
|
+
return value;
|
|
173
|
+
}
|
|
174
|
+
pop() {
|
|
175
|
+
if (this.isEmpty()) {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
const node = this._tail;
|
|
179
|
+
const value = node.value;
|
|
180
|
+
this._remove(node);
|
|
181
|
+
return value;
|
|
182
|
+
}
|
|
183
|
+
toArray() {
|
|
184
|
+
const result = [];
|
|
185
|
+
for (const value of this) {
|
|
186
|
+
result.push(value);
|
|
187
|
+
}
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
*[Symbol.iterator]() {
|
|
191
|
+
let current = this._head;
|
|
192
|
+
while (current !== null) {
|
|
193
|
+
yield current.value;
|
|
194
|
+
current = current.next;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
_remove(node) {
|
|
198
|
+
if (node.prev === null && node.next === null && node !== this._head && node !== this._tail) {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (node === this._head) {
|
|
202
|
+
this._head = node.next;
|
|
203
|
+
if (this._head) {
|
|
204
|
+
this._head.prev = null;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (node === this._tail) {
|
|
208
|
+
this._tail = node.prev;
|
|
209
|
+
if (this._tail) {
|
|
210
|
+
this._tail.next = null;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
if (node.prev) {
|
|
214
|
+
node.prev.next = node.next;
|
|
215
|
+
}
|
|
216
|
+
if (node.next) {
|
|
217
|
+
node.next.prev = node.prev;
|
|
218
|
+
}
|
|
219
|
+
node.prev = null;
|
|
220
|
+
node.next = null;
|
|
221
|
+
this._count--;
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
// src/event/disposable-linked-list.ts
|
|
226
|
+
var DisposableLinkedList = class extends LinkedList {
|
|
227
|
+
unshiftAndGetDisposableNode(value) {
|
|
228
|
+
this.unshift(value);
|
|
229
|
+
const node = this._head;
|
|
230
|
+
let hasRemoved = false;
|
|
231
|
+
return () => {
|
|
232
|
+
if (!hasRemoved) {
|
|
233
|
+
hasRemoved = true;
|
|
234
|
+
super._remove(node);
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
pushAndGetDisposableNode(value) {
|
|
239
|
+
this.push(value);
|
|
240
|
+
const node = this._tail;
|
|
241
|
+
let hasRemoved = false;
|
|
242
|
+
return () => {
|
|
243
|
+
if (!hasRemoved) {
|
|
244
|
+
hasRemoved = true;
|
|
245
|
+
super._remove(node);
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
// src/event/error-handler.ts
|
|
252
|
+
function asyncUnexpectedError(e) {
|
|
253
|
+
setTimeout(() => {
|
|
254
|
+
throw e;
|
|
255
|
+
}, 0);
|
|
256
|
+
}
|
|
257
|
+
function syncUnexpectedError(e) {
|
|
258
|
+
throw e;
|
|
259
|
+
}
|
|
260
|
+
function ignoreUnexpectedError(e) {
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// src/event/emitter.ts
|
|
264
|
+
var Listener = class {
|
|
265
|
+
constructor(callback, callbackThis) {
|
|
266
|
+
this._callback = callback;
|
|
267
|
+
this._callbackThis = callbackThis;
|
|
268
|
+
}
|
|
269
|
+
invoke(...args) {
|
|
270
|
+
this._callback.call(this._callbackThis, ...args);
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
var EventDeliveryQueueElement = class {
|
|
274
|
+
constructor(emitter, listener, event) {
|
|
275
|
+
this.emitter = emitter;
|
|
276
|
+
this.listener = listener;
|
|
277
|
+
this.event = event;
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
var EventDeliveryQueue = class {
|
|
281
|
+
constructor(_onListenerError = asyncUnexpectedError) {
|
|
282
|
+
this._onListenerError = _onListenerError;
|
|
283
|
+
this._queue = new DisposableLinkedList();
|
|
284
|
+
}
|
|
285
|
+
get size() {
|
|
286
|
+
return this._queue.size;
|
|
287
|
+
}
|
|
288
|
+
push(emitter, listener, event) {
|
|
289
|
+
this._queue.push(new EventDeliveryQueueElement(emitter, listener, event));
|
|
290
|
+
}
|
|
291
|
+
clear(emitter) {
|
|
292
|
+
const newQueue = new DisposableLinkedList();
|
|
293
|
+
for (const element of this._queue) {
|
|
294
|
+
if (element.emitter !== emitter) {
|
|
295
|
+
newQueue.push(element);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
this._queue = newQueue;
|
|
299
|
+
}
|
|
300
|
+
deliver() {
|
|
301
|
+
while (this._queue.size > 0) {
|
|
302
|
+
const element = this._queue.shift();
|
|
303
|
+
try {
|
|
304
|
+
element.listener.invoke(...element.event);
|
|
305
|
+
} catch (e) {
|
|
306
|
+
this._onListenerError(e);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
var Emitter = class {
|
|
312
|
+
constructor(options) {
|
|
313
|
+
this._disposed = false;
|
|
314
|
+
this._options = options;
|
|
315
|
+
}
|
|
316
|
+
get event() {
|
|
317
|
+
if (this._event) {
|
|
318
|
+
return this._event;
|
|
319
|
+
}
|
|
320
|
+
this._event = (callback, thisArgs) => {
|
|
321
|
+
const listener = new Listener(callback, thisArgs);
|
|
322
|
+
if (!this._listeners) {
|
|
323
|
+
this._listeners = new DisposableLinkedList();
|
|
324
|
+
}
|
|
325
|
+
const removeListener = this._listeners.pushAndGetDisposableNode(listener);
|
|
326
|
+
if (this._options?.onAddListener) {
|
|
327
|
+
this._options.onAddListener(this, callback, thisArgs);
|
|
328
|
+
}
|
|
329
|
+
const result = () => {
|
|
330
|
+
if (!this._disposed) {
|
|
331
|
+
removeListener();
|
|
332
|
+
if (this._options?.onRemoveListener) {
|
|
333
|
+
this._options.onRemoveListener(this, callback, thisArgs);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
return makeSafeDisposable(result);
|
|
338
|
+
};
|
|
339
|
+
return this._event;
|
|
340
|
+
}
|
|
341
|
+
dispose() {
|
|
342
|
+
if (this._disposed) {
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
this._disposed = true;
|
|
346
|
+
this._listeners?.clear();
|
|
347
|
+
this._deliveryQueue?.clear(this);
|
|
348
|
+
}
|
|
349
|
+
fire(...event) {
|
|
350
|
+
if (!this._listeners || this._listeners.size === 0) {
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
if (this._listeners.size === 1) {
|
|
354
|
+
const listener = this._listeners.firstNode;
|
|
355
|
+
try {
|
|
356
|
+
listener.value.invoke(...event);
|
|
357
|
+
} catch (e) {
|
|
358
|
+
if (this._options?.onListenerError) {
|
|
359
|
+
this._options.onListenerError(e);
|
|
360
|
+
} else {
|
|
361
|
+
asyncUnexpectedError(e);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
this._deliveryQueue ?? (this._deliveryQueue = new EventDeliveryQueue(this._options?.onListenerError));
|
|
367
|
+
for (const listener of this._listeners) {
|
|
368
|
+
this._deliveryQueue.push(this, listener, event);
|
|
369
|
+
}
|
|
370
|
+
this._deliveryQueue.deliver();
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
// src/event/shortcut-event-utils.ts
|
|
375
|
+
function makeSyncShortcutEvent(val) {
|
|
376
|
+
return function(callback) {
|
|
377
|
+
callback(val);
|
|
378
|
+
return {
|
|
379
|
+
dispose() {
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
function makeAsyncShortcutEvent(val) {
|
|
385
|
+
return function(callback) {
|
|
386
|
+
const handle = setTimeout(() => {
|
|
387
|
+
callback(val);
|
|
388
|
+
}, 0);
|
|
389
|
+
return {
|
|
390
|
+
dispose() {
|
|
391
|
+
clearTimeout(handle);
|
|
392
|
+
}
|
|
393
|
+
};
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// src/event/phase-emitter.ts
|
|
398
|
+
function defaultCheck(_before, _after) {
|
|
399
|
+
return true;
|
|
400
|
+
}
|
|
401
|
+
var ShortcutEventMode = /* @__PURE__ */ ((ShortcutEventMode2) => {
|
|
402
|
+
ShortcutEventMode2[ShortcutEventMode2["Async"] = 0] = "Async";
|
|
403
|
+
ShortcutEventMode2[ShortcutEventMode2["Sync"] = 1] = "Sync";
|
|
404
|
+
return ShortcutEventMode2;
|
|
405
|
+
})(ShortcutEventMode || {});
|
|
406
|
+
var PhaseEmitter = class {
|
|
407
|
+
constructor(_currentPhase, config = {}, _phaseChecker = defaultCheck, _options) {
|
|
408
|
+
this._currentPhase = _currentPhase;
|
|
409
|
+
this._phaseChecker = _phaseChecker;
|
|
410
|
+
this._options = _options;
|
|
411
|
+
this._phaseEmitterMap = /* @__PURE__ */ new Map();
|
|
412
|
+
this._phaseChecker = config.checker ?? defaultCheck;
|
|
413
|
+
const shortcutEventMode = config.shortcutEventMode ?? 0 /* Async */;
|
|
414
|
+
this._shortcutEvent = shortcutEventMode === 0 /* Async */ ? makeAsyncShortcutEvent : makeSyncShortcutEvent;
|
|
415
|
+
}
|
|
416
|
+
get currentPhase() {
|
|
417
|
+
return this._currentPhase;
|
|
418
|
+
}
|
|
419
|
+
get event() {
|
|
420
|
+
if (!this._globalEmitter) {
|
|
421
|
+
this._globalEmitter = new Emitter();
|
|
422
|
+
}
|
|
423
|
+
return this._globalEmitter.event;
|
|
424
|
+
}
|
|
425
|
+
get whenPhase() {
|
|
426
|
+
if (this._phaseEvent) {
|
|
427
|
+
return this._phaseEvent;
|
|
428
|
+
}
|
|
429
|
+
this._phaseEvent = (phase, listener) => {
|
|
430
|
+
if (this._currentPhase === phase) {
|
|
431
|
+
return this._shortcutEvent(this._currentPhase)(listener);
|
|
432
|
+
}
|
|
433
|
+
if (!this._phaseEmitterMap.has(phase)) {
|
|
434
|
+
this._setPhaseEmitter(phase);
|
|
435
|
+
}
|
|
436
|
+
return this._phaseEmitterMap.get(phase).fn(listener);
|
|
437
|
+
};
|
|
438
|
+
return this._phaseEvent;
|
|
439
|
+
}
|
|
440
|
+
when(phase) {
|
|
441
|
+
if (this._currentPhase === phase) {
|
|
442
|
+
return this._shortcutEvent(phase);
|
|
443
|
+
}
|
|
444
|
+
if (!this._phaseEmitterMap.has(phase)) {
|
|
445
|
+
this._setPhaseEmitter(phase);
|
|
446
|
+
}
|
|
447
|
+
return this._phaseEmitterMap.get(phase).fn;
|
|
448
|
+
}
|
|
449
|
+
dispose() {
|
|
450
|
+
for (const [_phase, emitter] of this._phaseEmitterMap) {
|
|
451
|
+
emitter.emitter.dispose();
|
|
452
|
+
}
|
|
453
|
+
this._globalEmitter?.dispose();
|
|
454
|
+
}
|
|
455
|
+
setPhase(phase) {
|
|
456
|
+
if (this._currentPhase === phase) {
|
|
457
|
+
Logger.warn(`duplicate set phase: ${phase}.`);
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
lvAssert(this._phaseChecker(this._currentPhase, phase));
|
|
461
|
+
this._currentPhase = phase;
|
|
462
|
+
this._phaseEmitterMap.get(phase)?.emitter.fire();
|
|
463
|
+
this._globalEmitter?.fire(phase);
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* 该接口为了和emitter对齐,优先使用setPhase
|
|
467
|
+
* @deprecated 优先使用setPhase,未来可能会去掉
|
|
468
|
+
*/
|
|
469
|
+
fire(phase) {
|
|
470
|
+
this.setPhase(phase);
|
|
471
|
+
}
|
|
472
|
+
_setPhaseEmitter(phase) {
|
|
473
|
+
const emitter = new Emitter(this._options);
|
|
474
|
+
this._phaseEmitterMap.set(phase, {
|
|
475
|
+
emitter,
|
|
476
|
+
fn: (listener) => {
|
|
477
|
+
if (this._currentPhase === phase) {
|
|
478
|
+
return this._shortcutEvent(this._currentPhase)(listener);
|
|
479
|
+
}
|
|
480
|
+
return emitter.event(listener);
|
|
481
|
+
}
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
};
|
|
485
|
+
|
|
486
|
+
// src/event/once.ts
|
|
487
|
+
function listenOnce(event) {
|
|
488
|
+
return (listener, thisArgs = null) => {
|
|
489
|
+
let didFire = false;
|
|
490
|
+
let result = void 0;
|
|
491
|
+
result = event((...args) => {
|
|
492
|
+
if (didFire) {
|
|
493
|
+
return;
|
|
494
|
+
} else if (result) {
|
|
495
|
+
result.dispose();
|
|
496
|
+
} else {
|
|
497
|
+
didFire = true;
|
|
498
|
+
}
|
|
499
|
+
return listener.call(thisArgs, ...args);
|
|
500
|
+
}, null);
|
|
501
|
+
if (didFire) {
|
|
502
|
+
result.dispose();
|
|
503
|
+
}
|
|
504
|
+
return result;
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
// src/event/when.ts
|
|
509
|
+
function listenWhen(event, predicate) {
|
|
510
|
+
return (listener, thisArgs = null) => {
|
|
511
|
+
let hasBeenFulfilled = false;
|
|
512
|
+
let result = void 0;
|
|
513
|
+
result = event((...args) => {
|
|
514
|
+
if (hasBeenFulfilled) {
|
|
515
|
+
result?.dispose();
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
hasBeenFulfilled = predicate(...args);
|
|
519
|
+
if (hasBeenFulfilled) {
|
|
520
|
+
listener.call(thisArgs, ...args);
|
|
521
|
+
result?.dispose();
|
|
522
|
+
}
|
|
523
|
+
}, null);
|
|
524
|
+
if (hasBeenFulfilled) {
|
|
525
|
+
result.dispose();
|
|
526
|
+
}
|
|
527
|
+
return result;
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
// src/event/utils.ts
|
|
532
|
+
var NeverEvent = () => {
|
|
533
|
+
return EmptyDispose;
|
|
534
|
+
};
|
|
535
|
+
|
|
536
|
+
export { Emitter, NeverEvent, PhaseEmitter, ShortcutEventMode, asyncUnexpectedError, ignoreUnexpectedError, listenOnce, listenWhen, makeAsyncShortcutEvent, makeSyncShortcutEvent, syncUnexpectedError };
|
|
537
|
+
//# sourceMappingURL=index.js.map
|
|
538
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/_internal/logger.ts","../../src/dispose/dispose-base.ts","../../src/assert/assert.ts","../../src/dispose/disposable-t.ts","../../src/dispose/disposable-utils.ts","../../src/structure/linked-list.ts","../../src/event/disposable-linked-list.ts","../../src/event/error-handler.ts","../../src/event/emitter.ts","../../src/event/shortcut-event-utils.ts","../../src/event/phase-emitter.ts","../../src/event/once.ts","../../src/event/when.ts","../../src/event/utils.ts"],"names":["ShortcutEventMode"],"mappings":"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","file":"index.js","sourcesContent":["/* eslint-disable no-console */\n\nexport const Logger = {\n error(...data: any[]): void {\n if (typeof console.error === 'function') {\n console.error(...data);\n }\n },\n info(...data: any[]): void {\n if (typeof console.info === 'function') {\n console.info(...data);\n }\n },\n log(...data: any[]): void {\n if (typeof console.log === 'function') {\n console.log(...data);\n }\n },\n time(label?: string): void {\n if (typeof console.time === 'function') {\n console.time(label);\n }\n },\n timeEnd(label?: string): void {\n if (typeof console.timeEnd === 'function') {\n console.timeEnd(label);\n }\n },\n timeLog(label?: string, ...data: any[]): void {\n if (typeof console.timeLog === 'function') {\n console.timeLog(label, ...data);\n }\n },\n timeStamp(label?: string): void {\n if (typeof console.timeStamp === 'function') {\n console.timeStamp(label);\n }\n },\n trace(...data: any[]): void {\n if (typeof console.trace === 'function') {\n console.trace(...data);\n }\n },\n warn(...data: any[]): void {\n if (typeof console.warn === 'function') {\n console.warn(...data);\n }\n },\n profile(label?: string): void {\n if (typeof console.profile === 'function') {\n console.profile(label);\n }\n },\n profileEnd(label?: string): void {\n if (typeof console.profileEnd === 'function') {\n console.profileEnd(label);\n }\n },\n};\n","//\n// Disposable特征约束\n//\nexport interface IDisposable {\n dispose: () => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport const EmptyDispose = Object.freeze<IDisposable>({ dispose() {} });\n","function abort(reason: string): never {\n throw new Error(`lvAssert(${reason})`);\n}\n\n/**\n * 断言表达式为真\n * @param expr \n * @param reason \n */\nexport function lvAssert(expr: unknown, reason?: string): asserts expr {\n if (!expr) {\n abort(reason ?? '#expr is false');\n }\n}\n\n/**\n * 断言deadcode路径\n * @param reason \n */\nexport function lvAssertNotHere(reason?: string): never {\n abort(reason ?? 'unreachable code flow');\n}\n\n/**\n * 断言类型不可达\n * @param member \n * @param message \n */\nexport function lvAssertNever(member: never, message = 'Illegal value:'): never {\n abort(`${message}: ${member}`);\n}\n\n/**\n * 断言变量为null或者undefined\n * @param val \n * @param reason \n */\nexport function lvAssertNotNil<T>(val: T, reason?: string): asserts val is NonNullable<T> {\n if (val === null || val === undefined) {\n abort(reason ?? '#val is nil');\n }\n}\n","import { Logger } from '@/_internal/logger';\nimport { lvAssertNotNil } from '@/assert';\nimport { DisposableStore } from './disposable-store';\nimport type { IDisposable } from './dispose-base';\nimport { BRANCH_DISPOSE } from './logger';\nimport { MARK_AS_DISPOSED, SET_PARENT_OF_DISPOSABLE, TRACK_DISPOSABLE } from './tracker';\n\n//\n// Disposable基类\n//\n// 自动添加DisposableStore,提供默认的dispose和register方法\n//\nexport abstract class Disposable implements IDisposable {\n protected readonly _store = new DisposableStore();\n\n constructor() {\n TRACK_DISPOSABLE(this);\n SET_PARENT_OF_DISPOSABLE(this._store, this);\n }\n\n // 销毁该节点和所有的子节点\n dispose(): void {\n MARK_AS_DISPOSED(this);\n BRANCH_DISPOSE(this.constructor.name, this._store.constructor.name);\n\n this._store.dispose();\n }\n\n // 挂载子节点\n protected _register<T extends IDisposable>(o: T): T {\n if ((o as unknown as Disposable) === this) {\n throw new Error('Cannot register a disposable on itself!');\n }\n return this._store.add(o);\n }\n}\n\n/**\n * 容器类\n * 提供一个容器,容器内部的IDisposable对象可以切换更新,每次更新的时候,旧的IDisposable对象会自动进行dispose\n *\n * 使用方式:\n * class Foo {\n * private readonly _barRef: MutableDisposable;\n *\n * toggle() {\n * this._barRef.setValue(new Bar());\n * }\n *\n * doSomething() {\n * this._barRef.value.xxx();\n * }\n * }\n */\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n private _value?: T;\n private _isDisposed = false;\n\n constructor(value?: T) {\n TRACK_DISPOSABLE(this);\n this.value = value;\n }\n\n get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n\n this._value?.dispose();\n if (value) {\n SET_PARENT_OF_DISPOSABLE(value, this);\n }\n this._value = value;\n }\n\n clear(): void {\n this.value = undefined;\n }\n\n dispose(): void {\n this._isDisposed = true;\n MARK_AS_DISPOSED(this);\n this._value?.dispose();\n this._value = undefined;\n }\n\n release(): T | undefined {\n const oldValue = this._value;\n this._value = undefined;\n if (oldValue) {\n SET_PARENT_OF_DISPOSABLE(oldValue, null);\n }\n return oldValue;\n }\n}\n\n/**\n * 容器类\n * 通过该容器进行dispose试,可以保证内部的IDisposable一会进行一次dispose\n * 本质是一种防御性质的处理,如果需要使用时,最好有明确的理由\n */\nexport class SafeDisposable<T extends IDisposable> implements IDisposable {\n private _value?: T;\n\n constructor(value: T) {\n this._value = value;\n TRACK_DISPOSABLE(this);\n }\n\n get value(): T | undefined {\n return this._value;\n }\n\n isEmpty() {\n return this._value === undefined;\n }\n\n dispose() {\n if (!this._value) {\n return;\n }\n this._value.dispose();\n this._value = undefined;\n MARK_AS_DISPOSED(this);\n }\n}\n\n/**\n * 容器类\n * 引用计数容器,当引用为0时自动执行dispose\n * 注意:初始计数为1,默认构造的地方自动获得引用,如果在栈上构造,记得最后调用release\n *\n * 使用实例:\n * class Foo {\n * private _bar: RefCountedDisposable = new RefCountedDisposable(new Bar());\n *\n * getBar() {\n * this._bar.acquire();\n * return this._bar;\n * }\n * }\n *\n * // 如果在栈上构造\n * const bar = new RefCountedDisposable(new Bar());\n * makeFoo(bar);\n * makeFoo(bar);\n * bar.release();\n */\nexport class RefCountedDisposable<T extends IDisposable> implements IDisposable {\n private _counter: number = 1;\n private _value?: T;\n\n constructor(value: T) {\n this._value = value;\n TRACK_DISPOSABLE(this);\n }\n\n get value(): T | undefined {\n return this._value;\n }\n\n acquire() {\n if (!this._value) {\n return this;\n }\n this._counter++;\n return this;\n }\n\n release() {\n if (--this._counter === 0) {\n this._value!.dispose();\n this._value = undefined;\n MARK_AS_DISPOSED(this);\n }\n return this;\n }\n\n dispose() {\n this.release();\n }\n}\n\n/**\n * 容器类,表示了一个T生命周期的转移\n *\n * 由于js引用传递的特性,正常情况下,我们默认为传递过来的对象不具备dispose权利\n * class Foo extends Disposable {\n * private readonly _bar = new Bar();\n *\n * constructor(\n * thirdparty: Thirdparty,\n * ) {\n * this._register(this._bar); // class内部构造的,具备dispose权利\n * this._register(thirdparty); // ❌,很少会直接这么写,除非能很确定存在生命周期转移\n * }\n *\n * constructor(\n * thirdparty: TransferDisposable<Thirdparty>, // ✅,明确表示了我依赖了Thirdparty,但是该对象生命周期要归我所有\n * ) {\n * this._register(this._bar);\n * this._register(thirdparty.release()); // ✅,可以直接register\n * }\n * }\n *\n * 注意:\n * 不同于C++中的unique_ptr,该class只作用于转移场景。\n * 所以class理论上只在栈上出现,不应该在堆上存在。\n * 如果出现了需要在堆上存储的场景,可以联系架构侧\n */\nexport class TransferDisposable<T extends IDisposable> extends Disposable {\n private _val?: T;\n\n constructor(val: T) {\n super();\n\n this._val = val;\n }\n\n release() {\n // 只能release一次\n lvAssertNotNil(this._val);\n const v = this._val;\n this._val = undefined;\n return v;\n }\n\n dispose(): void {\n // 虽然它有dispose,但是不应该被执行,应该直接被gc才对\n Logger.warn(new Error('TransferDisposable call dispose.'));\n this._val?.dispose();\n super.dispose();\n }\n}\n","import { SafeDisposable, TransferDisposable } from './disposable-t';\nimport { EmptyDispose, type IDisposable } from './dispose-base';\nimport { MARK_AS_LEAKED } from './tracker';\n\nexport function makeSafeDisposable(fn: (...args: any) => any) {\n const disposable = new SafeDisposable({\n dispose: fn,\n });\n return disposable;\n}\n\nexport function makeEmptyDisposable() {\n return EmptyDispose;\n}\n\n// 忽略dispose\nexport function ignoreDispose(x: IDisposable) {\n MARK_AS_LEAKED(x);\n}\n\n// 判断一个thing是否是disposable\nexport function isDisposable<E = any>(thing: E): thing is E & IDisposable {\n return typeof (thing as IDisposable).dispose === 'function' && (thing as IDisposable).dispose.length === 0;\n}\n\nexport function makeTransferDisposable<T extends IDisposable>(val: T) {\n return new TransferDisposable(val);\n}\n","class ListNode<T> {\n constructor(\n public value: T,\n public next: ListNode<T> | null = null,\n public prev: ListNode<T> | null = null,\n ) {}\n}\n\nexport class LinkedList<T> {\n protected _head: ListNode<T> | null = null;\n protected _tail: ListNode<T> | null = null;\n protected _count = 0;\n\n public get size(): number {\n return this._count;\n }\n\n public get firstNode(): ListNode<T> | null {\n return this._head;\n }\n\n public isEmpty(): boolean {\n return this._head === null;\n }\n\n public clear(): void {\n let current = this._head;\n while (current !== null) {\n const next = current.next;\n current.prev = null;\n current.next = null;\n current = next;\n }\n\n this._head = null;\n this._tail = null;\n this._count = 0;\n }\n\n public unshift(value: T): LinkedList<T> {\n const node = new ListNode(value);\n\n if (this.isEmpty()) {\n this._head = node;\n this._tail = node;\n } else {\n const oldHead = this._head;\n this._head = node;\n node.next = oldHead;\n oldHead!.prev = node;\n }\n\n this._count++;\n return this;\n }\n\n public push(value: T): LinkedList<T> {\n const node = new ListNode(value);\n\n if (this.isEmpty()) {\n this._head = node;\n this._tail = node;\n } else {\n const oldTail = this._tail;\n this._tail = node;\n node.prev = oldTail;\n oldTail!.next = node;\n }\n\n this._count++;\n return this;\n }\n\n public shift(): T | null {\n if (this.isEmpty()) {\n return null;\n }\n\n const node = this._head!;\n const value = node.value;\n this._remove(node);\n return value;\n }\n\n public pop(): T | null {\n if (this.isEmpty()) {\n return null;\n }\n\n const node = this._tail!;\n const value = node.value;\n this._remove(node);\n return value;\n }\n\n public toArray(): T[] {\n const result: T[] = [];\n for (const value of this) {\n result.push(value);\n }\n return result;\n }\n\n public *[Symbol.iterator](): Iterator<T> {\n let current = this._head;\n while (current !== null) {\n yield current.value;\n current = current.next;\n }\n }\n\n protected _remove(node: ListNode<T>): void {\n // 如果节点已经被移除(prev 和 next 都为 null),直接返回\n if (node.prev === null && node.next === null && node !== this._head && node !== this._tail) {\n return;\n }\n\n // 更新链表头尾指针\n if (node === this._head) {\n this._head = node.next;\n if (this._head) {\n this._head.prev = null;\n }\n }\n if (node === this._tail) {\n this._tail = node.prev;\n if (this._tail) {\n this._tail.next = null;\n }\n }\n\n // 更新相邻节点的引用\n if (node.prev) {\n node.prev.next = node.next;\n }\n if (node.next) {\n node.next.prev = node.prev;\n }\n\n // 清理被移除节点的引用\n node.prev = null;\n node.next = null;\n this._count--;\n }\n}\n","import { LinkedList } from '@/structure/linked-list';\n\nexport class DisposableLinkedList<T> extends LinkedList<T> {\n unshiftAndGetDisposableNode(value: T): () => void {\n this.unshift(value);\n\n const node = this._head!;\n let hasRemoved = false;\n return (): void => {\n if (!hasRemoved) {\n hasRemoved = true;\n super._remove(node);\n }\n };\n }\n\n pushAndGetDisposableNode(value: T): () => void {\n this.push(value);\n\n const node = this._tail!;\n let hasRemoved = false;\n return (): void => {\n if (!hasRemoved) {\n hasRemoved = true;\n super._remove(node);\n }\n };\n }\n}\n","/**\n * 针对未捕获的错误,异步抛出,不阻塞事件响应主流程\n * 默认模式\n */\nexport function asyncUnexpectedError(e: any): void {\n setTimeout(() => {\n throw e;\n }, 0);\n}\n\n/**\n * 针对未捕获的错误,同步抛出,阻塞事件响应主流程\n */\nexport function syncUnexpectedError(e: any): void {\n throw e;\n}\n\n/**\n * 针对未捕获的错误,静默掉,不进行处理\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport function ignoreUnexpectedError(e: any): void {}\n","import { makeSafeDisposable } from '@/dispose';\nimport type { IDisposable } from '@/dispose';\nimport { DisposableLinkedList } from './disposable-linked-list';\nimport { asyncUnexpectedError } from './error-handler';\n\nexport interface EmitterOptions {\n onAddListener?: (...args: any) => any;\n onRemoveListener?: (...args: any) => any;\n onListenerError?: (e: any) => void;\n}\n\n//\n// 事件监听中的回调实体\n//\nclass Listener<TArgs extends any[]> {\n private readonly _callback: (...args: TArgs) => void;\n private readonly _callbackThis: any | undefined;\n\n constructor(callback: (...args: TArgs) => void, callbackThis: any | undefined) {\n this._callback = callback;\n this._callbackThis = callbackThis;\n }\n\n invoke(...args: TArgs): void {\n this._callback.call(this._callbackThis, ...args);\n }\n}\n\n//\n// 存放在EventDeliveryQueue中的元素\n//\nclass EventDeliveryQueueElement<TArgs extends any[]> {\n readonly emitter: Emitter<TArgs>;\n readonly listener: Listener<TArgs>;\n readonly event: TArgs;\n constructor(emitter: Emitter<TArgs>, listener: Listener<TArgs>, event: TArgs) {\n this.emitter = emitter;\n this.listener = listener;\n this.event = event;\n }\n}\n\nexport class EventDeliveryQueue {\n protected _queue = new DisposableLinkedList<EventDeliveryQueueElement<any>>();\n\n constructor(private readonly _onListenerError: (e: unknown) => void = asyncUnexpectedError) {}\n\n get size(): number {\n return this._queue.size;\n }\n\n push<TArgs extends any[]>(emitter: Emitter<TArgs>, listener: Listener<TArgs>, event: TArgs): void {\n this._queue.push(new EventDeliveryQueueElement(emitter, listener, event));\n }\n\n clear<TArgs extends any[]>(emitter: Emitter<TArgs>): void {\n const newQueue = new DisposableLinkedList<EventDeliveryQueueElement<TArgs>>();\n for (const element of this._queue) {\n if (element.emitter !== emitter) {\n newQueue.push(element);\n }\n }\n this._queue = newQueue;\n }\n\n deliver(): void {\n while (this._queue.size > 0) {\n const element = this._queue.shift()!;\n try {\n element.listener.invoke(...element.event);\n } catch (e) {\n this._onListenerError(e);\n }\n }\n }\n}\n\nexport interface Event<T extends any[]> {\n (listener: (...args: T) => any, thisArgs?: any): IDisposable;\n}\n\nexport class Emitter<TArgs extends any[]> {\n protected _listeners?: DisposableLinkedList<Listener<TArgs>>;\n private readonly _options?: EmitterOptions;\n private _disposed = false;\n private _event?: Event<TArgs>;\n private _deliveryQueue?: EventDeliveryQueue;\n\n constructor(options?: EmitterOptions) {\n this._options = options;\n }\n\n get event(): Event<TArgs> {\n if (this._event) {\n return this._event;\n }\n\n this._event = (callback: (...args: TArgs) => any, thisArgs?: any): IDisposable => {\n const listener = new Listener(callback, thisArgs);\n\n if (!this._listeners) {\n this._listeners = new DisposableLinkedList();\n }\n\n const removeListener = this._listeners.pushAndGetDisposableNode(listener);\n\n if (this._options?.onAddListener) {\n this._options.onAddListener(this, callback, thisArgs);\n }\n\n // 生成可销毁函数返回\n const result = () => {\n if (!this._disposed) {\n removeListener();\n if (this._options?.onRemoveListener) {\n this._options.onRemoveListener(this, callback, thisArgs);\n }\n }\n };\n\n return makeSafeDisposable(result);\n };\n\n return this._event;\n }\n\n dispose(): void {\n if (this._disposed) {\n return;\n }\n this._disposed = true;\n this._listeners?.clear();\n this._deliveryQueue?.clear(this);\n }\n\n fire(...event: TArgs): void {\n if (!this._listeners || this._listeners.size === 0) {\n return;\n }\n // 绝大部分场景事件只会有一个监听器,针对性进行性能优化,没必要构造DeliveryQueue结构\n if (this._listeners.size === 1) {\n const listener = this._listeners.firstNode!;\n try {\n listener.value.invoke(...event);\n } catch (e) {\n if (this._options?.onListenerError) {\n this._options.onListenerError(e);\n } else {\n asyncUnexpectedError(e);\n }\n }\n return;\n }\n\n this._deliveryQueue ??= new EventDeliveryQueue(this._options?.onListenerError);\n\n for (const listener of this._listeners) {\n this._deliveryQueue.push(this, listener, event);\n }\n this._deliveryQueue.deliver();\n }\n}\n","import type { IDisposable } from '@/dispose';\nimport type { Event } from './emitter';\n\nexport interface IMakeShortcutEvent<T> {\n (val: T): Event<[T]>;\n}\n\nexport function makeSyncShortcutEvent<T>(val: T) {\n return function (callback: (val: T) => void): IDisposable {\n callback(val);\n \n return {\n dispose() {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n },\n };\n };\n}\n\nexport function makeAsyncShortcutEvent<T>(val: T) {\n return function (callback: (val: T) => void): IDisposable {\n const handle = setTimeout(() => {\n callback(val);\n }, 0);\n\n return {\n dispose() {\n clearTimeout(handle);\n },\n };\n };\n}\n\n","import { lvAssert } from '@/assert';\nimport { Emitter, type Event, type EmitterOptions } from './emitter';\nimport {\n type IMakeShortcutEvent,\n makeSyncShortcutEvent,\n makeAsyncShortcutEvent,\n} from './shortcut-event-utils';\nimport type { IDisposable } from '@/dispose';\nimport { Logger } from '@/_internal/logger';\n\nexport interface IPhaseChecker<T> {\n (before: T, after: T): boolean;\n}\n\nfunction defaultCheck<T>(_before: T, _after: T) {\n return true;\n}\n\n/**\n * WhenPhaseEvent相比较Event有如下特点\n * 1. 增加了callback前第一个参数,可以明确listener对应的phase\n * 2. 会进行状态补发\n */\nexport interface WhenPhaseEvent<T> {\n (phase: T, listener: () => any): IDisposable;\n}\n\n/**\n * PhaseEvent相比较Event有如下特点\n * 1. 参数一定为空\n * 2. 会进行状态补发\n */\nexport type PhaseEvent = Event<[]>;\n\ninterface IPhaseEmitter {\n emitter: Emitter<[]>;\n fn: Event<[]>;\n}\n\nexport enum ShortcutEventMode {\n Async,\n Sync,\n}\n\ninterface IPhaseEmitterConfig<T> {\n checker?: IPhaseChecker<T>;\n shortcutEventMode?: ShortcutEventMode;\n}\n\n/**\n * 阶段状态事件触发器,相比较原始的emitter有如下不同\n * 1. 明确了事件类型一定是生命周期的扭转\n * a. 必须传入一个枚举表示阶段状态\n * b. 抛出的事件只能是生命周期扭转,不允许携带参数\n *\n * 2. 当状态已经到达,后监听,进行补发事件\n *\n * -------------------------\n * 注意:由于存在事件补发,所以该事件触发器其实很危险,冲击到了依赖关系\n * 本身A依赖B的某个事件,那么正确的顺序应该是:\n * B模块初始化->A模块初始化->B抛出事件->A监听到事件\n *\n * 但如果存在事件补发,以下流程表面没有问题\n * B模块初始化->B抛出事件->A模块初始化->A监听到事件\n * 实际上可能有两个问题\n * 1. A监听到的事件,并不清楚在A初始化前触发还是初始化后触发,信息丢失\n * 2. B抛出事件,A其实必须要响应,响应晚了其实也是问题\n *\n * 所以事件补发是一件非常危险的事情,不要随意补发。\n * -------------------------\n *\n * 只有状态扭转的事件可以存在合理的补发\n * A监听B的状态变更\n * 一般来说,A模块内代码的写法可能是\n * ```\n * if (B.isReady) {\n * doSomething();\n * } else {\n * B.onReady(doSomething);\n * }\n * ```\n * 这种情况,我们借助事件补发可以变成如下来减少代码量。\n * ```\n * B.onReady(doSomething);\n * ```\n *\n * 最经典的事件补发就是CancellationSourceToken的设计,我们将其抽象出一种通用能力。\n * 使用demo如下:\n * ```\n * enum Phase {\n * Waiting,\n * Eventually,\n * }\n *\n * class Foo {\n * phaseEmitter = new PhaseEmitter<Phase>(Phase.Waiting);\n * // 方式1,监听指定的状态到达\n * // 外部: foo.onEventually(doSomething);\n * onEventually = this.phaseEmitter.when(Phase.Eventually);\n *\n * // 方式2,给予外部更高的自由度\n * // 外部: foo.onPhase(Phase.Eventually, doSomething);\n * onPhase = this.phaseEmitter.whenPhase;\n *\n * // 方式3,监听变更(该方式不会补发)\n * // 外部: foo.onPhaseChange((phase) => doSomething)\n * onPhaseChange = this.phaseEmitter.event;\n * }\n * ```\n * 有问题联系基建侧同学。\n */\nexport class PhaseEmitter<T, K extends T = T> {\n private _globalEmitter?: Emitter<[T]>;\n private readonly _phaseEmitterMap: Map<K, IPhaseEmitter> = new Map();\n private _phaseEvent?: WhenPhaseEvent<T>;\n private readonly _shortcutEvent: IMakeShortcutEvent<T>;\n\n constructor(\n private _currentPhase: K,\n config: IPhaseEmitterConfig<T> = {},\n private readonly _phaseChecker: IPhaseChecker<T> = defaultCheck,\n private readonly _options?: EmitterOptions,\n ) {\n this._phaseChecker = config.checker ?? defaultCheck;\n\n const shortcutEventMode = config.shortcutEventMode ?? ShortcutEventMode.Async;\n this._shortcutEvent =\n shortcutEventMode === ShortcutEventMode.Async ? makeAsyncShortcutEvent : makeSyncShortcutEvent;\n }\n\n get currentPhase() {\n return this._currentPhase;\n }\n\n get event(): Event<[T]> {\n if (!this._globalEmitter) {\n this._globalEmitter = new Emitter<T[]>();\n }\n return this._globalEmitter!.event;\n }\n\n get whenPhase(): WhenPhaseEvent<T> {\n if (this._phaseEvent) {\n return this._phaseEvent;\n }\n\n this._phaseEvent = (phase: T, listener: () => any) => {\n if (this._currentPhase === phase) {\n return this._shortcutEvent(this._currentPhase)(listener);\n }\n if (!this._phaseEmitterMap.has(phase as K)) {\n this._setPhaseEmitter(phase as K);\n }\n return this._phaseEmitterMap.get(phase as K)!.fn(listener);\n };\n\n return this._phaseEvent;\n }\n\n when(phase: K): PhaseEvent {\n if (this._currentPhase === phase) {\n return this._shortcutEvent(phase);\n }\n\n if (!this._phaseEmitterMap.has(phase)) {\n this._setPhaseEmitter(phase);\n }\n return this._phaseEmitterMap.get(phase)!.fn;\n }\n\n dispose(): void {\n for (const [_phase, emitter] of this._phaseEmitterMap) {\n emitter.emitter.dispose();\n }\n this._globalEmitter?.dispose();\n }\n\n setPhase(phase: K): void {\n if (this._currentPhase === phase) {\n Logger.warn(`duplicate set phase: ${phase}.`);\n return;\n }\n lvAssert(this._phaseChecker(this._currentPhase, phase));\n this._currentPhase = phase;\n this._phaseEmitterMap.get(phase)?.emitter.fire();\n this._globalEmitter?.fire(phase);\n }\n\n /**\n * 该接口为了和emitter对齐,优先使用setPhase\n * @deprecated 优先使用setPhase,未来可能会去掉\n */\n fire(phase: K): void {\n this.setPhase(phase);\n }\n\n private _setPhaseEmitter(phase: K) {\n const emitter = new Emitter<[]>(this._options);\n this._phaseEmitterMap.set(phase, {\n emitter,\n fn: (listener: () => any) => {\n if (this._currentPhase === phase) {\n return this._shortcutEvent(this._currentPhase)(listener);\n }\n return emitter.event(listener);\n },\n });\n }\n}\n","import type { Event } from './emitter';\nimport type { IDisposable } from '@/dispose';\n\n// 辅助能力:只监听某个事件一次\nexport function listenOnce<TArgs extends any[]>(event: Event<TArgs>): Event<TArgs> {\n return (listener, thisArgs = null) => {\n let didFire = false;\n // 必须这样写,事件可能同步触发\n // eslint-disable-next-line no-undef-init\n let result: IDisposable | undefined = undefined;\n result = event((...args) => {\n if (didFire) {\n return;\n } else if (result) {\n result.dispose();\n } else {\n didFire = true;\n }\n\n return listener.call(thisArgs, ...args);\n }, null);\n\n if (didFire) {\n result.dispose();\n }\n\n return result;\n };\n}\n","import type { Event } from './emitter';\nimport type { IDisposable } from '@/dispose';\n\n// 辅助能力:监听事件,直到事件满足某种状况为止,此时触发 listener callback 并停止监听\n// 类似 MobX 的 `when`\nexport function listenWhen<TArgs extends any[]>(\n event: Event<TArgs>,\n predicate: (...args: TArgs) => boolean,\n): Event<TArgs> {\n return (listener, thisArgs = null) => {\n let hasBeenFulfilled = false;\n\n // 必须这样写,事件可能同步触发\n // eslint-disable-next-line no-undef-init\n let result: IDisposable | undefined = undefined;\n\n result = event((...args) => {\n if (hasBeenFulfilled) {\n result?.dispose();\n return;\n }\n\n // 是否条件满足\n hasBeenFulfilled = predicate(...args);\n\n // 如果满足条件则触发回调\n if (hasBeenFulfilled) {\n listener.call(thisArgs, ...args);\n result?.dispose();\n }\n }, null);\n\n // 注册事件时可能就会被触发一次?\n if (hasBeenFulfilled) {\n result.dispose();\n }\n\n return result;\n };\n}\n","import { EmptyDispose } from '@/dispose';\nimport type { Event } from './emitter';\n\nexport const NeverEvent: Event<[any]> = () => {\n return EmptyDispose;\n};\n"]}
|