@zk-tech/bedrock 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/async/index.cjs.map +1 -1
- package/dist/async/index.d.cts +2 -2
- package/dist/async/index.d.ts +2 -2
- package/dist/async/index.js.map +1 -1
- package/dist/error/index.cjs.map +1 -1
- package/dist/error/index.d.cts +19 -19
- package/dist/error/index.d.ts +19 -19
- package/dist/error/index.js.map +1 -1
- package/dist/{error-base-B4zaiJ5m.d.cts → error-base-DOFtBFla.d.cts} +8 -8
- package/dist/{error-base-B4zaiJ5m.d.ts → error-base-DOFtBFla.d.ts} +8 -8
- package/dist/promise/index.cjs.map +1 -1
- package/dist/promise/index.d.cts +4 -4
- package/dist/promise/index.d.ts +4 -4
- package/dist/promise/index.js.map +1 -1
- package/dist/worker/index.cjs.map +1 -1
- package/dist/worker/index.d.cts +2 -2
- package/dist/worker/index.d.ts +2 -2
- package/dist/worker/index.js.map +1 -1
- package/package.json +1 -2
- package/src/_internal/logger.ts +0 -59
- package/src/array/array.test.ts +0 -35
- package/src/array/array.ts +0 -25
- package/src/array/index.ts +0 -1
- package/src/assert/assert.test.ts +0 -86
- package/src/assert/assert.ts +0 -42
- package/src/assert/index.ts +0 -2
- package/src/async/barrier.test.ts +0 -90
- package/src/async/barrier.ts +0 -58
- package/src/async/cancellation.test.ts +0 -85
- package/src/async/cancellation.ts +0 -193
- package/src/async/index.ts +0 -18
- package/src/async/queue/queue.test.ts +0 -70
- package/src/async/queue/queue.ts +0 -56
- package/src/async/queue/task.test.ts +0 -155
- package/src/async/queue/task.ts +0 -67
- package/src/async/utils.test.ts +0 -28
- package/src/async/utils.ts +0 -8
- package/src/async/wait.ts +0 -9
- package/src/byte/format.test.ts +0 -64
- package/src/byte/format.ts +0 -44
- package/src/byte/index.ts +0 -2
- package/src/byte/node_modules/.vitest/results.json +0 -1
- package/src/byte/var.ts +0 -11
- package/src/cache/index.ts +0 -2
- package/src/cache/lru-with-timeout.test.ts +0 -88
- package/src/cache/lru-with-timeout.ts +0 -85
- package/src/cache/lru.test.ts +0 -56
- package/src/cache/lru.ts +0 -59
- package/src/context/context.test.ts +0 -17
- package/src/context/context.ts +0 -60
- package/src/context/index.ts +0 -8
- package/src/di/base.ts +0 -73
- package/src/di/container-service.test.ts +0 -179
- package/src/di/context.web.tsx +0 -41
- package/src/di/descriptor.ts +0 -31
- package/src/di/idle-value.test.ts +0 -73
- package/src/di/idle-value.ts +0 -63
- package/src/di/index.common.ts +0 -32
- package/src/di/index.ts +0 -2
- package/src/di/instantiation-service.interface.ts +0 -46
- package/src/di/instantiation-service.test.ts +0 -337
- package/src/di/instantiation-service.ts +0 -468
- package/src/di/lazy/foo.mock.ts +0 -28
- package/src/di/lazy/idle-load.ts +0 -39
- package/src/di/lazy/index.ts +0 -4
- package/src/di/lazy/lazy-service.test.ts +0 -65
- package/src/di/lazy/lazy-service.ts +0 -71
- package/src/di/lazy/type.ts +0 -5
- package/src/di/node_modules/.vitest/results.json +0 -1
- package/src/di/proxy-builder.test.ts +0 -45
- package/src/di/proxy-builder.ts +0 -38
- package/src/di/service-collection.test.ts +0 -27
- package/src/di/service-collection.ts +0 -46
- package/src/di/service-ownership-collection.test.ts +0 -39
- package/src/di/service-ownership-collection.ts +0 -38
- package/src/di/service-registry.test.ts +0 -66
- package/src/di/service-registry.ts +0 -99
- package/src/di/trace.ts +0 -85
- package/src/dispose/disposable-store.test.ts +0 -57
- package/src/dispose/disposable-store.ts +0 -80
- package/src/dispose/disposable-t.test.ts +0 -123
- package/src/dispose/disposable-t.ts +0 -238
- package/src/dispose/disposable-utils.test.ts +0 -15
- package/src/dispose/disposable-utils.ts +0 -28
- package/src/dispose/dispose-base.ts +0 -9
- package/src/dispose/index.ts +0 -34
- package/src/dispose/logger.test.ts +0 -65
- package/src/dispose/logger.ts +0 -39
- package/src/dispose/timer.test.ts +0 -30
- package/src/dispose/timer.ts +0 -16
- package/src/dispose/tracker.test.ts +0 -51
- package/src/dispose/tracker.ts +0 -105
- package/src/error/error-base.ts +0 -45
- package/src/error/error-code.ts +0 -39
- package/src/error/error-const.test.ts +0 -30
- package/src/error/error-const.ts +0 -16
- package/src/error/error-or.test.ts +0 -44
- package/src/error/error-or.ts +0 -2
- package/src/error/error-t.test.ts +0 -116
- package/src/error/error-t.ts +0 -100
- package/src/error/index.ts +0 -24
- package/src/error/node_modules/.vitest/results.json +0 -1
- package/src/event/disposable-linked-list.ts +0 -29
- package/src/event/emitter.test.ts +0 -191
- package/src/event/emitter.ts +0 -162
- package/src/event/error-handler.ts +0 -22
- package/src/event/index.ts +0 -34
- package/src/event/once.ts +0 -29
- package/src/event/phase-emitter.test.ts +0 -212
- package/src/event/phase-emitter.ts +0 -209
- package/src/event/shortcut-event-utils.ts +0 -33
- package/src/event/utils.ts +0 -6
- package/src/event/when.ts +0 -40
- package/src/function/debounce.test.ts +0 -274
- package/src/function/debounce.ts +0 -168
- package/src/function/index.ts +0 -2
- package/src/function/node_modules/.vitest/results.json +0 -1
- package/src/function/throttle.test.ts +0 -179
- package/src/function/throttle.ts +0 -26
- package/src/hash/hash-t.test.ts +0 -100
- package/src/hash/hash-t.ts +0 -51
- package/src/hash/index.ts +0 -3
- package/src/json/index.ts +0 -1
- package/src/json/node_modules/.vitest/results.json +0 -1
- package/src/json/parse.ts +0 -19
- package/src/launch/abstract-job.ts +0 -45
- package/src/launch/cost-recorder.ts +0 -22
- package/src/launch/index.ts +0 -2
- package/src/launch/job-scheduler.test.ts +0 -122
- package/src/launch/job-scheduler.ts +0 -118
- package/src/launch/node_modules/.vitest/deps/_metadata.json +0 -8
- package/src/launch/node_modules/.vitest/deps/package.json +0 -3
- package/src/launch/node_modules/.vitest/results.json +0 -1
- package/src/lock/README.md +0 -11
- package/src/lock/capability.test.ts +0 -110
- package/src/lock/capability.ts +0 -89
- package/src/lock/index.ts +0 -15
- package/src/lock/node_modules/.vitest/results.json +0 -1
- package/src/lock/semaphore.ts +0 -21
- package/src/lock/shared-mutex.test.ts +0 -537
- package/src/lock/shared-mutex.ts +0 -242
- package/src/lock/utils.test.ts +0 -165
- package/src/lock/utils.ts +0 -135
- package/src/lodash-es/index.ts +0 -1
- package/src/math/degree.ts +0 -16
- package/src/math/index.ts +0 -7
- package/src/math/math.test.ts +0 -40
- package/src/math/math.ts +0 -64
- package/src/math/node_modules/.vitest/results.json +0 -1
- package/src/math/vector.test.ts +0 -73
- package/src/math/vector.ts +0 -114
- package/src/network/client.interface.ts +0 -104
- package/src/network/client.web.ts +0 -24
- package/src/network/index.common.ts +0 -10
- package/src/network/index.ts +0 -2
- package/src/network/plugins/retry.ts +0 -98
- package/src/objects/deep-clone.test.ts +0 -40
- package/src/objects/deep-clone.ts +0 -13
- package/src/objects/deep-equal.test.ts +0 -86
- package/src/objects/deep-equal.ts +0 -60
- package/src/objects/index.ts +0 -4
- package/src/platform/index.ts +0 -64
- package/src/promise/index.ts +0 -16
- package/src/promise/promise.test.ts +0 -254
- package/src/promise/promise.ts +0 -212
- package/src/scheduler/callback-token.ts +0 -31
- package/src/scheduler/core/actuator-args.test.ts +0 -47
- package/src/scheduler/core/actuator.test.ts +0 -82
- package/src/scheduler/core/actuator.ts +0 -58
- package/src/scheduler/core/chunk-scheduler.test.ts +0 -54
- package/src/scheduler/core/chunk-scheduler.ts +0 -28
- package/src/scheduler/core/node_modules/.vitest/results.json +0 -1
- package/src/scheduler/core/scheduler.test.ts +0 -328
- package/src/scheduler/core/scheduler.ts +0 -172
- package/src/scheduler/core/task-queue.test.ts +0 -78
- package/src/scheduler/core/task-queue.ts +0 -44
- package/src/scheduler/core/task.test.ts +0 -34
- package/src/scheduler/core/task.ts +0 -52
- package/src/scheduler/core/utils.ts +0 -48
- package/src/scheduler/executor/abstract-executor.test.ts +0 -44
- package/src/scheduler/executor/abstract-executor.ts +0 -38
- package/src/scheduler/executor/executor.interface.ts +0 -39
- package/src/scheduler/executor/idle-callback-executor.test.ts +0 -70
- package/src/scheduler/executor/idle-callback-executor.ts +0 -98
- package/src/scheduler/executor/make-executor.ts +0 -18
- package/src/scheduler/executor/post-message-executor.test.ts +0 -66
- package/src/scheduler/executor/post-message-executor.ts +0 -52
- package/src/scheduler/index.ts +0 -15
- package/src/scheduler/lv-scheduler-callback.ts +0 -19
- package/src/scheduler/lv-scheduler-config.ts +0 -17
- package/src/scheduler/type.ts +0 -48
- package/src/sprintf/index.ts +0 -2
- package/src/sprintf/sprintf.test.ts +0 -95
- package/src/sprintf/sprintf.ts +0 -97
- package/src/structure/graph.test.ts +0 -181
- package/src/structure/graph.ts +0 -105
- package/src/structure/index.ts +0 -8
- package/src/structure/linked-list.test.ts +0 -74
- package/src/structure/linked-list.ts +0 -145
- package/src/structure/min-heap.test.ts +0 -71
- package/src/structure/min-heap.ts +0 -91
- package/src/type/REAME.md +0 -2
- package/src/type/distributive-omit.interface.ts +0 -4
- package/src/type/index.ts +0 -3
- package/src/type/object-key-paths.interface.ts +0 -40
- package/src/undo-redo-stack/README.md +0 -61
- package/src/undo-redo-stack/action-stack.test.ts +0 -330
- package/src/undo-redo-stack/action-stack.ts +0 -150
- package/src/undo-redo-stack/element.ts +0 -4
- package/src/undo-redo-stack/index.ts +0 -7
- package/src/undo-redo-stack/state-stack.test.ts +0 -118
- package/src/undo-redo-stack/state-stack.ts +0 -133
- package/src/uuid/index.ts +0 -7
- package/src/uuid/uuid.ts +0 -86
- package/src/worker/cors-worker.ts +0 -38
- package/src/worker/index.ts +0 -4
- package/src/worker/node_modules/.vitest/results.json +0 -1
- package/src/worker/promise-worker-main-thread.test.ts +0 -91
- package/src/worker/promise-worker-main-thread.ts +0 -76
- package/src/worker/promise-worker-worker-thread.ts +0 -64
- package/src/worker/promise-worker.interface.ts +0 -15
|
@@ -1,330 +0,0 @@
|
|
|
1
|
-
import type { IActionStackElement } from './element';
|
|
2
|
-
import { BaseActionUndoRedoStack } from './action-stack';
|
|
3
|
-
|
|
4
|
-
class Data implements IActionStackElement {
|
|
5
|
-
constructor(
|
|
6
|
-
private readonly _undo: () => void,
|
|
7
|
-
private readonly _redo: () => void,
|
|
8
|
-
) {}
|
|
9
|
-
|
|
10
|
-
undo() {
|
|
11
|
-
this._undo();
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
redo() {
|
|
15
|
-
this._redo();
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
describe('BaseActionUndoRedoStack', () => {
|
|
20
|
-
// 默认情况不能undo
|
|
21
|
-
it('canUndo1', () => {
|
|
22
|
-
const stack = new BaseActionUndoRedoStack();
|
|
23
|
-
expect(stack.canUndo()).toBeFalsy();
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
// 有了数据,可以undo
|
|
27
|
-
it('canUndo2', () => {
|
|
28
|
-
const stack = new BaseActionUndoRedoStack();
|
|
29
|
-
const elem = new Data(vi.fn(), vi.fn());
|
|
30
|
-
stack.pushElement(elem);
|
|
31
|
-
expect(stack.canUndo()).toBeTruthy();
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
// 有数据,但是被undo过了
|
|
35
|
-
it('canUndo3', () => {
|
|
36
|
-
const stack = new BaseActionUndoRedoStack();
|
|
37
|
-
const elem = new Data(vi.fn(), vi.fn());
|
|
38
|
-
stack.pushElement(elem);
|
|
39
|
-
stack.undo();
|
|
40
|
-
expect(stack.canUndo()).toBeFalsy();
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
// 默认情况不能redo
|
|
44
|
-
it('canRedo1', () => {
|
|
45
|
-
const stack = new BaseActionUndoRedoStack();
|
|
46
|
-
expect(stack.canRedo()).toBeFalsy();
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
// 添加了数据,还是不能redo
|
|
50
|
-
it('canRedo2', () => {
|
|
51
|
-
const stack = new BaseActionUndoRedoStack();
|
|
52
|
-
const elem = new Data(vi.fn(), vi.fn());
|
|
53
|
-
stack.pushElement(elem);
|
|
54
|
-
expect(stack.canRedo()).toBeFalsy();
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
// undo过了,可以redo
|
|
58
|
-
it('canRedo3', () => {
|
|
59
|
-
const stack = new BaseActionUndoRedoStack();
|
|
60
|
-
const elem = new Data(vi.fn(), vi.fn());
|
|
61
|
-
stack.pushElement(elem);
|
|
62
|
-
stack.undo();
|
|
63
|
-
expect(stack.canRedo()).toBeTruthy();
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
// 本来可以redo,但是添加了新数据
|
|
67
|
-
it('canRedo4', () => {
|
|
68
|
-
const stack = new BaseActionUndoRedoStack();
|
|
69
|
-
const elem = new Data(vi.fn(), vi.fn());
|
|
70
|
-
stack.pushElement(elem);
|
|
71
|
-
stack.undo();
|
|
72
|
-
expect(stack.canRedo()).toBeTruthy();
|
|
73
|
-
stack.pushElement(elem);
|
|
74
|
-
expect(stack.canRedo()).toBeFalsy();
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it('pushElements', () => {
|
|
78
|
-
const stack = new BaseActionUndoRedoStack(2);
|
|
79
|
-
const fn = vi.fn();
|
|
80
|
-
stack.onStackChange(fn);
|
|
81
|
-
const elem1 = new Data(vi.fn(), vi.fn());
|
|
82
|
-
stack.pushElement(elem1);
|
|
83
|
-
expect(fn).toBeCalledTimes(1);
|
|
84
|
-
// eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
|
|
85
|
-
expect(stack['_past'].length).toBe(1);
|
|
86
|
-
// eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
|
|
87
|
-
expect(stack['_future'].length).toBe(0);
|
|
88
|
-
|
|
89
|
-
const elem2 = new Data(vi.fn(), vi.fn());
|
|
90
|
-
stack.pushElement(elem2);
|
|
91
|
-
expect(fn).toBeCalledTimes(2);
|
|
92
|
-
// eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
|
|
93
|
-
expect(stack['_past'].length).toBe(2);
|
|
94
|
-
// eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
|
|
95
|
-
expect(stack['_future'].length).toBe(0);
|
|
96
|
-
|
|
97
|
-
stack.undo();
|
|
98
|
-
expect(fn).toBeCalledTimes(3);
|
|
99
|
-
// eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
|
|
100
|
-
expect(stack['_past'].length).toBe(1);
|
|
101
|
-
// eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
|
|
102
|
-
expect(stack['_future'].length).toBe(1);
|
|
103
|
-
|
|
104
|
-
const elem3 = new Data(vi.fn(), vi.fn());
|
|
105
|
-
stack.pushElement(elem3);
|
|
106
|
-
expect(fn).toBeCalledTimes(4);
|
|
107
|
-
// eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
|
|
108
|
-
expect(stack['_past'].length).toBe(2);
|
|
109
|
-
// eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
|
|
110
|
-
expect(stack['_future'].length).toBe(0);
|
|
111
|
-
|
|
112
|
-
const elem4 = new Data(vi.fn(), vi.fn());
|
|
113
|
-
stack.pushElement(elem4);
|
|
114
|
-
expect(fn).toBeCalledTimes(5);
|
|
115
|
-
// 命中了最大限制,长度还是2个
|
|
116
|
-
// eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
|
|
117
|
-
expect(stack['_past'].length).toBe(2);
|
|
118
|
-
// eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
|
|
119
|
-
expect(stack['_past'][1]).toBe(elem4);
|
|
120
|
-
// eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
|
|
121
|
-
expect(stack['_past'][0]).toBe(elem3);
|
|
122
|
-
// eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
|
|
123
|
-
expect(stack['_future'].length).toBe(0);
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
// 没有数据时候undo
|
|
127
|
-
it('undo1', () => {
|
|
128
|
-
const stack = new BaseActionUndoRedoStack();
|
|
129
|
-
const fn = vi.fn();
|
|
130
|
-
stack.onDidUndo(fn);
|
|
131
|
-
stack.undo();
|
|
132
|
-
expect(fn).toBeCalledTimes(0);
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
// 有数据时候undo
|
|
136
|
-
it('undo2', () => {
|
|
137
|
-
const stack = new BaseActionUndoRedoStack();
|
|
138
|
-
const fn = vi.fn();
|
|
139
|
-
stack.onDidUndo(fn);
|
|
140
|
-
const undoFn = vi.fn();
|
|
141
|
-
const redoFn = vi.fn();
|
|
142
|
-
const elem = new Data(undoFn, redoFn);
|
|
143
|
-
stack.pushElement(elem);
|
|
144
|
-
stack.undo();
|
|
145
|
-
expect(fn).toBeCalledTimes(1);
|
|
146
|
-
expect(undoFn).toBeCalledTimes(1);
|
|
147
|
-
expect(redoFn).toBeCalledTimes(0);
|
|
148
|
-
// eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
|
|
149
|
-
expect(stack['_past'].length).toBe(0);
|
|
150
|
-
// eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
|
|
151
|
-
expect(stack['_future'].length).toBe(1);
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
// 没有数据时候redo
|
|
155
|
-
it('redo1', () => {
|
|
156
|
-
const stack = new BaseActionUndoRedoStack();
|
|
157
|
-
const fn = vi.fn();
|
|
158
|
-
stack.onDidUndo(fn);
|
|
159
|
-
stack.redo();
|
|
160
|
-
expect(fn).toBeCalledTimes(0);
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
// 有数据时候redo
|
|
164
|
-
it('redo2', () => {
|
|
165
|
-
const stack = new BaseActionUndoRedoStack();
|
|
166
|
-
const fn = vi.fn();
|
|
167
|
-
stack.onDidRedo(fn);
|
|
168
|
-
const undoFn = vi.fn();
|
|
169
|
-
const redoFn = vi.fn();
|
|
170
|
-
const elem = new Data(undoFn, redoFn);
|
|
171
|
-
stack.pushElement(elem);
|
|
172
|
-
stack.undo();
|
|
173
|
-
expect(fn).toBeCalledTimes(0);
|
|
174
|
-
expect(undoFn).toBeCalledTimes(1);
|
|
175
|
-
expect(redoFn).toBeCalledTimes(0);
|
|
176
|
-
|
|
177
|
-
stack.redo();
|
|
178
|
-
expect(fn).toBeCalledTimes(1);
|
|
179
|
-
expect(undoFn).toBeCalledTimes(1);
|
|
180
|
-
expect(redoFn).toBeCalledTimes(1);
|
|
181
|
-
// eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
|
|
182
|
-
expect(stack['_past'].length).toBe(1);
|
|
183
|
-
// eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
|
|
184
|
-
expect(stack['_future'].length).toBe(0);
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
it('clear', () => {
|
|
188
|
-
const fn = vi.fn();
|
|
189
|
-
const stack = new BaseActionUndoRedoStack();
|
|
190
|
-
stack.onStackChange(fn);
|
|
191
|
-
|
|
192
|
-
const undoFn = vi.fn();
|
|
193
|
-
const redoFn = vi.fn();
|
|
194
|
-
const elem = new Data(undoFn, redoFn);
|
|
195
|
-
|
|
196
|
-
// 本身没有元素,所以没有抛出事件
|
|
197
|
-
stack.clearRedo();
|
|
198
|
-
stack.clearUndo();
|
|
199
|
-
stack.reset();
|
|
200
|
-
expect(fn).toBeCalledTimes(0);
|
|
201
|
-
|
|
202
|
-
// 有undo元素,但是清除
|
|
203
|
-
stack.pushElement(elem);
|
|
204
|
-
fn.mockReset();
|
|
205
|
-
expect(stack.canUndo()).toBeTruthy();
|
|
206
|
-
stack.clearUndo();
|
|
207
|
-
expect(fn).toBeCalledTimes(1);
|
|
208
|
-
expect(stack.canUndo()).toBeFalsy();
|
|
209
|
-
|
|
210
|
-
// 有redo元素,但是清除
|
|
211
|
-
stack.pushElement(elem);
|
|
212
|
-
stack.pushElement(elem);
|
|
213
|
-
stack.pushElement(elem);
|
|
214
|
-
stack.undo();
|
|
215
|
-
fn.mockReset();
|
|
216
|
-
expect(stack.canRedo()).toBeTruthy();
|
|
217
|
-
stack.clearRedo();
|
|
218
|
-
expect(fn).toBeCalledTimes(1);
|
|
219
|
-
expect(stack.canRedo()).toBeFalsy();
|
|
220
|
-
|
|
221
|
-
stack.undo();
|
|
222
|
-
expect(stack.canUndo()).toBeTruthy();
|
|
223
|
-
expect(stack.canRedo()).toBeTruthy();
|
|
224
|
-
fn.mockReset();
|
|
225
|
-
stack.reset();
|
|
226
|
-
expect(fn).toBeCalledTimes(1);
|
|
227
|
-
expect(stack.canUndo()).toBeFalsy();
|
|
228
|
-
expect(stack.canRedo()).toBeFalsy();
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
describe('DerivedUndoRedoStack', () => {
|
|
233
|
-
// 整一个奇怪的undoredostack,主要是测试复写基类方法
|
|
234
|
-
class UntrustedUndoRedoStack extends BaseActionUndoRedoStack<IActionStackElement> {
|
|
235
|
-
canUndo() {
|
|
236
|
-
return true;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
canRedo() {
|
|
240
|
-
return true;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
protected _popPastElements(): IActionStackElement[] {
|
|
244
|
-
const elems = [...this._past];
|
|
245
|
-
this._past.length = 0;
|
|
246
|
-
return elems;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
protected _popFutureElements(): IActionStackElement[] {
|
|
250
|
-
const elems = [...this._future];
|
|
251
|
-
this._future.length = 0;
|
|
252
|
-
return elems;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
protected _isOverflow(_elem: IActionStackElement) {
|
|
256
|
-
if (this._future.length > 0) {
|
|
257
|
-
return true;
|
|
258
|
-
}
|
|
259
|
-
return false;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// 虽然canUndo永远是true,但是undo没有真的触发,所以不会抛出事件
|
|
264
|
-
it('undo1', () => {
|
|
265
|
-
const stack = new UntrustedUndoRedoStack();
|
|
266
|
-
const fn = vi.fn();
|
|
267
|
-
stack.onDidUndo(fn);
|
|
268
|
-
stack.undo();
|
|
269
|
-
expect(fn).toBeCalledTimes(0);
|
|
270
|
-
});
|
|
271
|
-
|
|
272
|
-
// 验证_popPastElements重写成功
|
|
273
|
-
it('undo2', () => {
|
|
274
|
-
const stack = new UntrustedUndoRedoStack();
|
|
275
|
-
const fn = vi.fn();
|
|
276
|
-
stack.onDidUndo(fn);
|
|
277
|
-
const undoFn = vi.fn();
|
|
278
|
-
const redoFn = vi.fn();
|
|
279
|
-
const elem = new Data(undoFn, redoFn);
|
|
280
|
-
// 添加了三次
|
|
281
|
-
stack.pushElement(elem);
|
|
282
|
-
stack.pushElement(elem);
|
|
283
|
-
stack.pushElement(elem);
|
|
284
|
-
stack.undo();
|
|
285
|
-
expect(fn).toBeCalledTimes(1);
|
|
286
|
-
expect(undoFn).toBeCalledTimes(3);
|
|
287
|
-
expect(redoFn).toBeCalledTimes(0);
|
|
288
|
-
});
|
|
289
|
-
|
|
290
|
-
// 虽然canRedo永远是true,但是redo没有真的触发,所以不会抛出事件
|
|
291
|
-
it('redo1', () => {
|
|
292
|
-
const stack = new UntrustedUndoRedoStack();
|
|
293
|
-
const fn = vi.fn();
|
|
294
|
-
stack.onDidRedo(fn);
|
|
295
|
-
stack.redo();
|
|
296
|
-
expect(fn).toBeCalledTimes(0);
|
|
297
|
-
});
|
|
298
|
-
|
|
299
|
-
// 验证_popFutureElements重写成功
|
|
300
|
-
it('redo2', () => {
|
|
301
|
-
const stack = new UntrustedUndoRedoStack();
|
|
302
|
-
const fn = vi.fn();
|
|
303
|
-
stack.onDidRedo(fn);
|
|
304
|
-
const undoFn = vi.fn();
|
|
305
|
-
const redoFn = vi.fn();
|
|
306
|
-
const elem = new Data(undoFn, redoFn);
|
|
307
|
-
// 添加了三次
|
|
308
|
-
stack.pushElement(elem);
|
|
309
|
-
stack.pushElement(elem);
|
|
310
|
-
stack.pushElement(elem);
|
|
311
|
-
stack.undo();
|
|
312
|
-
stack.redo();
|
|
313
|
-
expect(fn).toBeCalledTimes(1);
|
|
314
|
-
expect(undoFn).toBeCalledTimes(3);
|
|
315
|
-
expect(redoFn).toBeCalledTimes(3);
|
|
316
|
-
});
|
|
317
|
-
|
|
318
|
-
// 验证_isOverflow重写成功
|
|
319
|
-
it('isOverflow', () => {
|
|
320
|
-
const stack = new UntrustedUndoRedoStack(1);
|
|
321
|
-
const elem = new Data(vi.fn(), vi.fn());
|
|
322
|
-
stack.pushElement(elem);
|
|
323
|
-
stack.pushElement(elem);
|
|
324
|
-
// eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
|
|
325
|
-
expect(stack['_isOverflow'](elem)).toBeFalsy();
|
|
326
|
-
stack.undo();
|
|
327
|
-
// eslint-disable-next-line dot-notation, @typescript-eslint/dot-notation
|
|
328
|
-
expect(stack['_isOverflow'](elem)).toBeTruthy();
|
|
329
|
-
});
|
|
330
|
-
});
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import { Emitter, type Event } from '../event';
|
|
2
|
-
import type { IActionStackElement } from './element';
|
|
3
|
-
|
|
4
|
-
export class BaseActionUndoRedoStack<T extends IActionStackElement> {
|
|
5
|
-
// 当undo结束后触发
|
|
6
|
-
public onDidUndo: Event<[T[]]>;
|
|
7
|
-
// 当redo结束后触发
|
|
8
|
-
public onDidRedo: Event<[T[]]>;
|
|
9
|
-
// 当栈发生变化时触发
|
|
10
|
-
public onStackChange: Event<[]>;
|
|
11
|
-
|
|
12
|
-
protected readonly _past: T[] = [];
|
|
13
|
-
protected readonly _future: T[] = [];
|
|
14
|
-
|
|
15
|
-
protected _onDidUndo = new Emitter<[T[]]>();
|
|
16
|
-
protected _onDidRedo = new Emitter<[T[]]>();
|
|
17
|
-
protected _onStackChange = new Emitter<[]>();
|
|
18
|
-
|
|
19
|
-
constructor(protected readonly _limitSize = Infinity) {
|
|
20
|
-
this.onDidUndo = this._onDidUndo.event;
|
|
21
|
-
this.onDidRedo = this._onDidRedo.event;
|
|
22
|
-
this.onStackChange = this._onStackChange.event;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* 进行撤销
|
|
27
|
-
*
|
|
28
|
-
* 注意:该方法不允许被子类重写
|
|
29
|
-
*/
|
|
30
|
-
readonly undo = (): void => {
|
|
31
|
-
if (!this.canUndo()) {
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
const elements = this._popPastElements();
|
|
35
|
-
if (elements.length <= 0) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
for (const elem of elements) {
|
|
39
|
-
elem.undo();
|
|
40
|
-
this._future.push(elem);
|
|
41
|
-
}
|
|
42
|
-
this._onDidUndo.fire(elements);
|
|
43
|
-
this._onStackChange.fire();
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* 进行重做
|
|
48
|
-
*
|
|
49
|
-
* 注意:该方法不允许被子类重写
|
|
50
|
-
*/
|
|
51
|
-
readonly redo = (): void => {
|
|
52
|
-
if (!this.canRedo()) {
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
const elements = this._popFutureElements();
|
|
56
|
-
if (elements.length <= 0) {
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
for (const elem of elements) {
|
|
60
|
-
elem.redo();
|
|
61
|
-
this._past.push(elem);
|
|
62
|
-
}
|
|
63
|
-
this._onDidRedo.fire(elements);
|
|
64
|
-
this._onStackChange.fire();
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* 追加操作进入栈中
|
|
69
|
-
*
|
|
70
|
-
* 注意:该方法不允许被子类重写
|
|
71
|
-
*/
|
|
72
|
-
readonly pushElement = (element: T): void => {
|
|
73
|
-
this._future.length = 0;
|
|
74
|
-
if (this._isOverflow(element)) {
|
|
75
|
-
this._past.shift();
|
|
76
|
-
}
|
|
77
|
-
this._past.push(element);
|
|
78
|
-
this._onStackChange.fire();
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* 是否可以撤销。子类可以重写
|
|
83
|
-
*/
|
|
84
|
-
public canUndo(): boolean {
|
|
85
|
-
return this._past.length > 0;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* 是否可以重做。子类可以重写
|
|
90
|
-
*/
|
|
91
|
-
public canRedo(): boolean {
|
|
92
|
-
return this._future.length > 0;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* 清除undo
|
|
97
|
-
*/
|
|
98
|
-
public clearUndo(): void {
|
|
99
|
-
if (this._past.length === 0) {
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
this._past.length = 0;
|
|
103
|
-
this._onStackChange.fire();
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* 清除redo
|
|
108
|
-
*/
|
|
109
|
-
public clearRedo(): void {
|
|
110
|
-
if (this._future.length === 0) {
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
this._future.length = 0;
|
|
114
|
-
this._onStackChange.fire();
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* 重置栈
|
|
119
|
-
* 清空undo和redo
|
|
120
|
-
*/
|
|
121
|
-
public reset(): void {
|
|
122
|
-
if (this._past.length === 0 && this._future.length === 0) {
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
this._past.length = 0;
|
|
126
|
-
this._future.length = 0;
|
|
127
|
-
this._onStackChange.fire();
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* 在undo时找出Past中的元素。子类可以重写
|
|
132
|
-
*/
|
|
133
|
-
protected _popPastElements(): T[] {
|
|
134
|
-
return this._past.length ? [this._past.pop()!] : [];
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* 在redo时找出Future中的元素。子类可以重写
|
|
139
|
-
*/
|
|
140
|
-
protected _popFutureElements(): T[] {
|
|
141
|
-
return this._future.length ? [this._future.pop()!] : [];
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* 判断新添加元素,是否会超出栈的大小。子类可以重写
|
|
146
|
-
*/
|
|
147
|
-
protected _isOverflow(_elem: T) {
|
|
148
|
-
return this._past.length >= this._limitSize;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import { StateUndoRedoStack } from './state-stack';
|
|
2
|
-
|
|
3
|
-
describe('StateUndoRedoStack', () => {
|
|
4
|
-
it('undo', () => {
|
|
5
|
-
const fn = vi.fn();
|
|
6
|
-
const stack = new StateUndoRedoStack<string>('initial');
|
|
7
|
-
stack.onDidRedo(fn);
|
|
8
|
-
stack.onDidUndo(fn);
|
|
9
|
-
expect(stack.currentState).toBe('initial');
|
|
10
|
-
expect(stack.canUndo()).toBeFalsy();
|
|
11
|
-
expect(stack.canUndo()).toBeFalsy();
|
|
12
|
-
|
|
13
|
-
stack.pushElement('1');
|
|
14
|
-
stack.pushElement('2');
|
|
15
|
-
stack.pushElement('3');
|
|
16
|
-
expect(stack.currentState).toBe('3');
|
|
17
|
-
|
|
18
|
-
stack.undo();
|
|
19
|
-
expect(stack.currentState).toBe('2');
|
|
20
|
-
expect(fn).toBeCalledWith('2');
|
|
21
|
-
|
|
22
|
-
stack.undo();
|
|
23
|
-
expect(stack.currentState).toBe('1');
|
|
24
|
-
expect(fn).toBeCalledWith('1');
|
|
25
|
-
|
|
26
|
-
stack.undo();
|
|
27
|
-
expect(stack.currentState).toBe('initial');
|
|
28
|
-
expect(fn).toBeCalledWith('initial');
|
|
29
|
-
expect(stack.canUndo()).toBeFalsy();
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it('redo', () => {
|
|
33
|
-
const fn = vi.fn();
|
|
34
|
-
const stack = new StateUndoRedoStack<string>('initial');
|
|
35
|
-
stack.onDidRedo(fn);
|
|
36
|
-
stack.onDidUndo(fn);
|
|
37
|
-
expect(stack.currentState).toBe('initial');
|
|
38
|
-
expect(stack.canUndo()).toBeFalsy();
|
|
39
|
-
expect(stack.canUndo()).toBeFalsy();
|
|
40
|
-
|
|
41
|
-
stack.pushElement('1');
|
|
42
|
-
stack.pushElement('2');
|
|
43
|
-
stack.pushElement('3');
|
|
44
|
-
|
|
45
|
-
stack.undo();
|
|
46
|
-
expect(stack.currentState).toBe('2');
|
|
47
|
-
expect(fn).toBeCalledWith('2');
|
|
48
|
-
expect(stack.canRedo()).toBeTruthy();
|
|
49
|
-
|
|
50
|
-
stack.redo();
|
|
51
|
-
expect(stack.canRedo()).toBeFalsy();
|
|
52
|
-
expect(stack.currentState).toBe('3');
|
|
53
|
-
expect(fn).toBeCalledWith('3');
|
|
54
|
-
|
|
55
|
-
stack.undo();
|
|
56
|
-
stack.undo();
|
|
57
|
-
expect(stack.currentState).toBe('1');
|
|
58
|
-
expect(fn).toBeCalledWith('1');
|
|
59
|
-
expect(stack.canRedo()).toBeTruthy();
|
|
60
|
-
|
|
61
|
-
stack.pushElement('4');
|
|
62
|
-
expect(stack.canRedo()).toBeFalsy();
|
|
63
|
-
|
|
64
|
-
stack.undo();
|
|
65
|
-
expect(stack.currentState).toBe('1');
|
|
66
|
-
expect(fn).toBeCalledWith('1');
|
|
67
|
-
expect(stack.canRedo()).toBeTruthy();
|
|
68
|
-
|
|
69
|
-
stack.redo();
|
|
70
|
-
expect(stack.canRedo()).toBeFalsy();
|
|
71
|
-
expect(stack.currentState).toBe('4');
|
|
72
|
-
expect(fn).toBeCalledWith('4');
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it('clear', () => {
|
|
76
|
-
const fn = vi.fn();
|
|
77
|
-
const stack = new StateUndoRedoStack<string>('initial');
|
|
78
|
-
stack.onStackChange(fn);
|
|
79
|
-
|
|
80
|
-
// 本身没有元素,所以没有抛出事件
|
|
81
|
-
stack.clearRedo();
|
|
82
|
-
stack.clearUndo();
|
|
83
|
-
stack.reset('initial');
|
|
84
|
-
expect(fn).toBeCalledTimes(0);
|
|
85
|
-
|
|
86
|
-
// reset后的state不一样,所以会触发回调
|
|
87
|
-
stack.reset('initial2');
|
|
88
|
-
expect(fn).toBeCalledTimes(1);
|
|
89
|
-
|
|
90
|
-
// 有undo元素,但是清除
|
|
91
|
-
stack.pushElement('1');
|
|
92
|
-
fn.mockReset();
|
|
93
|
-
expect(stack.canUndo()).toBeTruthy();
|
|
94
|
-
stack.clearUndo();
|
|
95
|
-
expect(fn).toBeCalledTimes(1);
|
|
96
|
-
expect(stack.canUndo()).toBeFalsy();
|
|
97
|
-
|
|
98
|
-
// 有redo元素,但是清除
|
|
99
|
-
stack.pushElement('1');
|
|
100
|
-
stack.pushElement('2');
|
|
101
|
-
stack.pushElement('3');
|
|
102
|
-
stack.undo();
|
|
103
|
-
fn.mockReset();
|
|
104
|
-
expect(stack.canRedo()).toBeTruthy();
|
|
105
|
-
stack.clearRedo();
|
|
106
|
-
expect(fn).toBeCalledTimes(1);
|
|
107
|
-
expect(stack.canRedo()).toBeFalsy();
|
|
108
|
-
|
|
109
|
-
stack.undo();
|
|
110
|
-
expect(stack.canUndo()).toBeTruthy();
|
|
111
|
-
expect(stack.canRedo()).toBeTruthy();
|
|
112
|
-
fn.mockReset();
|
|
113
|
-
stack.reset('initial');
|
|
114
|
-
expect(fn).toBeCalledTimes(1);
|
|
115
|
-
expect(stack.canUndo()).toBeFalsy();
|
|
116
|
-
expect(stack.canRedo()).toBeFalsy();
|
|
117
|
-
});
|
|
118
|
-
});
|