atom.io 0.40.9 → 0.41.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/eslint-plugin/index.js +1 -1
- package/dist/internal/index.d.ts +11 -2
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +34 -1
- package/dist/internal/index.js.map +1 -1
- package/dist/realtime/index.d.ts +2 -1
- package/dist/realtime/index.d.ts.map +1 -1
- package/dist/realtime/index.js.map +1 -1
- package/dist/realtime-client/index.js +2 -1
- package/dist/realtime-client/index.js.map +1 -1
- package/dist/realtime-server/index.js +1 -1
- package/dist/realtime-server/index.js.map +1 -1
- package/dist/transceivers/o-list/index.d.ts +87 -0
- package/dist/transceivers/o-list/index.d.ts.map +1 -0
- package/dist/transceivers/o-list/index.js +513 -0
- package/dist/transceivers/o-list/index.js.map +1 -0
- package/dist/transceivers/set-rtx/index.d.ts +16 -16
- package/dist/transceivers/set-rtx/index.d.ts.map +1 -1
- package/dist/transceivers/set-rtx/index.js.map +1 -1
- package/dist/transceivers/u-list/index.d.ts +27 -18
- package/dist/transceivers/u-list/index.d.ts.map +1 -1
- package/dist/transceivers/u-list/index.js +54 -34
- package/dist/transceivers/u-list/index.js.map +1 -1
- package/package.json +17 -13
- package/src/internal/index.ts +1 -0
- package/src/internal/micro.ts +69 -0
- package/src/realtime/shared-room-store.ts +3 -2
- package/src/realtime-server/ipc-sockets/parent-socket.ts +1 -1
- package/src/transceivers/o-list/index.ts +1 -0
- package/src/transceivers/o-list/o-list.ts +613 -0
- package/src/transceivers/set-rtx/set-rtx.ts +22 -21
- package/src/transceivers/u-list/u-list.ts +85 -55
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Enumeration, Fn, Subject, Transceiver, TransceiverMode } from "atom.io/internal";
|
|
2
|
+
import { primitive } from "atom.io/json";
|
|
3
|
+
|
|
4
|
+
//#region src/transceivers/o-list/o-list.d.ts
|
|
5
|
+
type ArrayMutations = Exclude<keyof Array<any>, keyof ReadonlyArray<any>>;
|
|
6
|
+
type ArrayUpdate<P extends primitive> = {
|
|
7
|
+
type: `copyWithin`;
|
|
8
|
+
target: number;
|
|
9
|
+
start: number;
|
|
10
|
+
end?: number;
|
|
11
|
+
prev: readonly P[];
|
|
12
|
+
} | {
|
|
13
|
+
type: `extend`;
|
|
14
|
+
next: number;
|
|
15
|
+
prev: number;
|
|
16
|
+
} | {
|
|
17
|
+
type: `fill`;
|
|
18
|
+
value: P;
|
|
19
|
+
start?: number;
|
|
20
|
+
end?: number;
|
|
21
|
+
prev: readonly P[];
|
|
22
|
+
} | {
|
|
23
|
+
type: `pop` | `shift`;
|
|
24
|
+
value?: P;
|
|
25
|
+
} | {
|
|
26
|
+
type: `push` | `unshift`;
|
|
27
|
+
items: readonly P[];
|
|
28
|
+
} | {
|
|
29
|
+
type: `reverse`;
|
|
30
|
+
} | {
|
|
31
|
+
type: `set`;
|
|
32
|
+
next: P;
|
|
33
|
+
prev?: P;
|
|
34
|
+
index: number;
|
|
35
|
+
} | {
|
|
36
|
+
type: `sort`;
|
|
37
|
+
next: readonly P[];
|
|
38
|
+
prev: readonly P[];
|
|
39
|
+
} | {
|
|
40
|
+
type: `splice`;
|
|
41
|
+
start: number;
|
|
42
|
+
deleteCount: number;
|
|
43
|
+
items: readonly P[];
|
|
44
|
+
deleted: readonly P[];
|
|
45
|
+
} | {
|
|
46
|
+
type: `truncate`;
|
|
47
|
+
length: number;
|
|
48
|
+
items: readonly P[];
|
|
49
|
+
};
|
|
50
|
+
type OListUpdateType = ArrayUpdate<any>[`type`];
|
|
51
|
+
type PackedArrayUpdate<P extends primitive> = string & {
|
|
52
|
+
update?: ArrayUpdate<P>;
|
|
53
|
+
type?: P;
|
|
54
|
+
};
|
|
55
|
+
declare const ARRAY_UPDATES: readonly ["set", "truncate", "extend", "pop", "push", "shift", "unshift", "copyWithin", "fill", "splice", "reverse", "sort"];
|
|
56
|
+
declare const ARRAY_UPDATE_ENUM: Enumeration<typeof ARRAY_UPDATES>;
|
|
57
|
+
declare function packArrayUpdate<P extends primitive>(update: ArrayUpdate<P>): PackedArrayUpdate<P>;
|
|
58
|
+
declare function unpackArrayUpdate<P extends primitive>(packed: PackedArrayUpdate<P>): ArrayUpdate<P>;
|
|
59
|
+
type ArrayMutationHandler = { [K in Exclude<OListUpdateType, `extend` | `set` | `truncate`>]: Fn };
|
|
60
|
+
declare class OList<P extends primitive> extends Array<P> implements Transceiver<ReadonlyArray<P>, PackedArrayUpdate<P>, ReadonlyArray<P>>, ArrayMutationHandler {
|
|
61
|
+
mode: TransceiverMode;
|
|
62
|
+
readonly subject: Subject<PackedArrayUpdate<P>>;
|
|
63
|
+
readonly READONLY_VIEW: ReadonlyArray<P>;
|
|
64
|
+
constructor(arrayLength?: number);
|
|
65
|
+
constructor(...items: P[]);
|
|
66
|
+
toJSON(): ReadonlyArray<P>;
|
|
67
|
+
static fromJSON<P extends primitive>(json: ReadonlyArray<P>): OList<P>;
|
|
68
|
+
push(...items: P[]): number;
|
|
69
|
+
pop(): P | undefined;
|
|
70
|
+
shift(): P | undefined;
|
|
71
|
+
unshift(...items: P[]): number;
|
|
72
|
+
reverse(): this;
|
|
73
|
+
fill(value: P, start?: number, end?: number): this;
|
|
74
|
+
sort(compareFn?: (a: P, b: P) => number): this;
|
|
75
|
+
splice(start: number, deleteCount?: number): P[];
|
|
76
|
+
splice(start: number, deleteCount: number, ...items: P[]): P[];
|
|
77
|
+
copyWithin(target: number, start: number, end?: number): this;
|
|
78
|
+
subscribe(key: string, fn: (update: PackedArrayUpdate<P>) => void): () => void;
|
|
79
|
+
emit(update: ArrayUpdate<P>): void;
|
|
80
|
+
private doStep;
|
|
81
|
+
do(update: PackedArrayUpdate<P>): null;
|
|
82
|
+
undoStep(update: ArrayUpdate<P>): void;
|
|
83
|
+
undo(update: PackedArrayUpdate<P>): number | null;
|
|
84
|
+
}
|
|
85
|
+
//#endregion
|
|
86
|
+
export { ARRAY_UPDATE_ENUM, ArrayMutationHandler, ArrayMutations, ArrayUpdate, OList, OListUpdateType, PackedArrayUpdate, packArrayUpdate, unpackArrayUpdate };
|
|
87
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["ARRAY_UPDATE_ENUM: Enumeration<typeof ARRAY_UPDATES>"],"sources":["../../../src/transceivers/o-list/o-list.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
import { Subject, enumeration, packValue, unpackValue } from "atom.io/internal";
|
|
2
|
+
|
|
3
|
+
//#region src/transceivers/o-list/o-list.ts
|
|
4
|
+
const ARRAY_UPDATES = [
|
|
5
|
+
`set`,
|
|
6
|
+
`truncate`,
|
|
7
|
+
`extend`,
|
|
8
|
+
`pop`,
|
|
9
|
+
`push`,
|
|
10
|
+
`shift`,
|
|
11
|
+
`unshift`,
|
|
12
|
+
`copyWithin`,
|
|
13
|
+
`fill`,
|
|
14
|
+
`splice`,
|
|
15
|
+
`reverse`,
|
|
16
|
+
`sort`
|
|
17
|
+
];
|
|
18
|
+
const ARRAY_UPDATE_ENUM = enumeration(ARRAY_UPDATES);
|
|
19
|
+
function packArrayUpdate(update) {
|
|
20
|
+
let packed = ARRAY_UPDATE_ENUM[update.type] + `\u001F`;
|
|
21
|
+
switch (update.type) {
|
|
22
|
+
case `set`:
|
|
23
|
+
packed += update.index + `\u001E` + packValue(update.next);
|
|
24
|
+
if (update.prev !== void 0) packed += `\u001E` + packValue(update.prev);
|
|
25
|
+
return packed;
|
|
26
|
+
case `truncate`: return packed + update.length + `\u001E` + update.items.map(packValue).join(`\u001E`);
|
|
27
|
+
case `extend`: return packed + update.next + `\u001E` + update.prev;
|
|
28
|
+
case `pop`:
|
|
29
|
+
case `shift`:
|
|
30
|
+
if (update.value !== void 0) packed += packValue(update.value);
|
|
31
|
+
return packed;
|
|
32
|
+
case `push`:
|
|
33
|
+
case `unshift`: return packed + update.items.map(packValue).join(`\u001E`);
|
|
34
|
+
case `copyWithin`:
|
|
35
|
+
packed += update.target + `\u001E` + update.start;
|
|
36
|
+
if (update.end !== void 0) packed += `\u001E` + update.end;
|
|
37
|
+
packed += `\u001E\u001E` + update.prev.map(packValue).join(`\u001E`);
|
|
38
|
+
return packed;
|
|
39
|
+
case `fill`:
|
|
40
|
+
packed += packValue(update.value);
|
|
41
|
+
if (update.start !== void 0) packed += `\u001E` + update.start;
|
|
42
|
+
if (update.end !== void 0) packed += `\u001E` + update.end;
|
|
43
|
+
packed += `\u001E\u001E` + update.prev.map(packValue).join(`\u001E`);
|
|
44
|
+
return packed;
|
|
45
|
+
case `splice`: return packed + update.start + `\u001E\u001E` + update.deleteCount + `\u001E\u001E` + update.items.map(packValue).join(`\u001E`) + `\u001E\u001E` + update.deleted.map(packValue).join(`\u001E`);
|
|
46
|
+
case `reverse`: return packed;
|
|
47
|
+
case `sort`: return packed + update.next.map(packValue).join(`\u001E`) + `\u001E\u001E` + update.prev.map(packValue).join(`\u001E`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function unpackArrayUpdate(packed) {
|
|
51
|
+
const [head, tail] = packed.split(`\u001F`);
|
|
52
|
+
const type = ARRAY_UPDATE_ENUM[head];
|
|
53
|
+
switch (type) {
|
|
54
|
+
case `set`: {
|
|
55
|
+
const [i, n, p] = tail.split(`\u001E`);
|
|
56
|
+
const index = +i;
|
|
57
|
+
const next = unpackValue(n);
|
|
58
|
+
if (p === void 0) return {
|
|
59
|
+
type,
|
|
60
|
+
index,
|
|
61
|
+
next
|
|
62
|
+
};
|
|
63
|
+
const prev = unpackValue(p);
|
|
64
|
+
return {
|
|
65
|
+
type,
|
|
66
|
+
index,
|
|
67
|
+
next,
|
|
68
|
+
prev
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
case `truncate`: {
|
|
72
|
+
const [l, ...i] = tail.split(`\u001E`);
|
|
73
|
+
const length = +l;
|
|
74
|
+
const items = i.map(unpackValue);
|
|
75
|
+
return {
|
|
76
|
+
type,
|
|
77
|
+
length,
|
|
78
|
+
items
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
case `extend`: {
|
|
82
|
+
const [n, p] = tail.split(`\u001E`);
|
|
83
|
+
const next = +n;
|
|
84
|
+
const prev = +p;
|
|
85
|
+
return {
|
|
86
|
+
type,
|
|
87
|
+
next,
|
|
88
|
+
prev
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
case `pop`:
|
|
92
|
+
case `shift`:
|
|
93
|
+
if (tail !== ``) {
|
|
94
|
+
const value = unpackValue(tail);
|
|
95
|
+
return {
|
|
96
|
+
type,
|
|
97
|
+
value
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return { type };
|
|
101
|
+
case `push`:
|
|
102
|
+
case `unshift`: {
|
|
103
|
+
const items = tail.split(`\u001E`).map(unpackValue);
|
|
104
|
+
return {
|
|
105
|
+
type,
|
|
106
|
+
items
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
case `copyWithin`: {
|
|
110
|
+
const [numbers, data] = tail.split(`\u001E\u001E`);
|
|
111
|
+
const prev = data ? data.split(`\u001E`).map(unpackValue) : [];
|
|
112
|
+
const [t, s, e] = numbers.split(`\u001E`);
|
|
113
|
+
const target = +t;
|
|
114
|
+
const start = +s;
|
|
115
|
+
if (e === void 0) return {
|
|
116
|
+
type,
|
|
117
|
+
target,
|
|
118
|
+
start,
|
|
119
|
+
prev
|
|
120
|
+
};
|
|
121
|
+
const end = +e;
|
|
122
|
+
return {
|
|
123
|
+
type,
|
|
124
|
+
target,
|
|
125
|
+
start,
|
|
126
|
+
prev,
|
|
127
|
+
end
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
case `fill`: {
|
|
131
|
+
const [numbers, data] = tail.split(`\u001E\u001E`);
|
|
132
|
+
const prev = data ? data.split(`\u001E`).map(unpackValue) : [];
|
|
133
|
+
const [v, s, e] = numbers.split(`\u001E`);
|
|
134
|
+
const value = unpackValue(v);
|
|
135
|
+
if (s === void 0 && e === void 0) return {
|
|
136
|
+
type,
|
|
137
|
+
value,
|
|
138
|
+
prev
|
|
139
|
+
};
|
|
140
|
+
const start = +s;
|
|
141
|
+
if (e === void 0) return {
|
|
142
|
+
type,
|
|
143
|
+
value,
|
|
144
|
+
prev,
|
|
145
|
+
start
|
|
146
|
+
};
|
|
147
|
+
const end = +e;
|
|
148
|
+
return {
|
|
149
|
+
type,
|
|
150
|
+
value,
|
|
151
|
+
prev,
|
|
152
|
+
start,
|
|
153
|
+
end
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
case `splice`: {
|
|
157
|
+
const [s, c, i, d] = tail.split(`\u001E\u001E`);
|
|
158
|
+
const start = +s;
|
|
159
|
+
const deleteCount = +c;
|
|
160
|
+
const items = i ? i.split(`\u001E`).map(unpackValue) : [];
|
|
161
|
+
const deleted = d ? d.split(`\u001E`).map(unpackValue) : [];
|
|
162
|
+
return {
|
|
163
|
+
type,
|
|
164
|
+
start,
|
|
165
|
+
deleteCount,
|
|
166
|
+
items,
|
|
167
|
+
deleted
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
case `reverse`: return { type };
|
|
171
|
+
case `sort`: {
|
|
172
|
+
const [n, p] = tail.split(`\u001E\u001E`);
|
|
173
|
+
const next = n ? n.split(`\u001E`).map(unpackValue) : [];
|
|
174
|
+
const prev = p ? p.split(`\u001E`).map(unpackValue) : [];
|
|
175
|
+
return {
|
|
176
|
+
type,
|
|
177
|
+
next,
|
|
178
|
+
prev
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
var OList = class OList extends Array {
|
|
184
|
+
mode = `record`;
|
|
185
|
+
subject = new Subject();
|
|
186
|
+
READONLY_VIEW = this;
|
|
187
|
+
constructor(...items) {
|
|
188
|
+
super(...items);
|
|
189
|
+
return new Proxy(this, { set: (target, prop, value, receiver) => {
|
|
190
|
+
if (typeof prop === `string` && !Number.isNaN(Number.parseInt(prop, 10))) {
|
|
191
|
+
const index = Number(prop);
|
|
192
|
+
let prev;
|
|
193
|
+
if (this.mode === `record`) prev = target[index];
|
|
194
|
+
target[index] = value;
|
|
195
|
+
if (prev) this.emit({
|
|
196
|
+
type: `set`,
|
|
197
|
+
index,
|
|
198
|
+
next: value,
|
|
199
|
+
prev
|
|
200
|
+
});
|
|
201
|
+
else if (this.mode === `record`) this.emit({
|
|
202
|
+
type: `set`,
|
|
203
|
+
index,
|
|
204
|
+
next: value
|
|
205
|
+
});
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
if (prop === `length`) {
|
|
209
|
+
if (this.mode === `record`) {
|
|
210
|
+
const prevLength = target.length;
|
|
211
|
+
if (prevLength === value) return true;
|
|
212
|
+
if (prevLength > value) {
|
|
213
|
+
const dropped = target.slice(value);
|
|
214
|
+
target.length = value;
|
|
215
|
+
this.emit({
|
|
216
|
+
type: `truncate`,
|
|
217
|
+
length: value,
|
|
218
|
+
items: dropped
|
|
219
|
+
});
|
|
220
|
+
} else {
|
|
221
|
+
target.length = value;
|
|
222
|
+
this.emit({
|
|
223
|
+
type: `extend`,
|
|
224
|
+
next: value,
|
|
225
|
+
prev: prevLength
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
} else target.length = value;
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
return Reflect.set(target, prop, value, receiver);
|
|
232
|
+
} });
|
|
233
|
+
}
|
|
234
|
+
toJSON() {
|
|
235
|
+
return [...this];
|
|
236
|
+
}
|
|
237
|
+
static fromJSON(json) {
|
|
238
|
+
return new OList(...json);
|
|
239
|
+
}
|
|
240
|
+
push(...items) {
|
|
241
|
+
let result;
|
|
242
|
+
if (this.mode === `record`) {
|
|
243
|
+
this.mode = `playback`;
|
|
244
|
+
result = super.push(...items);
|
|
245
|
+
this.mode = `record`;
|
|
246
|
+
this.emit({
|
|
247
|
+
type: `push`,
|
|
248
|
+
items
|
|
249
|
+
});
|
|
250
|
+
} else result = super.push(...items);
|
|
251
|
+
return result;
|
|
252
|
+
}
|
|
253
|
+
pop() {
|
|
254
|
+
let value;
|
|
255
|
+
if (this.mode === `record`) {
|
|
256
|
+
this.mode = `playback`;
|
|
257
|
+
value = super.pop();
|
|
258
|
+
if (value === void 0) this.emit({ type: `pop` });
|
|
259
|
+
else this.emit({
|
|
260
|
+
type: `pop`,
|
|
261
|
+
value
|
|
262
|
+
});
|
|
263
|
+
this.mode = `record`;
|
|
264
|
+
} else value = super.pop();
|
|
265
|
+
return value;
|
|
266
|
+
}
|
|
267
|
+
shift() {
|
|
268
|
+
let value;
|
|
269
|
+
if (this.mode === `record`) {
|
|
270
|
+
this.mode = `playback`;
|
|
271
|
+
value = super.shift();
|
|
272
|
+
if (value === void 0) this.emit({ type: `shift` });
|
|
273
|
+
else this.emit({
|
|
274
|
+
type: `shift`,
|
|
275
|
+
value
|
|
276
|
+
});
|
|
277
|
+
this.mode = `record`;
|
|
278
|
+
} else value = super.shift();
|
|
279
|
+
return value;
|
|
280
|
+
}
|
|
281
|
+
unshift(...items) {
|
|
282
|
+
let result;
|
|
283
|
+
if (this.mode === `record`) {
|
|
284
|
+
this.mode = `playback`;
|
|
285
|
+
result = super.unshift(...items);
|
|
286
|
+
this.emit({
|
|
287
|
+
type: `unshift`,
|
|
288
|
+
items
|
|
289
|
+
});
|
|
290
|
+
this.mode = `record`;
|
|
291
|
+
} else result = super.unshift(...items);
|
|
292
|
+
return result;
|
|
293
|
+
}
|
|
294
|
+
reverse() {
|
|
295
|
+
super.reverse();
|
|
296
|
+
if (this.mode === `record`) this.emit({ type: `reverse` });
|
|
297
|
+
return this;
|
|
298
|
+
}
|
|
299
|
+
fill(value, start, end) {
|
|
300
|
+
if (this.mode === `record`) {
|
|
301
|
+
this.mode = `playback`;
|
|
302
|
+
const prev = this.slice(start, end);
|
|
303
|
+
super.fill(value, start, end);
|
|
304
|
+
if (start === void 0) this.emit({
|
|
305
|
+
type: `fill`,
|
|
306
|
+
value,
|
|
307
|
+
prev
|
|
308
|
+
});
|
|
309
|
+
else if (end === void 0) this.emit({
|
|
310
|
+
type: `fill`,
|
|
311
|
+
value,
|
|
312
|
+
start,
|
|
313
|
+
prev
|
|
314
|
+
});
|
|
315
|
+
else this.emit({
|
|
316
|
+
type: `fill`,
|
|
317
|
+
value,
|
|
318
|
+
start,
|
|
319
|
+
end,
|
|
320
|
+
prev
|
|
321
|
+
});
|
|
322
|
+
this.mode = `record`;
|
|
323
|
+
} else super.fill(value, start, end);
|
|
324
|
+
return this;
|
|
325
|
+
}
|
|
326
|
+
sort(compareFn) {
|
|
327
|
+
if (this.mode === `record`) {
|
|
328
|
+
this.mode = `playback`;
|
|
329
|
+
const prev = [...this];
|
|
330
|
+
super.sort(compareFn);
|
|
331
|
+
const next = [...this];
|
|
332
|
+
this.emit({
|
|
333
|
+
type: `sort`,
|
|
334
|
+
next,
|
|
335
|
+
prev
|
|
336
|
+
});
|
|
337
|
+
this.mode = `record`;
|
|
338
|
+
}
|
|
339
|
+
return this;
|
|
340
|
+
}
|
|
341
|
+
splice(...params) {
|
|
342
|
+
const [start, deleteCount, ...items] = params;
|
|
343
|
+
const originalMode = this.mode;
|
|
344
|
+
if (originalMode === `record`) this.mode = `playback`;
|
|
345
|
+
const deleted = super.splice(...params);
|
|
346
|
+
if (originalMode === `record`) this.mode = `record`;
|
|
347
|
+
if (deleteCount === void 0) this.emit({
|
|
348
|
+
type: `splice`,
|
|
349
|
+
start,
|
|
350
|
+
items,
|
|
351
|
+
deleted,
|
|
352
|
+
deleteCount: deleted.length
|
|
353
|
+
});
|
|
354
|
+
else this.emit({
|
|
355
|
+
type: `splice`,
|
|
356
|
+
start,
|
|
357
|
+
items,
|
|
358
|
+
deleted,
|
|
359
|
+
deleteCount
|
|
360
|
+
});
|
|
361
|
+
return deleted;
|
|
362
|
+
}
|
|
363
|
+
copyWithin(target, start, end) {
|
|
364
|
+
const originalMode = this.mode;
|
|
365
|
+
let prev;
|
|
366
|
+
if (originalMode === `record`) {
|
|
367
|
+
prev = this.slice(target);
|
|
368
|
+
this.mode = `playback`;
|
|
369
|
+
}
|
|
370
|
+
super.copyWithin(target, start, end);
|
|
371
|
+
if (originalMode === `record`) this.mode = `record`;
|
|
372
|
+
if (prev) if (end === void 0) this.emit({
|
|
373
|
+
type: `copyWithin`,
|
|
374
|
+
prev,
|
|
375
|
+
target,
|
|
376
|
+
start
|
|
377
|
+
});
|
|
378
|
+
else this.emit({
|
|
379
|
+
type: `copyWithin`,
|
|
380
|
+
prev,
|
|
381
|
+
target,
|
|
382
|
+
start,
|
|
383
|
+
end
|
|
384
|
+
});
|
|
385
|
+
return this;
|
|
386
|
+
}
|
|
387
|
+
subscribe(key, fn) {
|
|
388
|
+
return this.subject.subscribe(key, fn);
|
|
389
|
+
}
|
|
390
|
+
emit(update) {
|
|
391
|
+
this.subject.next(packArrayUpdate(update));
|
|
392
|
+
}
|
|
393
|
+
doStep(update) {
|
|
394
|
+
switch (update.type) {
|
|
395
|
+
case `copyWithin`:
|
|
396
|
+
this.copyWithin(update.target, update.start, update.end);
|
|
397
|
+
break;
|
|
398
|
+
case `extend`:
|
|
399
|
+
this.length = update.next;
|
|
400
|
+
break;
|
|
401
|
+
case `fill`:
|
|
402
|
+
this.fill(update.value, update.start, update.end);
|
|
403
|
+
break;
|
|
404
|
+
case `pop`:
|
|
405
|
+
this.pop();
|
|
406
|
+
break;
|
|
407
|
+
case `push`:
|
|
408
|
+
this.push(...update.items);
|
|
409
|
+
break;
|
|
410
|
+
case `reverse`:
|
|
411
|
+
this.reverse();
|
|
412
|
+
break;
|
|
413
|
+
case `shift`:
|
|
414
|
+
this.shift();
|
|
415
|
+
break;
|
|
416
|
+
case `sort`:
|
|
417
|
+
for (let i = 0; i < update.next.length; i++) this[i] = update.next[i];
|
|
418
|
+
this.length = update.next.length;
|
|
419
|
+
break;
|
|
420
|
+
case `splice`:
|
|
421
|
+
this.splice(update.start, update.deleteCount, ...update.items);
|
|
422
|
+
break;
|
|
423
|
+
case `truncate`:
|
|
424
|
+
this.length = update.length;
|
|
425
|
+
break;
|
|
426
|
+
case `set`:
|
|
427
|
+
this[update.index] = update.next;
|
|
428
|
+
break;
|
|
429
|
+
case `unshift`:
|
|
430
|
+
this.unshift(...update.items);
|
|
431
|
+
break;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
do(update) {
|
|
435
|
+
this.mode = `playback`;
|
|
436
|
+
const unpacked = unpackArrayUpdate(update);
|
|
437
|
+
this.doStep(unpacked);
|
|
438
|
+
this.mode = `record`;
|
|
439
|
+
return null;
|
|
440
|
+
}
|
|
441
|
+
undoStep(update) {
|
|
442
|
+
switch (update.type) {
|
|
443
|
+
case `copyWithin`:
|
|
444
|
+
for (let i = 0; i < update.prev.length; i++) this[i + update.target] = update.prev[i];
|
|
445
|
+
break;
|
|
446
|
+
case `extend`:
|
|
447
|
+
this.length = update.prev;
|
|
448
|
+
break;
|
|
449
|
+
case `fill`:
|
|
450
|
+
{
|
|
451
|
+
const start = update.start ?? 0;
|
|
452
|
+
for (let i = 0; i < update.prev.length; i++) this[i + start] = update.prev[i];
|
|
453
|
+
}
|
|
454
|
+
break;
|
|
455
|
+
case `pop`:
|
|
456
|
+
if (update.value) this.push(update.value);
|
|
457
|
+
break;
|
|
458
|
+
case `push`:
|
|
459
|
+
{
|
|
460
|
+
let i = update.items.length - 1;
|
|
461
|
+
while (i >= 0) {
|
|
462
|
+
this.pop();
|
|
463
|
+
--i;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
break;
|
|
467
|
+
case `reverse`:
|
|
468
|
+
this.reverse();
|
|
469
|
+
break;
|
|
470
|
+
case `shift`:
|
|
471
|
+
if (update.value) this.unshift(update.value);
|
|
472
|
+
break;
|
|
473
|
+
case `sort`:
|
|
474
|
+
for (let i = 0; i < update.prev.length; i++) this[i] = update.prev[i];
|
|
475
|
+
this.length = update.prev.length;
|
|
476
|
+
break;
|
|
477
|
+
case `set`:
|
|
478
|
+
if (update.prev) this[update.index] = update.prev;
|
|
479
|
+
else {
|
|
480
|
+
delete this[update.index];
|
|
481
|
+
const firstEmptyIndex = this.findIndex((_, i) => !Object.hasOwn(this, i));
|
|
482
|
+
if (firstEmptyIndex !== -1) this.length = firstEmptyIndex;
|
|
483
|
+
}
|
|
484
|
+
break;
|
|
485
|
+
case `splice`:
|
|
486
|
+
this.splice(update.start, update.items.length, ...update.deleted);
|
|
487
|
+
break;
|
|
488
|
+
case `truncate`:
|
|
489
|
+
this.push(...update.items);
|
|
490
|
+
break;
|
|
491
|
+
case `unshift`:
|
|
492
|
+
{
|
|
493
|
+
let i = update.items.length - 1;
|
|
494
|
+
while (i >= 0) {
|
|
495
|
+
this.shift();
|
|
496
|
+
--i;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
break;
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
undo(update) {
|
|
503
|
+
this.mode = `playback`;
|
|
504
|
+
const unpacked = unpackArrayUpdate(update);
|
|
505
|
+
this.undoStep(unpacked);
|
|
506
|
+
this.mode = `record`;
|
|
507
|
+
return null;
|
|
508
|
+
}
|
|
509
|
+
};
|
|
510
|
+
|
|
511
|
+
//#endregion
|
|
512
|
+
export { ARRAY_UPDATE_ENUM, OList, packArrayUpdate, unpackArrayUpdate };
|
|
513
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["ARRAY_UPDATE_ENUM: Enumeration<typeof ARRAY_UPDATES>","prev: P | undefined","result: number","value: P | undefined","prev: P[] | undefined"],"sources":["../../../src/transceivers/o-list/o-list.ts"],"sourcesContent":["import type {\n\tEnumeration,\n\tFn,\n\tTransceiver,\n\tTransceiverMode,\n} from \"atom.io/internal\"\nimport { enumeration, packValue, Subject, unpackValue } from \"atom.io/internal\"\nimport type { primitive } from \"atom.io/json\"\n\nexport type ArrayMutations = Exclude<keyof Array<any>, keyof ReadonlyArray<any>>\nexport type ArrayUpdate<P extends primitive> =\n\t| {\n\t\t\ttype: `copyWithin`\n\t\t\ttarget: number\n\t\t\tstart: number\n\t\t\tend?: number\n\t\t\tprev: readonly P[]\n\t }\n\t| {\n\t\t\ttype: `extend`\n\t\t\tnext: number\n\t\t\tprev: number\n\t }\n\t| {\n\t\t\ttype: `fill`\n\t\t\tvalue: P\n\t\t\tstart?: number\n\t\t\tend?: number\n\t\t\tprev: readonly P[]\n\t }\n\t| {\n\t\t\ttype: `pop` | `shift`\n\t\t\tvalue?: P\n\t }\n\t| {\n\t\t\ttype: `push` | `unshift`\n\t\t\titems: readonly P[]\n\t }\n\t| {\n\t\t\ttype: `reverse`\n\t }\n\t| {\n\t\t\ttype: `set`\n\t\t\tnext: P\n\t\t\tprev?: P\n\t\t\tindex: number\n\t }\n\t| {\n\t\t\ttype: `sort`\n\t\t\tnext: readonly P[]\n\t\t\tprev: readonly P[]\n\t }\n\t| {\n\t\t\ttype: `splice`\n\t\t\tstart: number\n\t\t\tdeleteCount: number\n\t\t\titems: readonly P[]\n\t\t\tdeleted: readonly P[]\n\t }\n\t| {\n\t\t\ttype: `truncate`\n\t\t\tlength: number\n\t\t\titems: readonly P[]\n\t }\nexport type OListUpdateType = ArrayUpdate<any>[`type`]\ntrue satisfies ArrayMutations extends OListUpdateType\n\t? true\n\t: Exclude<ArrayMutations, OListUpdateType>\n\nexport type PackedArrayUpdate<P extends primitive> = string & {\n\tupdate?: ArrayUpdate<P>\n\ttype?: P\n}\n\nconst ARRAY_UPDATES = [\n\t// virtual methods\n\t`set`,\n\t`truncate`,\n\t`extend`,\n\t// actual methods\n\t`pop`,\n\t`push`,\n\t`shift`,\n\t`unshift`,\n\t`copyWithin`,\n\t`fill`,\n\t`splice`,\n\t`reverse`,\n\t`sort`,\n] as const\ntrue satisfies ArrayUpdate<any>[`type`] extends (typeof ARRAY_UPDATES)[number]\n\t? true\n\t: Exclude<ArrayUpdate<any>[`type`], (typeof ARRAY_UPDATES)[number]>\n\nexport const ARRAY_UPDATE_ENUM: Enumeration<typeof ARRAY_UPDATES> =\n\tenumeration(ARRAY_UPDATES)\n\nexport function packArrayUpdate<P extends primitive>(\n\tupdate: ArrayUpdate<P>,\n): PackedArrayUpdate<P> {\n\tlet packed = ARRAY_UPDATE_ENUM[update.type] + `\\u001F`\n\tswitch (update.type) {\n\t\tcase `set`:\n\t\t\tpacked += update.index + `\\u001E` + packValue(update.next)\n\t\t\tif (update.prev !== undefined) {\n\t\t\t\tpacked += `\\u001E` + packValue(update.prev)\n\t\t\t}\n\t\t\treturn packed\n\t\tcase `truncate`:\n\t\t\treturn (\n\t\t\t\tpacked +\n\t\t\t\tupdate.length +\n\t\t\t\t`\\u001E` +\n\t\t\t\tupdate.items.map(packValue).join(`\\u001E`)\n\t\t\t)\n\t\tcase `extend`:\n\t\t\treturn packed + update.next + `\\u001E` + update.prev\n\t\tcase `pop`:\n\t\tcase `shift`:\n\t\t\tif (update.value !== undefined) {\n\t\t\t\tpacked += packValue(update.value)\n\t\t\t}\n\t\t\treturn packed\n\t\tcase `push`:\n\t\tcase `unshift`:\n\t\t\treturn packed + update.items.map(packValue).join(`\\u001E`)\n\t\tcase `copyWithin`:\n\t\t\tpacked += update.target + `\\u001E` + update.start\n\t\t\tif (update.end !== undefined) {\n\t\t\t\tpacked += `\\u001E` + update.end\n\t\t\t}\n\t\t\tpacked += `\\u001E\\u001E` + update.prev.map(packValue).join(`\\u001E`)\n\t\t\treturn packed\n\t\tcase `fill`:\n\t\t\tpacked += packValue(update.value)\n\t\t\tif (update.start !== undefined) {\n\t\t\t\tpacked += `\\u001E` + update.start\n\t\t\t}\n\t\t\tif (update.end !== undefined) {\n\t\t\t\tpacked += `\\u001E` + update.end\n\t\t\t}\n\t\t\tpacked += `\\u001E\\u001E` + update.prev.map(packValue).join(`\\u001E`)\n\t\t\treturn packed\n\t\tcase `splice`:\n\t\t\treturn (\n\t\t\t\tpacked +\n\t\t\t\tupdate.start +\n\t\t\t\t`\\u001E\\u001E` +\n\t\t\t\tupdate.deleteCount +\n\t\t\t\t`\\u001E\\u001E` +\n\t\t\t\tupdate.items.map(packValue).join(`\\u001E`) +\n\t\t\t\t`\\u001E\\u001E` +\n\t\t\t\tupdate.deleted.map(packValue).join(`\\u001E`)\n\t\t\t)\n\t\tcase `reverse`:\n\t\t\treturn packed\n\t\tcase `sort`:\n\t\t\treturn (\n\t\t\t\tpacked +\n\t\t\t\tupdate.next.map(packValue).join(`\\u001E`) +\n\t\t\t\t`\\u001E\\u001E` +\n\t\t\t\tupdate.prev.map(packValue).join(`\\u001E`)\n\t\t\t)\n\t}\n}\n\nexport function unpackArrayUpdate<P extends primitive>(\n\tpacked: PackedArrayUpdate<P>,\n): ArrayUpdate<P> {\n\tconst [head, tail] = packed.split(`\\u001F`) as [\n\t\tExtract<keyof typeof ARRAY_UPDATE_ENUM, number>,\n\t\tstring,\n\t]\n\tconst type = ARRAY_UPDATE_ENUM[head]\n\tswitch (type) {\n\t\tcase `set`: {\n\t\t\tconst [i, n, p] = tail.split(`\\u001E`)\n\t\t\tconst index = +i\n\t\t\tconst next = unpackValue(n) as P\n\t\t\tif (p === undefined) {\n\t\t\t\treturn { type, index, next }\n\t\t\t}\n\t\t\tconst prev = unpackValue(p) as P\n\t\t\treturn { type, index, next, prev }\n\t\t}\n\t\tcase `truncate`: {\n\t\t\tconst [l, ...i] = tail.split(`\\u001E`)\n\t\t\tconst length = +l\n\t\t\tconst items = i.map(unpackValue) as P[]\n\t\t\treturn { type, length, items }\n\t\t}\n\t\tcase `extend`: {\n\t\t\tconst [n, p] = tail.split(`\\u001E`)\n\t\t\tconst next = +n\n\t\t\tconst prev = +p\n\t\t\treturn { type, next, prev }\n\t\t}\n\t\tcase `pop`:\n\t\tcase `shift`:\n\t\t\tif (tail !== ``) {\n\t\t\t\tconst value = unpackValue(tail) as P\n\t\t\t\treturn { type, value }\n\t\t\t}\n\t\t\treturn { type }\n\t\tcase `push`:\n\t\tcase `unshift`: {\n\t\t\tconst items = tail.split(`\\u001E`).map(unpackValue) as P[]\n\t\t\treturn { type, items }\n\t\t}\n\t\tcase `copyWithin`: {\n\t\t\tconst [numbers, data] = tail.split(`\\u001E\\u001E`)\n\t\t\tconst prev = data ? (data.split(`\\u001E`).map(unpackValue) as P[]) : []\n\t\t\tconst [t, s, e] = numbers.split(`\\u001E`)\n\t\t\tconst target = +t\n\t\t\tconst start = +s\n\t\t\tif (e === undefined) {\n\t\t\t\treturn { type, target, start, prev }\n\t\t\t}\n\t\t\tconst end = +e\n\t\t\treturn { type, target, start, prev, end }\n\t\t}\n\t\tcase `fill`: {\n\t\t\tconst [numbers, data] = tail.split(`\\u001E\\u001E`)\n\t\t\tconst prev = data ? (data.split(`\\u001E`).map(unpackValue) as P[]) : []\n\t\t\tconst [v, s, e] = numbers.split(`\\u001E`)\n\t\t\tconst value = unpackValue(v) as P\n\t\t\tif (s === undefined && e === undefined) {\n\t\t\t\treturn { type, value, prev }\n\t\t\t}\n\t\t\tconst start = +s\n\t\t\tif (e === undefined) {\n\t\t\t\treturn { type, value, prev, start }\n\t\t\t}\n\t\t\tconst end = +e\n\t\t\treturn { type, value, prev, start, end }\n\t\t}\n\t\tcase `splice`: {\n\t\t\tconst [s, c, i, d] = tail.split(`\\u001E\\u001E`)\n\n\t\t\tconst start = +s\n\t\t\tconst deleteCount = +c\n\t\t\tconst items = i ? (i.split(`\\u001E`).map(unpackValue) as P[]) : []\n\t\t\tconst deleted = d ? (d.split(`\\u001E`).map(unpackValue) as P[]) : []\n\t\t\treturn { type, start, deleteCount, items, deleted }\n\t\t}\n\t\tcase `reverse`:\n\t\t\treturn { type }\n\t\tcase `sort`: {\n\t\t\tconst [n, p] = tail.split(`\\u001E\\u001E`)\n\t\t\tconst next = n ? (n.split(`\\u001E`).map(unpackValue) as P[]) : []\n\t\t\tconst prev = p ? (p.split(`\\u001E`).map(unpackValue) as P[]) : []\n\t\t\treturn { type, next, prev }\n\t\t}\n\t}\n}\n\nexport type ArrayMutationHandler = {\n\t[K in Exclude<OListUpdateType, `extend` | `set` | `truncate`>]: Fn\n}\n\nexport class OList<P extends primitive>\n\textends Array<P>\n\timplements\n\t\tTransceiver<ReadonlyArray<P>, PackedArrayUpdate<P>, ReadonlyArray<P>>,\n\t\tArrayMutationHandler\n{\n\tpublic mode: TransceiverMode = `record`\n\tpublic readonly subject: Subject<PackedArrayUpdate<P>> = new Subject()\n\n\tpublic readonly READONLY_VIEW: ReadonlyArray<P> = this\n\n\tpublic constructor(arrayLength?: number)\n\tpublic constructor(...items: P[])\n\tpublic constructor(...items: P[]) {\n\t\tsuper(...items)\n\t\t// biome-ignore lint/correctness/noConstructorReturn: this is chill\n\t\treturn new Proxy(this, {\n\t\t\tset: (target, prop, value, receiver) => {\n\t\t\t\tif (\n\t\t\t\t\ttypeof prop === `string` &&\n\t\t\t\t\t!Number.isNaN(Number.parseInt(prop, 10))\n\t\t\t\t) {\n\t\t\t\t\tconst index = Number(prop)\n\t\t\t\t\tlet prev: P | undefined\n\t\t\t\t\tif (this.mode === `record`) {\n\t\t\t\t\t\tprev = target[index]\n\t\t\t\t\t}\n\t\t\t\t\ttarget[index] = value\n\t\t\t\t\tif (prev) {\n\t\t\t\t\t\tthis.emit({ type: `set`, index, next: value, prev })\n\t\t\t\t\t} else if (this.mode === `record`) {\n\t\t\t\t\t\tthis.emit({ type: `set`, index, next: value })\n\t\t\t\t\t}\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\tif (prop === `length`) {\n\t\t\t\t\tif (this.mode === `record`) {\n\t\t\t\t\t\tconst prevLength = target.length\n\t\t\t\t\t\tif (prevLength === value) return true\n\t\t\t\t\t\tif (prevLength > value) {\n\t\t\t\t\t\t\tconst dropped = target.slice(value)\n\t\t\t\t\t\t\ttarget.length = value\n\t\t\t\t\t\t\tthis.emit({ type: `truncate`, length: value, items: dropped })\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttarget.length = value\n\t\t\t\t\t\t\tthis.emit({ type: `extend`, next: value, prev: prevLength })\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget.length = value\n\t\t\t\t\t}\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\treturn Reflect.set(target, prop, value, receiver)\n\t\t\t},\n\t\t})\n\t}\n\n\tpublic toJSON(): ReadonlyArray<P> {\n\t\treturn [...this]\n\t}\n\n\tpublic static fromJSON<P extends primitive>(json: ReadonlyArray<P>): OList<P> {\n\t\treturn new OList<P>(...json)\n\t}\n\n\tpublic push(...items: P[]): number {\n\t\tlet result: number\n\t\tif (this.mode === `record`) {\n\t\t\tthis.mode = `playback`\n\t\t\tresult = super.push(...items)\n\t\t\tthis.mode = `record`\n\t\t\tthis.emit({ type: `push`, items })\n\t\t} else {\n\t\t\tresult = super.push(...items)\n\t\t}\n\t\treturn result\n\t}\n\tpublic pop(): P | undefined {\n\t\tlet value: P | undefined\n\t\tif (this.mode === `record`) {\n\t\t\tthis.mode = `playback`\n\t\t\tvalue = super.pop()\n\t\t\tif (value === undefined) {\n\t\t\t\tthis.emit({ type: `pop` })\n\t\t\t} else {\n\t\t\t\tthis.emit({ type: `pop`, value })\n\t\t\t}\n\t\t\tthis.mode = `record`\n\t\t} else {\n\t\t\tvalue = super.pop()\n\t\t}\n\t\treturn value\n\t}\n\tpublic shift(): P | undefined {\n\t\tlet value: P | undefined\n\t\tif (this.mode === `record`) {\n\t\t\tthis.mode = `playback`\n\t\t\tvalue = super.shift()\n\t\t\tif (value === undefined) {\n\t\t\t\tthis.emit({ type: `shift` })\n\t\t\t} else {\n\t\t\t\tthis.emit({ type: `shift`, value })\n\t\t\t}\n\t\t\tthis.mode = `record`\n\t\t} else {\n\t\t\tvalue = super.shift()\n\t\t}\n\t\treturn value\n\t}\n\tpublic unshift(...items: P[]): number {\n\t\tlet result: number\n\t\tif (this.mode === `record`) {\n\t\t\tthis.mode = `playback`\n\t\t\tresult = super.unshift(...items)\n\t\t\tthis.emit({ type: `unshift`, items })\n\t\t\tthis.mode = `record`\n\t\t} else {\n\t\t\tresult = super.unshift(...items)\n\t\t}\n\t\treturn result\n\t}\n\n\tpublic reverse(): this {\n\t\tsuper.reverse()\n\t\tif (this.mode === `record`) {\n\t\t\tthis.emit({ type: `reverse` })\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic fill(value: P, start?: number, end?: number): this {\n\t\tif (this.mode === `record`) {\n\t\t\tthis.mode = `playback`\n\t\t\tconst prev = this.slice(start, end)\n\t\t\tsuper.fill(value, start, end)\n\t\t\tif (start === undefined) {\n\t\t\t\tthis.emit({ type: `fill`, value, prev })\n\t\t\t} else {\n\t\t\t\tif (end === undefined) {\n\t\t\t\t\tthis.emit({ type: `fill`, value, start, prev })\n\t\t\t\t} else {\n\t\t\t\t\tthis.emit({ type: `fill`, value, start, end, prev })\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.mode = `record`\n\t\t} else {\n\t\t\tsuper.fill(value, start, end)\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic sort(compareFn?: (a: P, b: P) => number): this {\n\t\tif (this.mode === `record`) {\n\t\t\tthis.mode = `playback`\n\t\t\tconst prev = [...this]\n\t\t\tsuper.sort(compareFn)\n\t\t\tconst next = [...this]\n\t\t\tthis.emit({ type: `sort`, next, prev })\n\t\t\tthis.mode = `record`\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic splice(start: number, deleteCount?: number): P[]\n\tpublic splice(start: number, deleteCount: number, ...items: P[]): P[]\n\tpublic splice(\n\t\t...params: [start: number, deleteCount?: number, ...items: P[]]\n\t): P[] {\n\t\tconst [start, deleteCount, ...items] = params\n\t\tconst originalMode = this.mode\n\t\tif (originalMode === `record`) this.mode = `playback`\n\t\tconst deleted = super.splice(...(params as [number, number, ...P[]]))\n\t\tif (originalMode === `record`) this.mode = `record`\n\t\tif (deleteCount === undefined) {\n\t\t\tthis.emit({\n\t\t\t\ttype: `splice`,\n\t\t\t\tstart,\n\t\t\t\titems,\n\t\t\t\tdeleted,\n\t\t\t\tdeleteCount: deleted.length,\n\t\t\t})\n\t\t} else {\n\t\t\tthis.emit({ type: `splice`, start, items, deleted, deleteCount })\n\t\t}\n\n\t\treturn deleted\n\t}\n\n\tpublic copyWithin(target: number, start: number, end?: number): this {\n\t\tconst originalMode = this.mode\n\t\tlet prev: P[] | undefined\n\t\tif (originalMode === `record`) {\n\t\t\tprev = this.slice(target)\n\t\t\tthis.mode = `playback`\n\t\t}\n\t\tsuper.copyWithin(target, start, end)\n\t\tif (originalMode === `record`) this.mode = `record`\n\t\tif (prev) {\n\t\t\tif (end === undefined) {\n\t\t\t\tthis.emit({ type: `copyWithin`, prev, target, start })\n\t\t\t} else {\n\t\t\t\tthis.emit({ type: `copyWithin`, prev, target, start, end })\n\t\t\t}\n\t\t}\n\t\treturn this\n\t}\n\n\tpublic subscribe(\n\t\tkey: string,\n\t\tfn: (update: PackedArrayUpdate<P>) => void,\n\t): () => void {\n\t\treturn this.subject.subscribe(key, fn)\n\t}\n\n\tpublic emit(update: ArrayUpdate<P>): void {\n\t\tthis.subject.next(packArrayUpdate(update))\n\t}\n\n\tprivate doStep(update: ArrayUpdate<P>): void {\n\t\tconst type = update.type\n\t\tswitch (type) {\n\t\t\tcase `copyWithin`:\n\t\t\t\tthis.copyWithin(update.target, update.start, update.end)\n\t\t\t\tbreak\n\t\t\tcase `extend`:\n\t\t\t\tthis.length = update.next\n\t\t\t\tbreak\n\t\t\tcase `fill`:\n\t\t\t\tthis.fill(update.value, update.start, update.end)\n\t\t\t\tbreak\n\t\t\tcase `pop`:\n\t\t\t\tthis.pop()\n\t\t\t\tbreak\n\t\t\tcase `push`:\n\t\t\t\tthis.push(...update.items)\n\t\t\t\tbreak\n\t\t\tcase `reverse`:\n\t\t\t\tthis.reverse()\n\t\t\t\tbreak\n\t\t\tcase `shift`:\n\t\t\t\tthis.shift()\n\t\t\t\tbreak\n\t\t\tcase `sort`:\n\t\t\t\tfor (let i = 0; i < update.next.length; i++) {\n\t\t\t\t\tthis[i] = update.next[i]\n\t\t\t\t}\n\t\t\t\tthis.length = update.next.length\n\t\t\t\tbreak\n\t\t\tcase `splice`:\n\t\t\t\tthis.splice(update.start, update.deleteCount, ...update.items)\n\t\t\t\tbreak\n\t\t\tcase `truncate`:\n\t\t\t\tthis.length = update.length\n\t\t\t\tbreak\n\t\t\tcase `set`:\n\t\t\t\tthis[update.index] = update.next\n\t\t\t\tbreak\n\t\t\tcase `unshift`:\n\t\t\t\tthis.unshift(...update.items)\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tpublic do(update: PackedArrayUpdate<P>): null {\n\t\tthis.mode = `playback`\n\t\tconst unpacked = unpackArrayUpdate(update)\n\t\tthis.doStep(unpacked)\n\t\tthis.mode = `record`\n\t\treturn null\n\t}\n\n\tpublic undoStep(update: ArrayUpdate<P>): void {\n\t\tswitch (update.type) {\n\t\t\tcase `copyWithin`:\n\t\t\t\tfor (let i = 0; i < update.prev.length; i++) {\n\t\t\t\t\tthis[i + update.target] = update.prev[i]\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase `extend`:\n\t\t\t\tthis.length = update.prev\n\t\t\t\tbreak\n\t\t\tcase `fill`:\n\t\t\t\t{\n\t\t\t\t\tconst start = update.start ?? 0\n\t\t\t\t\tfor (let i = 0; i < update.prev.length; i++) {\n\t\t\t\t\t\tthis[i + start] = update.prev[i]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase `pop`:\n\t\t\t\tif (update.value) this.push(update.value)\n\t\t\t\tbreak\n\t\t\tcase `push`:\n\t\t\t\t{\n\t\t\t\t\tlet i = update.items.length - 1\n\t\t\t\t\twhile (i >= 0) {\n\t\t\t\t\t\tthis.pop()\n\t\t\t\t\t\t--i\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase `reverse`:\n\t\t\t\tthis.reverse()\n\t\t\t\tbreak\n\t\t\tcase `shift`:\n\t\t\t\tif (update.value) this.unshift(update.value)\n\t\t\t\tbreak\n\t\t\tcase `sort`:\n\t\t\t\tfor (let i = 0; i < update.prev.length; i++) {\n\t\t\t\t\tthis[i] = update.prev[i]\n\t\t\t\t}\n\t\t\t\tthis.length = update.prev.length\n\t\t\t\tbreak\n\t\t\tcase `set`:\n\t\t\t\tif (update.prev) {\n\t\t\t\t\tthis[update.index] = update.prev\n\t\t\t\t} else {\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n\t\t\t\t\tdelete this[update.index]\n\t\t\t\t\tconst firstEmptyIndex = this.findIndex(\n\t\t\t\t\t\t(_, i) => !Object.hasOwn(this, i),\n\t\t\t\t\t)\n\t\t\t\t\tif (firstEmptyIndex !== -1) {\n\t\t\t\t\t\tthis.length = firstEmptyIndex\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase `splice`:\n\t\t\t\tthis.splice(update.start, update.items.length, ...update.deleted)\n\t\t\t\tbreak\n\t\t\tcase `truncate`:\n\t\t\t\tthis.push(...update.items)\n\t\t\t\tbreak\n\t\t\tcase `unshift`:\n\t\t\t\t{\n\t\t\t\t\tlet i = update.items.length - 1\n\t\t\t\t\twhile (i >= 0) {\n\t\t\t\t\t\tthis.shift()\n\t\t\t\t\t\t--i\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tpublic undo(update: PackedArrayUpdate<P>): number | null {\n\t\tthis.mode = `playback`\n\t\tconst unpacked = unpackArrayUpdate(update)\n\t\tthis.undoStep(unpacked)\n\t\tthis.mode = `record`\n\t\treturn null\n\t}\n}\n"],"mappings":"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"}
|