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.
Files changed (32) hide show
  1. package/dist/eslint-plugin/index.js +1 -1
  2. package/dist/internal/index.d.ts +11 -2
  3. package/dist/internal/index.d.ts.map +1 -1
  4. package/dist/internal/index.js +34 -1
  5. package/dist/internal/index.js.map +1 -1
  6. package/dist/realtime/index.d.ts +2 -1
  7. package/dist/realtime/index.d.ts.map +1 -1
  8. package/dist/realtime/index.js.map +1 -1
  9. package/dist/realtime-client/index.js +2 -1
  10. package/dist/realtime-client/index.js.map +1 -1
  11. package/dist/realtime-server/index.js +1 -1
  12. package/dist/realtime-server/index.js.map +1 -1
  13. package/dist/transceivers/o-list/index.d.ts +87 -0
  14. package/dist/transceivers/o-list/index.d.ts.map +1 -0
  15. package/dist/transceivers/o-list/index.js +513 -0
  16. package/dist/transceivers/o-list/index.js.map +1 -0
  17. package/dist/transceivers/set-rtx/index.d.ts +16 -16
  18. package/dist/transceivers/set-rtx/index.d.ts.map +1 -1
  19. package/dist/transceivers/set-rtx/index.js.map +1 -1
  20. package/dist/transceivers/u-list/index.d.ts +27 -18
  21. package/dist/transceivers/u-list/index.d.ts.map +1 -1
  22. package/dist/transceivers/u-list/index.js +54 -34
  23. package/dist/transceivers/u-list/index.js.map +1 -1
  24. package/package.json +17 -13
  25. package/src/internal/index.ts +1 -0
  26. package/src/internal/micro.ts +69 -0
  27. package/src/realtime/shared-room-store.ts +3 -2
  28. package/src/realtime-server/ipc-sockets/parent-socket.ts +1 -1
  29. package/src/transceivers/o-list/index.ts +1 -0
  30. package/src/transceivers/o-list/o-list.ts +613 -0
  31. package/src/transceivers/set-rtx/set-rtx.ts +22 -21
  32. 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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"}