@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,542 @@
|
|
|
1
|
+
// src/dispose/tracker.ts
|
|
2
|
+
|
|
3
|
+
// src/dispose/disposable-t.ts
|
|
4
|
+
var SafeDisposable = class {
|
|
5
|
+
constructor(value) {
|
|
6
|
+
this._value = value;
|
|
7
|
+
}
|
|
8
|
+
get value() {
|
|
9
|
+
return this._value;
|
|
10
|
+
}
|
|
11
|
+
isEmpty() {
|
|
12
|
+
return this._value === void 0;
|
|
13
|
+
}
|
|
14
|
+
dispose() {
|
|
15
|
+
if (!this._value) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
this._value.dispose();
|
|
19
|
+
this._value = void 0;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
// src/dispose/disposable-utils.ts
|
|
24
|
+
function makeSafeDisposable(fn) {
|
|
25
|
+
const disposable = new SafeDisposable({
|
|
26
|
+
dispose: fn
|
|
27
|
+
});
|
|
28
|
+
return disposable;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// src/structure/linked-list.ts
|
|
32
|
+
var ListNode = class {
|
|
33
|
+
constructor(value, next = null, prev = null) {
|
|
34
|
+
this.value = value;
|
|
35
|
+
this.next = next;
|
|
36
|
+
this.prev = prev;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
var LinkedList = class {
|
|
40
|
+
constructor() {
|
|
41
|
+
this._head = null;
|
|
42
|
+
this._tail = null;
|
|
43
|
+
this._count = 0;
|
|
44
|
+
}
|
|
45
|
+
get size() {
|
|
46
|
+
return this._count;
|
|
47
|
+
}
|
|
48
|
+
get firstNode() {
|
|
49
|
+
return this._head;
|
|
50
|
+
}
|
|
51
|
+
isEmpty() {
|
|
52
|
+
return this._head === null;
|
|
53
|
+
}
|
|
54
|
+
clear() {
|
|
55
|
+
let current = this._head;
|
|
56
|
+
while (current !== null) {
|
|
57
|
+
const next = current.next;
|
|
58
|
+
current.prev = null;
|
|
59
|
+
current.next = null;
|
|
60
|
+
current = next;
|
|
61
|
+
}
|
|
62
|
+
this._head = null;
|
|
63
|
+
this._tail = null;
|
|
64
|
+
this._count = 0;
|
|
65
|
+
}
|
|
66
|
+
unshift(value) {
|
|
67
|
+
const node = new ListNode(value);
|
|
68
|
+
if (this.isEmpty()) {
|
|
69
|
+
this._head = node;
|
|
70
|
+
this._tail = node;
|
|
71
|
+
} else {
|
|
72
|
+
const oldHead = this._head;
|
|
73
|
+
this._head = node;
|
|
74
|
+
node.next = oldHead;
|
|
75
|
+
oldHead.prev = node;
|
|
76
|
+
}
|
|
77
|
+
this._count++;
|
|
78
|
+
return this;
|
|
79
|
+
}
|
|
80
|
+
push(value) {
|
|
81
|
+
const node = new ListNode(value);
|
|
82
|
+
if (this.isEmpty()) {
|
|
83
|
+
this._head = node;
|
|
84
|
+
this._tail = node;
|
|
85
|
+
} else {
|
|
86
|
+
const oldTail = this._tail;
|
|
87
|
+
this._tail = node;
|
|
88
|
+
node.prev = oldTail;
|
|
89
|
+
oldTail.next = node;
|
|
90
|
+
}
|
|
91
|
+
this._count++;
|
|
92
|
+
return this;
|
|
93
|
+
}
|
|
94
|
+
shift() {
|
|
95
|
+
if (this.isEmpty()) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
const node = this._head;
|
|
99
|
+
const value = node.value;
|
|
100
|
+
this._remove(node);
|
|
101
|
+
return value;
|
|
102
|
+
}
|
|
103
|
+
pop() {
|
|
104
|
+
if (this.isEmpty()) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
const node = this._tail;
|
|
108
|
+
const value = node.value;
|
|
109
|
+
this._remove(node);
|
|
110
|
+
return value;
|
|
111
|
+
}
|
|
112
|
+
toArray() {
|
|
113
|
+
const result = [];
|
|
114
|
+
for (const value of this) {
|
|
115
|
+
result.push(value);
|
|
116
|
+
}
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
*[Symbol.iterator]() {
|
|
120
|
+
let current = this._head;
|
|
121
|
+
while (current !== null) {
|
|
122
|
+
yield current.value;
|
|
123
|
+
current = current.next;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
_remove(node) {
|
|
127
|
+
if (node.prev === null && node.next === null && node !== this._head && node !== this._tail) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (node === this._head) {
|
|
131
|
+
this._head = node.next;
|
|
132
|
+
if (this._head) {
|
|
133
|
+
this._head.prev = null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (node === this._tail) {
|
|
137
|
+
this._tail = node.prev;
|
|
138
|
+
if (this._tail) {
|
|
139
|
+
this._tail.next = null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (node.prev) {
|
|
143
|
+
node.prev.next = node.next;
|
|
144
|
+
}
|
|
145
|
+
if (node.next) {
|
|
146
|
+
node.next.prev = node.prev;
|
|
147
|
+
}
|
|
148
|
+
node.prev = null;
|
|
149
|
+
node.next = null;
|
|
150
|
+
this._count--;
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
// src/event/disposable-linked-list.ts
|
|
155
|
+
var DisposableLinkedList = class extends LinkedList {
|
|
156
|
+
unshiftAndGetDisposableNode(value) {
|
|
157
|
+
this.unshift(value);
|
|
158
|
+
const node = this._head;
|
|
159
|
+
let hasRemoved = false;
|
|
160
|
+
return () => {
|
|
161
|
+
if (!hasRemoved) {
|
|
162
|
+
hasRemoved = true;
|
|
163
|
+
super._remove(node);
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
pushAndGetDisposableNode(value) {
|
|
168
|
+
this.push(value);
|
|
169
|
+
const node = this._tail;
|
|
170
|
+
let hasRemoved = false;
|
|
171
|
+
return () => {
|
|
172
|
+
if (!hasRemoved) {
|
|
173
|
+
hasRemoved = true;
|
|
174
|
+
super._remove(node);
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
// src/event/error-handler.ts
|
|
181
|
+
function asyncUnexpectedError(e) {
|
|
182
|
+
setTimeout(() => {
|
|
183
|
+
throw e;
|
|
184
|
+
}, 0);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// src/event/emitter.ts
|
|
188
|
+
var Listener = class {
|
|
189
|
+
constructor(callback, callbackThis) {
|
|
190
|
+
this._callback = callback;
|
|
191
|
+
this._callbackThis = callbackThis;
|
|
192
|
+
}
|
|
193
|
+
invoke(...args) {
|
|
194
|
+
this._callback.call(this._callbackThis, ...args);
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
var EventDeliveryQueueElement = class {
|
|
198
|
+
constructor(emitter, listener, event) {
|
|
199
|
+
this.emitter = emitter;
|
|
200
|
+
this.listener = listener;
|
|
201
|
+
this.event = event;
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
var EventDeliveryQueue = class {
|
|
205
|
+
constructor(_onListenerError = asyncUnexpectedError) {
|
|
206
|
+
this._onListenerError = _onListenerError;
|
|
207
|
+
this._queue = new DisposableLinkedList();
|
|
208
|
+
}
|
|
209
|
+
get size() {
|
|
210
|
+
return this._queue.size;
|
|
211
|
+
}
|
|
212
|
+
push(emitter, listener, event) {
|
|
213
|
+
this._queue.push(new EventDeliveryQueueElement(emitter, listener, event));
|
|
214
|
+
}
|
|
215
|
+
clear(emitter) {
|
|
216
|
+
const newQueue = new DisposableLinkedList();
|
|
217
|
+
for (const element of this._queue) {
|
|
218
|
+
if (element.emitter !== emitter) {
|
|
219
|
+
newQueue.push(element);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
this._queue = newQueue;
|
|
223
|
+
}
|
|
224
|
+
deliver() {
|
|
225
|
+
while (this._queue.size > 0) {
|
|
226
|
+
const element = this._queue.shift();
|
|
227
|
+
try {
|
|
228
|
+
element.listener.invoke(...element.event);
|
|
229
|
+
} catch (e) {
|
|
230
|
+
this._onListenerError(e);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
var Emitter = class {
|
|
236
|
+
constructor(options) {
|
|
237
|
+
this._disposed = false;
|
|
238
|
+
this._options = options;
|
|
239
|
+
}
|
|
240
|
+
get event() {
|
|
241
|
+
if (this._event) {
|
|
242
|
+
return this._event;
|
|
243
|
+
}
|
|
244
|
+
this._event = (callback, thisArgs) => {
|
|
245
|
+
const listener = new Listener(callback, thisArgs);
|
|
246
|
+
if (!this._listeners) {
|
|
247
|
+
this._listeners = new DisposableLinkedList();
|
|
248
|
+
}
|
|
249
|
+
const removeListener = this._listeners.pushAndGetDisposableNode(listener);
|
|
250
|
+
if (this._options?.onAddListener) {
|
|
251
|
+
this._options.onAddListener(this, callback, thisArgs);
|
|
252
|
+
}
|
|
253
|
+
const result = () => {
|
|
254
|
+
if (!this._disposed) {
|
|
255
|
+
removeListener();
|
|
256
|
+
if (this._options?.onRemoveListener) {
|
|
257
|
+
this._options.onRemoveListener(this, callback, thisArgs);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
return makeSafeDisposable(result);
|
|
262
|
+
};
|
|
263
|
+
return this._event;
|
|
264
|
+
}
|
|
265
|
+
dispose() {
|
|
266
|
+
if (this._disposed) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
this._disposed = true;
|
|
270
|
+
this._listeners?.clear();
|
|
271
|
+
this._deliveryQueue?.clear(this);
|
|
272
|
+
}
|
|
273
|
+
fire(...event) {
|
|
274
|
+
if (!this._listeners || this._listeners.size === 0) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
if (this._listeners.size === 1) {
|
|
278
|
+
const listener = this._listeners.firstNode;
|
|
279
|
+
try {
|
|
280
|
+
listener.value.invoke(...event);
|
|
281
|
+
} catch (e) {
|
|
282
|
+
if (this._options?.onListenerError) {
|
|
283
|
+
this._options.onListenerError(e);
|
|
284
|
+
} else {
|
|
285
|
+
asyncUnexpectedError(e);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
this._deliveryQueue ?? (this._deliveryQueue = new EventDeliveryQueue(this._options?.onListenerError));
|
|
291
|
+
for (const listener of this._listeners) {
|
|
292
|
+
this._deliveryQueue.push(this, listener, event);
|
|
293
|
+
}
|
|
294
|
+
this._deliveryQueue.deliver();
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
// src/undo-redo-stack/action-stack.ts
|
|
299
|
+
var BaseActionUndoRedoStack = class {
|
|
300
|
+
constructor(_limitSize = Infinity) {
|
|
301
|
+
this._limitSize = _limitSize;
|
|
302
|
+
this._past = [];
|
|
303
|
+
this._future = [];
|
|
304
|
+
this._onDidUndo = new Emitter();
|
|
305
|
+
this._onDidRedo = new Emitter();
|
|
306
|
+
this._onStackChange = new Emitter();
|
|
307
|
+
/**
|
|
308
|
+
* 进行撤销
|
|
309
|
+
*
|
|
310
|
+
* 注意:该方法不允许被子类重写
|
|
311
|
+
*/
|
|
312
|
+
this.undo = () => {
|
|
313
|
+
if (!this.canUndo()) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const elements = this._popPastElements();
|
|
317
|
+
if (elements.length <= 0) {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
for (const elem of elements) {
|
|
321
|
+
elem.undo();
|
|
322
|
+
this._future.push(elem);
|
|
323
|
+
}
|
|
324
|
+
this._onDidUndo.fire(elements);
|
|
325
|
+
this._onStackChange.fire();
|
|
326
|
+
};
|
|
327
|
+
/**
|
|
328
|
+
* 进行重做
|
|
329
|
+
*
|
|
330
|
+
* 注意:该方法不允许被子类重写
|
|
331
|
+
*/
|
|
332
|
+
this.redo = () => {
|
|
333
|
+
if (!this.canRedo()) {
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
const elements = this._popFutureElements();
|
|
337
|
+
if (elements.length <= 0) {
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
for (const elem of elements) {
|
|
341
|
+
elem.redo();
|
|
342
|
+
this._past.push(elem);
|
|
343
|
+
}
|
|
344
|
+
this._onDidRedo.fire(elements);
|
|
345
|
+
this._onStackChange.fire();
|
|
346
|
+
};
|
|
347
|
+
/**
|
|
348
|
+
* 追加操作进入栈中
|
|
349
|
+
*
|
|
350
|
+
* 注意:该方法不允许被子类重写
|
|
351
|
+
*/
|
|
352
|
+
this.pushElement = (element) => {
|
|
353
|
+
this._future.length = 0;
|
|
354
|
+
if (this._isOverflow(element)) {
|
|
355
|
+
this._past.shift();
|
|
356
|
+
}
|
|
357
|
+
this._past.push(element);
|
|
358
|
+
this._onStackChange.fire();
|
|
359
|
+
};
|
|
360
|
+
this.onDidUndo = this._onDidUndo.event;
|
|
361
|
+
this.onDidRedo = this._onDidRedo.event;
|
|
362
|
+
this.onStackChange = this._onStackChange.event;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* 是否可以撤销。子类可以重写
|
|
366
|
+
*/
|
|
367
|
+
canUndo() {
|
|
368
|
+
return this._past.length > 0;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* 是否可以重做。子类可以重写
|
|
372
|
+
*/
|
|
373
|
+
canRedo() {
|
|
374
|
+
return this._future.length > 0;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* 清除undo
|
|
378
|
+
*/
|
|
379
|
+
clearUndo() {
|
|
380
|
+
if (this._past.length === 0) {
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
this._past.length = 0;
|
|
384
|
+
this._onStackChange.fire();
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* 清除redo
|
|
388
|
+
*/
|
|
389
|
+
clearRedo() {
|
|
390
|
+
if (this._future.length === 0) {
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
this._future.length = 0;
|
|
394
|
+
this._onStackChange.fire();
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* 重置栈
|
|
398
|
+
* 清空undo和redo
|
|
399
|
+
*/
|
|
400
|
+
reset() {
|
|
401
|
+
if (this._past.length === 0 && this._future.length === 0) {
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
this._past.length = 0;
|
|
405
|
+
this._future.length = 0;
|
|
406
|
+
this._onStackChange.fire();
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* 在undo时找出Past中的元素。子类可以重写
|
|
410
|
+
*/
|
|
411
|
+
_popPastElements() {
|
|
412
|
+
return this._past.length ? [this._past.pop()] : [];
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* 在redo时找出Future中的元素。子类可以重写
|
|
416
|
+
*/
|
|
417
|
+
_popFutureElements() {
|
|
418
|
+
return this._future.length ? [this._future.pop()] : [];
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* 判断新添加元素,是否会超出栈的大小。子类可以重写
|
|
422
|
+
*/
|
|
423
|
+
_isOverflow(_elem) {
|
|
424
|
+
return this._past.length >= this._limitSize;
|
|
425
|
+
}
|
|
426
|
+
};
|
|
427
|
+
|
|
428
|
+
// src/undo-redo-stack/state-stack.ts
|
|
429
|
+
var StateUndoRedoStack = class {
|
|
430
|
+
constructor(_currentState, _limitSize = Infinity) {
|
|
431
|
+
this._currentState = _currentState;
|
|
432
|
+
this._limitSize = _limitSize;
|
|
433
|
+
this._past = [];
|
|
434
|
+
this._future = [];
|
|
435
|
+
this._onDidUndo = new Emitter();
|
|
436
|
+
this._onDidRedo = new Emitter();
|
|
437
|
+
this._onStackChange = new Emitter();
|
|
438
|
+
this.onDidUndo = this._onDidUndo.event;
|
|
439
|
+
this.onDidRedo = this._onDidRedo.event;
|
|
440
|
+
this.onStackChange = this._onStackChange.event;
|
|
441
|
+
}
|
|
442
|
+
get currentState() {
|
|
443
|
+
return this._currentState;
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* 进行撤销
|
|
447
|
+
*/
|
|
448
|
+
undo() {
|
|
449
|
+
if (!this.canUndo()) {
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
this._future.push(this._currentState);
|
|
453
|
+
this._currentState = this._past.pop();
|
|
454
|
+
this._onDidUndo.fire(this._currentState);
|
|
455
|
+
this._onStackChange.fire();
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* 进行重做
|
|
459
|
+
*
|
|
460
|
+
* 注意:该方法不允许被子类重写
|
|
461
|
+
*/
|
|
462
|
+
redo() {
|
|
463
|
+
if (!this.canRedo()) {
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
this._past.push(this._currentState);
|
|
467
|
+
this._currentState = this._future.pop();
|
|
468
|
+
this._onDidRedo.fire(this._currentState);
|
|
469
|
+
this._onStackChange.fire();
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* 追加操作进入栈中
|
|
473
|
+
*
|
|
474
|
+
* 注意:该方法不允许被子类重写
|
|
475
|
+
*/
|
|
476
|
+
pushElement(element) {
|
|
477
|
+
this._future.length = 0;
|
|
478
|
+
if (this._isOverflow(element)) {
|
|
479
|
+
this._past.shift();
|
|
480
|
+
}
|
|
481
|
+
if (this._currentState) {
|
|
482
|
+
this._past.push(this._currentState);
|
|
483
|
+
}
|
|
484
|
+
this._currentState = element;
|
|
485
|
+
this._onStackChange.fire();
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* 是否可以撤销
|
|
489
|
+
*/
|
|
490
|
+
canUndo() {
|
|
491
|
+
return this._past.length > 0;
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* 是否可以重做
|
|
495
|
+
*/
|
|
496
|
+
canRedo() {
|
|
497
|
+
return this._future.length > 0;
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* 清除undo
|
|
501
|
+
*/
|
|
502
|
+
clearUndo() {
|
|
503
|
+
if (this._past.length === 0) {
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
this._past.length = 0;
|
|
507
|
+
this._onStackChange.fire();
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* 清除redo
|
|
511
|
+
*/
|
|
512
|
+
clearRedo() {
|
|
513
|
+
if (this._future.length === 0) {
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
this._future.length = 0;
|
|
517
|
+
this._onStackChange.fire();
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* 重置栈
|
|
521
|
+
* 清空undo和redo
|
|
522
|
+
*/
|
|
523
|
+
reset(state) {
|
|
524
|
+
if (this._past.length === 0 && this._future.length === 0 && this._currentState === state) {
|
|
525
|
+
return;
|
|
526
|
+
}
|
|
527
|
+
this._past.length = 0;
|
|
528
|
+
this._future.length = 0;
|
|
529
|
+
this._currentState = state;
|
|
530
|
+
this._onStackChange.fire();
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* 判断新添加元素,是否会超出栈的大小
|
|
534
|
+
*/
|
|
535
|
+
_isOverflow(_elem) {
|
|
536
|
+
return this._past.length >= this._limitSize;
|
|
537
|
+
}
|
|
538
|
+
};
|
|
539
|
+
|
|
540
|
+
export { BaseActionUndoRedoStack, StateUndoRedoStack };
|
|
541
|
+
//# sourceMappingURL=index.js.map
|
|
542
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../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/undo-redo-stack/action-stack.ts","../../src/undo-redo-stack/state-stack.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["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 { Emitter, type Event } from '../event';\nimport type { IActionStackElement } from './element';\n\nexport class BaseActionUndoRedoStack<T extends IActionStackElement> {\n // 当undo结束后触发\n public onDidUndo: Event<[T[]]>;\n // 当redo结束后触发\n public onDidRedo: Event<[T[]]>;\n // 当栈发生变化时触发\n public onStackChange: Event<[]>;\n\n protected readonly _past: T[] = [];\n protected readonly _future: T[] = [];\n\n protected _onDidUndo = new Emitter<[T[]]>();\n protected _onDidRedo = new Emitter<[T[]]>();\n protected _onStackChange = new Emitter<[]>();\n\n constructor(protected readonly _limitSize = Infinity) {\n this.onDidUndo = this._onDidUndo.event;\n this.onDidRedo = this._onDidRedo.event;\n this.onStackChange = this._onStackChange.event;\n }\n\n /**\n * 进行撤销\n *\n * 注意:该方法不允许被子类重写\n */\n readonly undo = (): void => {\n if (!this.canUndo()) {\n return;\n }\n const elements = this._popPastElements();\n if (elements.length <= 0) {\n return;\n }\n for (const elem of elements) {\n elem.undo();\n this._future.push(elem);\n }\n this._onDidUndo.fire(elements);\n this._onStackChange.fire();\n };\n\n /**\n * 进行重做\n *\n * 注意:该方法不允许被子类重写\n */\n readonly redo = (): void => {\n if (!this.canRedo()) {\n return;\n }\n const elements = this._popFutureElements();\n if (elements.length <= 0) {\n return;\n }\n for (const elem of elements) {\n elem.redo();\n this._past.push(elem);\n }\n this._onDidRedo.fire(elements);\n this._onStackChange.fire();\n };\n\n /**\n * 追加操作进入栈中\n *\n * 注意:该方法不允许被子类重写\n */\n readonly pushElement = (element: T): void => {\n this._future.length = 0;\n if (this._isOverflow(element)) {\n this._past.shift();\n }\n this._past.push(element);\n this._onStackChange.fire();\n };\n\n /**\n * 是否可以撤销。子类可以重写\n */\n public canUndo(): boolean {\n return this._past.length > 0;\n }\n\n /**\n * 是否可以重做。子类可以重写\n */\n public canRedo(): boolean {\n return this._future.length > 0;\n }\n\n /**\n * 清除undo\n */\n public clearUndo(): void {\n if (this._past.length === 0) {\n return;\n }\n this._past.length = 0;\n this._onStackChange.fire();\n }\n\n /**\n * 清除redo\n */\n public clearRedo(): void {\n if (this._future.length === 0) {\n return;\n }\n this._future.length = 0;\n this._onStackChange.fire();\n }\n\n /**\n * 重置栈\n * 清空undo和redo\n */\n public reset(): void {\n if (this._past.length === 0 && this._future.length === 0) {\n return;\n }\n this._past.length = 0;\n this._future.length = 0;\n this._onStackChange.fire();\n }\n\n /**\n * 在undo时找出Past中的元素。子类可以重写\n */\n protected _popPastElements(): T[] {\n return this._past.length ? [this._past.pop()!] : [];\n }\n\n /**\n * 在redo时找出Future中的元素。子类可以重写\n */\n protected _popFutureElements(): T[] {\n return this._future.length ? [this._future.pop()!] : [];\n }\n\n /**\n * 判断新添加元素,是否会超出栈的大小。子类可以重写\n */\n protected _isOverflow(_elem: T) {\n return this._past.length >= this._limitSize;\n }\n}\n","import type { Event } from '../event';\nimport { Emitter } from '../event';\n\nexport class StateUndoRedoStack<T> {\n // 当undo结束后触发\n public onDidUndo: Event<[T]>;\n // 当redo结束后触发\n public onDidRedo: Event<[T]>;\n // 当栈发生变化时触发\n public onStackChange: Event<[]>;\n\n protected readonly _past: T[] = [];\n protected readonly _future: T[] = [];\n\n protected _onDidUndo = new Emitter<[T]>();\n protected _onDidRedo = new Emitter<[T]>();\n protected _onStackChange = new Emitter<[]>();\n\n constructor(\n protected _currentState: T,\n protected readonly _limitSize = Infinity,\n ) {\n this.onDidUndo = this._onDidUndo.event;\n this.onDidRedo = this._onDidRedo.event;\n this.onStackChange = this._onStackChange.event;\n }\n\n get currentState() {\n return this._currentState;\n }\n\n /**\n * 进行撤销\n */\n public undo() {\n if (!this.canUndo()) {\n return;\n }\n this._future.push(this._currentState);\n this._currentState = this._past.pop()!;\n this._onDidUndo.fire(this._currentState);\n this._onStackChange.fire();\n }\n\n /**\n * 进行重做\n *\n * 注意:该方法不允许被子类重写\n */\n public redo() {\n if (!this.canRedo()) {\n return;\n }\n this._past.push(this._currentState);\n this._currentState = this._future.pop()!;\n this._onDidRedo.fire(this._currentState);\n this._onStackChange.fire();\n }\n\n /**\n * 追加操作进入栈中\n *\n * 注意:该方法不允许被子类重写\n */\n public pushElement(element: T) {\n this._future.length = 0;\n if (this._isOverflow(element)) {\n this._past.shift();\n }\n if (this._currentState) {\n this._past.push(this._currentState);\n }\n this._currentState = element;\n this._onStackChange.fire();\n }\n\n /**\n * 是否可以撤销\n */\n public canUndo(): boolean {\n return this._past.length > 0;\n }\n\n /**\n * 是否可以重做\n */\n public canRedo(): boolean {\n return this._future.length > 0;\n }\n\n /**\n * 清除undo\n */\n public clearUndo(): void {\n if (this._past.length === 0) {\n return;\n }\n this._past.length = 0;\n this._onStackChange.fire();\n }\n\n /**\n * 清除redo\n */\n public clearRedo(): void {\n if (this._future.length === 0) {\n return;\n }\n this._future.length = 0;\n this._onStackChange.fire();\n }\n\n /**\n * 重置栈\n * 清空undo和redo\n */\n public reset(state: T): void {\n if (this._past.length === 0 && this._future.length === 0 && this._currentState === state) {\n return;\n }\n this._past.length = 0;\n this._future.length = 0;\n this._currentState = state;\n this._onStackChange.fire();\n }\n\n /**\n * 判断新添加元素,是否会超出栈的大小\n */\n protected _isOverflow(_elem: T) {\n return this._past.length >= this._limitSize;\n }\n}\n"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/uuid/uuid.ts
|
|
4
|
+
var pattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
5
|
+
function isUuid(value) {
|
|
6
|
+
return pattern.test(value);
|
|
7
|
+
}
|
|
8
|
+
var generateUuid = (() => {
|
|
9
|
+
if (typeof crypto === "object" && typeof crypto.randomUUID === "function") {
|
|
10
|
+
return crypto.randomUUID.bind(crypto);
|
|
11
|
+
}
|
|
12
|
+
let getRandomValues;
|
|
13
|
+
if (typeof crypto === "object" && typeof crypto.getRandomValues === "function") {
|
|
14
|
+
getRandomValues = crypto.getRandomValues.bind(crypto);
|
|
15
|
+
} else {
|
|
16
|
+
getRandomValues = function(bucket) {
|
|
17
|
+
for (let i = 0; i < bucket.length; i++) {
|
|
18
|
+
bucket[i] = Math.floor(Math.random() * 256);
|
|
19
|
+
}
|
|
20
|
+
return bucket;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const data = new Uint8Array(16);
|
|
24
|
+
const hex = [];
|
|
25
|
+
for (let i = 0; i < 256; i++) {
|
|
26
|
+
hex.push(i.toString(16).padStart(2, "0"));
|
|
27
|
+
}
|
|
28
|
+
return () => {
|
|
29
|
+
getRandomValues(data);
|
|
30
|
+
data[6] = data[6] & 15 | 64;
|
|
31
|
+
data[8] = data[8] & 63 | 128;
|
|
32
|
+
let i = 0;
|
|
33
|
+
let result = "";
|
|
34
|
+
result += hex[data[i++]];
|
|
35
|
+
result += hex[data[i++]];
|
|
36
|
+
result += hex[data[i++]];
|
|
37
|
+
result += hex[data[i++]];
|
|
38
|
+
result += "-";
|
|
39
|
+
result += hex[data[i++]];
|
|
40
|
+
result += hex[data[i++]];
|
|
41
|
+
result += "-";
|
|
42
|
+
result += hex[data[i++]];
|
|
43
|
+
result += hex[data[i++]];
|
|
44
|
+
result += "-";
|
|
45
|
+
result += hex[data[i++]];
|
|
46
|
+
result += hex[data[i++]];
|
|
47
|
+
result += "-";
|
|
48
|
+
result += hex[data[i++]];
|
|
49
|
+
result += hex[data[i++]];
|
|
50
|
+
result += hex[data[i++]];
|
|
51
|
+
result += hex[data[i++]];
|
|
52
|
+
result += hex[data[i++]];
|
|
53
|
+
result += hex[data[i++]];
|
|
54
|
+
return result;
|
|
55
|
+
};
|
|
56
|
+
})();
|
|
57
|
+
var generateUpperCaseUuid = () => generateUuid().toUpperCase();
|
|
58
|
+
var uuid = generateUuid;
|
|
59
|
+
var upperCaseUuid = generateUpperCaseUuid;
|
|
60
|
+
|
|
61
|
+
exports.generateUpperCaseUuid = generateUpperCaseUuid;
|
|
62
|
+
exports.generateUuid = generateUuid;
|
|
63
|
+
exports.isUuid = isUuid;
|
|
64
|
+
exports.upperCaseUuid = upperCaseUuid;
|
|
65
|
+
exports.uuid = uuid;
|
|
66
|
+
//# sourceMappingURL=index.cjs.map
|
|
67
|
+
//# sourceMappingURL=index.cjs.map
|