atom.io 0.41.0 → 0.42.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/internal/index.d.ts +21 -38
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +82 -263
- package/dist/internal/index.js.map +1 -1
- package/dist/main/index.d.ts +18 -36
- package/dist/main/index.d.ts.map +1 -1
- package/dist/main/index.js +13 -2
- package/dist/main/index.js.map +1 -1
- package/dist/realtime/index.d.ts +2 -3
- package/dist/realtime/index.d.ts.map +1 -1
- package/dist/realtime/index.js +1 -1
- package/dist/realtime/index.js.map +1 -1
- package/dist/realtime-server/index.js +1 -1
- package/dist/realtime-server/index.js.map +1 -1
- package/dist/realtime-testing/index.js +1 -1
- package/dist/struct/index.d.ts +14 -0
- package/dist/struct/index.d.ts.map +1 -0
- package/dist/struct/index.js +35 -0
- package/dist/struct/index.js.map +1 -0
- package/dist/transceivers/o-list/index.d.ts +10 -6
- package/dist/transceivers/o-list/index.d.ts.map +1 -1
- package/dist/transceivers/o-list/index.js +170 -169
- package/dist/transceivers/o-list/index.js.map +1 -1
- package/dist/transceivers/set-rtx/index.d.ts +1 -0
- 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 +10 -6
- package/dist/transceivers/u-list/index.d.ts.map +1 -1
- package/dist/transceivers/u-list/index.js +23 -22
- package/dist/transceivers/u-list/index.js.map +1 -1
- package/dist/utility-types-aZkJVERa.d.ts +10 -0
- package/dist/utility-types-aZkJVERa.d.ts.map +1 -0
- package/package.json +13 -9
- package/src/internal/index.ts +0 -1
- package/src/internal/join/create-join.ts +8 -11
- package/src/internal/join/edit-relations-in-store.ts +6 -8
- package/src/internal/join/find-relations-in-store.ts +11 -67
- package/src/internal/join/get-internal-relations-from-store.ts +11 -5
- package/src/internal/join/get-join.ts +7 -9
- package/src/internal/join/join-internal.ts +154 -394
- package/src/internal/mutable/transceiver.ts +1 -5
- package/src/internal/set-state/dispatch-state-update.ts +1 -1
- package/src/internal/store/store.ts +1 -1
- package/src/main/join.ts +68 -151
- package/src/main/realm.ts +4 -4
- package/src/realtime/shared-room-store.ts +5 -15
- package/src/realtime-server/realtime-server-stores/server-room-external-store.ts +1 -1
- package/src/struct/index.ts +1 -0
- package/src/{internal → struct}/micro.ts +1 -1
- package/src/transceivers/o-list/o-list.ts +175 -171
- package/src/transceivers/set-rtx/set-rtx.ts +4 -0
- package/src/transceivers/u-list/u-list.ts +37 -33
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Subject
|
|
1
|
+
import { Subject } from "atom.io/internal";
|
|
2
|
+
import { enumeration, packValue, unpackValue } from "atom.io/struct";
|
|
2
3
|
|
|
3
4
|
//#region src/transceivers/o-list/o-list.ts
|
|
4
5
|
const ARRAY_UPDATES = [
|
|
@@ -16,170 +17,6 @@ const ARRAY_UPDATES = [
|
|
|
16
17
|
`sort`
|
|
17
18
|
];
|
|
18
19
|
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
20
|
var OList = class OList extends Array {
|
|
184
21
|
mode = `record`;
|
|
185
22
|
subject = new Subject();
|
|
@@ -388,7 +225,7 @@ var OList = class OList extends Array {
|
|
|
388
225
|
return this.subject.subscribe(key, fn);
|
|
389
226
|
}
|
|
390
227
|
emit(update) {
|
|
391
|
-
this.subject.next(
|
|
228
|
+
this.subject.next(OList.packUpdate(update));
|
|
392
229
|
}
|
|
393
230
|
doStep(update) {
|
|
394
231
|
switch (update.type) {
|
|
@@ -433,7 +270,7 @@ var OList = class OList extends Array {
|
|
|
433
270
|
}
|
|
434
271
|
do(update) {
|
|
435
272
|
this.mode = `playback`;
|
|
436
|
-
const unpacked =
|
|
273
|
+
const unpacked = OList.unpackUpdate(update);
|
|
437
274
|
this.doStep(unpacked);
|
|
438
275
|
this.mode = `record`;
|
|
439
276
|
return null;
|
|
@@ -501,13 +338,177 @@ var OList = class OList extends Array {
|
|
|
501
338
|
}
|
|
502
339
|
undo(update) {
|
|
503
340
|
this.mode = `playback`;
|
|
504
|
-
const unpacked =
|
|
341
|
+
const unpacked = OList.unpackUpdate(update);
|
|
505
342
|
this.undoStep(unpacked);
|
|
506
343
|
this.mode = `record`;
|
|
507
344
|
return null;
|
|
508
345
|
}
|
|
346
|
+
static packUpdate(update) {
|
|
347
|
+
let packed = ARRAY_UPDATE_ENUM[update.type] + `\u001F`;
|
|
348
|
+
switch (update.type) {
|
|
349
|
+
case `set`:
|
|
350
|
+
packed += update.index + `\u001E` + packValue(update.next);
|
|
351
|
+
if (update.prev !== void 0) packed += `\u001E` + packValue(update.prev);
|
|
352
|
+
return packed;
|
|
353
|
+
case `truncate`: return packed + update.length + `\u001E` + update.items.map(packValue).join(`\u001E`);
|
|
354
|
+
case `extend`: return packed + update.next + `\u001E` + update.prev;
|
|
355
|
+
case `pop`:
|
|
356
|
+
case `shift`:
|
|
357
|
+
if (update.value !== void 0) packed += packValue(update.value);
|
|
358
|
+
return packed;
|
|
359
|
+
case `push`:
|
|
360
|
+
case `unshift`: return packed + update.items.map(packValue).join(`\u001E`);
|
|
361
|
+
case `copyWithin`:
|
|
362
|
+
packed += update.target + `\u001E` + update.start;
|
|
363
|
+
if (update.end !== void 0) packed += `\u001E` + update.end;
|
|
364
|
+
packed += `\u001E\u001E` + update.prev.map(packValue).join(`\u001E`);
|
|
365
|
+
return packed;
|
|
366
|
+
case `fill`:
|
|
367
|
+
packed += packValue(update.value);
|
|
368
|
+
if (update.start !== void 0) packed += `\u001E` + update.start;
|
|
369
|
+
if (update.end !== void 0) packed += `\u001E` + update.end;
|
|
370
|
+
packed += `\u001E\u001E` + update.prev.map(packValue).join(`\u001E`);
|
|
371
|
+
return packed;
|
|
372
|
+
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`);
|
|
373
|
+
case `reverse`: return packed;
|
|
374
|
+
case `sort`: return packed + update.next.map(packValue).join(`\u001E`) + `\u001E\u001E` + update.prev.map(packValue).join(`\u001E`);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
static unpackUpdate(packed) {
|
|
378
|
+
const [head, tail] = packed.split(`\u001F`);
|
|
379
|
+
const type = ARRAY_UPDATE_ENUM[head];
|
|
380
|
+
switch (type) {
|
|
381
|
+
case `set`: {
|
|
382
|
+
const [i, n, p] = tail.split(`\u001E`);
|
|
383
|
+
const index = +i;
|
|
384
|
+
const next = unpackValue(n);
|
|
385
|
+
if (p === void 0) return {
|
|
386
|
+
type,
|
|
387
|
+
index,
|
|
388
|
+
next
|
|
389
|
+
};
|
|
390
|
+
const prev = unpackValue(p);
|
|
391
|
+
return {
|
|
392
|
+
type,
|
|
393
|
+
index,
|
|
394
|
+
next,
|
|
395
|
+
prev
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
case `truncate`: {
|
|
399
|
+
const [l, ...i] = tail.split(`\u001E`);
|
|
400
|
+
const length = +l;
|
|
401
|
+
const items = i.map(unpackValue);
|
|
402
|
+
return {
|
|
403
|
+
type,
|
|
404
|
+
length,
|
|
405
|
+
items
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
case `extend`: {
|
|
409
|
+
const [n, p] = tail.split(`\u001E`);
|
|
410
|
+
const next = +n;
|
|
411
|
+
const prev = +p;
|
|
412
|
+
return {
|
|
413
|
+
type,
|
|
414
|
+
next,
|
|
415
|
+
prev
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
case `pop`:
|
|
419
|
+
case `shift`:
|
|
420
|
+
if (tail !== ``) {
|
|
421
|
+
const value = unpackValue(tail);
|
|
422
|
+
return {
|
|
423
|
+
type,
|
|
424
|
+
value
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
return { type };
|
|
428
|
+
case `push`:
|
|
429
|
+
case `unshift`: {
|
|
430
|
+
const items = tail.split(`\u001E`).map(unpackValue);
|
|
431
|
+
return {
|
|
432
|
+
type,
|
|
433
|
+
items
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
case `copyWithin`: {
|
|
437
|
+
const [numbers, data] = tail.split(`\u001E\u001E`);
|
|
438
|
+
const prev = data ? data.split(`\u001E`).map(unpackValue) : [];
|
|
439
|
+
const [t, s, e] = numbers.split(`\u001E`);
|
|
440
|
+
const target = +t;
|
|
441
|
+
const start = +s;
|
|
442
|
+
if (e === void 0) return {
|
|
443
|
+
type,
|
|
444
|
+
target,
|
|
445
|
+
start,
|
|
446
|
+
prev
|
|
447
|
+
};
|
|
448
|
+
const end = +e;
|
|
449
|
+
return {
|
|
450
|
+
type,
|
|
451
|
+
target,
|
|
452
|
+
start,
|
|
453
|
+
prev,
|
|
454
|
+
end
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
case `fill`: {
|
|
458
|
+
const [numbers, data] = tail.split(`\u001E\u001E`);
|
|
459
|
+
const prev = data ? data.split(`\u001E`).map(unpackValue) : [];
|
|
460
|
+
const [v, s, e] = numbers.split(`\u001E`);
|
|
461
|
+
const value = unpackValue(v);
|
|
462
|
+
if (s === void 0 && e === void 0) return {
|
|
463
|
+
type,
|
|
464
|
+
value,
|
|
465
|
+
prev
|
|
466
|
+
};
|
|
467
|
+
const start = +s;
|
|
468
|
+
if (e === void 0) return {
|
|
469
|
+
type,
|
|
470
|
+
value,
|
|
471
|
+
prev,
|
|
472
|
+
start
|
|
473
|
+
};
|
|
474
|
+
const end = +e;
|
|
475
|
+
return {
|
|
476
|
+
type,
|
|
477
|
+
value,
|
|
478
|
+
prev,
|
|
479
|
+
start,
|
|
480
|
+
end
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
case `splice`: {
|
|
484
|
+
const [s, c, i, d] = tail.split(`\u001E\u001E`);
|
|
485
|
+
const start = +s;
|
|
486
|
+
const deleteCount = +c;
|
|
487
|
+
const items = i ? i.split(`\u001E`).map(unpackValue) : [];
|
|
488
|
+
const deleted = d ? d.split(`\u001E`).map(unpackValue) : [];
|
|
489
|
+
return {
|
|
490
|
+
type,
|
|
491
|
+
start,
|
|
492
|
+
deleteCount,
|
|
493
|
+
items,
|
|
494
|
+
deleted
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
case `reverse`: return { type };
|
|
498
|
+
case `sort`: {
|
|
499
|
+
const [n, p] = tail.split(`\u001E\u001E`);
|
|
500
|
+
const next = n ? n.split(`\u001E`).map(unpackValue) : [];
|
|
501
|
+
const prev = p ? p.split(`\u001E`).map(unpackValue) : [];
|
|
502
|
+
return {
|
|
503
|
+
type,
|
|
504
|
+
next,
|
|
505
|
+
prev
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
509
510
|
};
|
|
510
511
|
|
|
511
512
|
//#endregion
|
|
512
|
-
export { ARRAY_UPDATE_ENUM, OList
|
|
513
|
+
export { ARRAY_UPDATE_ENUM, OList };
|
|
513
514
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +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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"}
|
|
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 { Fn, Transceiver, TransceiverMode } from \"atom.io/internal\"\nimport { Subject } from \"atom.io/internal\"\nimport type { primitive } from \"atom.io/json\"\nimport type { Enumeration } from \"atom.io/struct\"\nimport { enumeration, packValue, unpackValue } from \"atom.io/struct\"\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 type ArrayMutationHandler = {\n\t[K in Exclude<OListUpdateType, `extend` | `set` | `truncate`>]: Fn\n}\n\nexport type OListView<P extends primitive> = ReadonlyArray<P> & {\n\tsubscribe: (\n\t\tkey: string,\n\t\tfn: (update: PackedArrayUpdate<P>) => void,\n\t) => () => void\n}\n\nexport class OList<P extends primitive>\n\textends Array<P>\n\timplements\n\t\tTransceiver<OListView<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: OListView<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(OList.packUpdate(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 = OList.unpackUpdate(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 = OList.unpackUpdate(update)\n\t\tthis.undoStep(unpacked)\n\t\tthis.mode = `record`\n\t\treturn null\n\t}\n\n\tpublic static packUpdate<P extends primitive>(\n\t\tupdate: ArrayUpdate<P>,\n\t): PackedArrayUpdate<P> {\n\t\tlet packed = ARRAY_UPDATE_ENUM[update.type] + `\\u001F`\n\t\tswitch (update.type) {\n\t\t\tcase `set`:\n\t\t\t\tpacked += update.index + `\\u001E` + packValue(update.next)\n\t\t\t\tif (update.prev !== undefined) {\n\t\t\t\t\tpacked += `\\u001E` + packValue(update.prev)\n\t\t\t\t}\n\t\t\t\treturn packed\n\t\t\tcase `truncate`:\n\t\t\t\treturn (\n\t\t\t\t\tpacked +\n\t\t\t\t\tupdate.length +\n\t\t\t\t\t`\\u001E` +\n\t\t\t\t\tupdate.items.map(packValue).join(`\\u001E`)\n\t\t\t\t)\n\t\t\tcase `extend`:\n\t\t\t\treturn packed + update.next + `\\u001E` + update.prev\n\t\t\tcase `pop`:\n\t\t\tcase `shift`:\n\t\t\t\tif (update.value !== undefined) {\n\t\t\t\t\tpacked += packValue(update.value)\n\t\t\t\t}\n\t\t\t\treturn packed\n\t\t\tcase `push`:\n\t\t\tcase `unshift`:\n\t\t\t\treturn packed + update.items.map(packValue).join(`\\u001E`)\n\t\t\tcase `copyWithin`:\n\t\t\t\tpacked += update.target + `\\u001E` + update.start\n\t\t\t\tif (update.end !== undefined) {\n\t\t\t\t\tpacked += `\\u001E` + update.end\n\t\t\t\t}\n\t\t\t\tpacked += `\\u001E\\u001E` + update.prev.map(packValue).join(`\\u001E`)\n\t\t\t\treturn packed\n\t\t\tcase `fill`:\n\t\t\t\tpacked += packValue(update.value)\n\t\t\t\tif (update.start !== undefined) {\n\t\t\t\t\tpacked += `\\u001E` + update.start\n\t\t\t\t}\n\t\t\t\tif (update.end !== undefined) {\n\t\t\t\t\tpacked += `\\u001E` + update.end\n\t\t\t\t}\n\t\t\t\tpacked += `\\u001E\\u001E` + update.prev.map(packValue).join(`\\u001E`)\n\t\t\t\treturn packed\n\t\t\tcase `splice`:\n\t\t\t\treturn (\n\t\t\t\t\tpacked +\n\t\t\t\t\tupdate.start +\n\t\t\t\t\t`\\u001E\\u001E` +\n\t\t\t\t\tupdate.deleteCount +\n\t\t\t\t\t`\\u001E\\u001E` +\n\t\t\t\t\tupdate.items.map(packValue).join(`\\u001E`) +\n\t\t\t\t\t`\\u001E\\u001E` +\n\t\t\t\t\tupdate.deleted.map(packValue).join(`\\u001E`)\n\t\t\t\t)\n\t\t\tcase `reverse`:\n\t\t\t\treturn packed\n\t\t\tcase `sort`:\n\t\t\t\treturn (\n\t\t\t\t\tpacked +\n\t\t\t\t\tupdate.next.map(packValue).join(`\\u001E`) +\n\t\t\t\t\t`\\u001E\\u001E` +\n\t\t\t\t\tupdate.prev.map(packValue).join(`\\u001E`)\n\t\t\t\t)\n\t\t}\n\t}\n\n\tpublic static unpackUpdate<P extends primitive>(\n\t\tpacked: PackedArrayUpdate<P>,\n\t): ArrayUpdate<P> {\n\t\tconst [head, tail] = packed.split(`\\u001F`) as [\n\t\t\tExtract<keyof typeof ARRAY_UPDATE_ENUM, number>,\n\t\t\tstring,\n\t\t]\n\t\tconst type = ARRAY_UPDATE_ENUM[head]\n\t\tswitch (type) {\n\t\t\tcase `set`: {\n\t\t\t\tconst [i, n, p] = tail.split(`\\u001E`)\n\t\t\t\tconst index = +i\n\t\t\t\tconst next = unpackValue(n) as P\n\t\t\t\tif (p === undefined) {\n\t\t\t\t\treturn { type, index, next }\n\t\t\t\t}\n\t\t\t\tconst prev = unpackValue(p) as P\n\t\t\t\treturn { type, index, next, prev }\n\t\t\t}\n\t\t\tcase `truncate`: {\n\t\t\t\tconst [l, ...i] = tail.split(`\\u001E`)\n\t\t\t\tconst length = +l\n\t\t\t\tconst items = i.map(unpackValue) as P[]\n\t\t\t\treturn { type, length, items }\n\t\t\t}\n\t\t\tcase `extend`: {\n\t\t\t\tconst [n, p] = tail.split(`\\u001E`)\n\t\t\t\tconst next = +n\n\t\t\t\tconst prev = +p\n\t\t\t\treturn { type, next, prev }\n\t\t\t}\n\t\t\tcase `pop`:\n\t\t\tcase `shift`:\n\t\t\t\tif (tail !== ``) {\n\t\t\t\t\tconst value = unpackValue(tail) as P\n\t\t\t\t\treturn { type, value }\n\t\t\t\t}\n\t\t\t\treturn { type }\n\t\t\tcase `push`:\n\t\t\tcase `unshift`: {\n\t\t\t\tconst items = tail.split(`\\u001E`).map(unpackValue) as P[]\n\t\t\t\treturn { type, items }\n\t\t\t}\n\t\t\tcase `copyWithin`: {\n\t\t\t\tconst [numbers, data] = tail.split(`\\u001E\\u001E`)\n\t\t\t\tconst prev = data ? (data.split(`\\u001E`).map(unpackValue) as P[]) : []\n\t\t\t\tconst [t, s, e] = numbers.split(`\\u001E`)\n\t\t\t\tconst target = +t\n\t\t\t\tconst start = +s\n\t\t\t\tif (e === undefined) {\n\t\t\t\t\treturn { type, target, start, prev }\n\t\t\t\t}\n\t\t\t\tconst end = +e\n\t\t\t\treturn { type, target, start, prev, end }\n\t\t\t}\n\t\t\tcase `fill`: {\n\t\t\t\tconst [numbers, data] = tail.split(`\\u001E\\u001E`)\n\t\t\t\tconst prev = data ? (data.split(`\\u001E`).map(unpackValue) as P[]) : []\n\t\t\t\tconst [v, s, e] = numbers.split(`\\u001E`)\n\t\t\t\tconst value = unpackValue(v) as P\n\t\t\t\tif (s === undefined && e === undefined) {\n\t\t\t\t\treturn { type, value, prev }\n\t\t\t\t}\n\t\t\t\tconst start = +s\n\t\t\t\tif (e === undefined) {\n\t\t\t\t\treturn { type, value, prev, start }\n\t\t\t\t}\n\t\t\t\tconst end = +e\n\t\t\t\treturn { type, value, prev, start, end }\n\t\t\t}\n\t\t\tcase `splice`: {\n\t\t\t\tconst [s, c, i, d] = tail.split(`\\u001E\\u001E`)\n\n\t\t\t\tconst start = +s\n\t\t\t\tconst deleteCount = +c\n\t\t\t\tconst items = i ? (i.split(`\\u001E`).map(unpackValue) as P[]) : []\n\t\t\t\tconst deleted = d ? (d.split(`\\u001E`).map(unpackValue) as P[]) : []\n\t\t\t\treturn { type, start, deleteCount, items, deleted }\n\t\t\t}\n\t\t\tcase `reverse`:\n\t\t\t\treturn { type }\n\t\t\tcase `sort`: {\n\t\t\t\tconst [n, p] = tail.split(`\\u001E\\u001E`)\n\t\t\t\tconst next = n ? (n.split(`\\u001E`).map(unpackValue) as P[]) : []\n\t\t\t\tconst prev = p ? (p.split(`\\u001E`).map(unpackValue) as P[]) : []\n\t\t\t\treturn { type, next, prev }\n\t\t\t}\n\t\t}\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ interface SetRTXView<P extends primitive> extends ReadonlySet<P> {
|
|
|
10
10
|
readonly cacheLimit: number;
|
|
11
11
|
readonly cacheIdx: number;
|
|
12
12
|
readonly cacheUpdateNumber: number;
|
|
13
|
+
readonly subscribe: (key: string, fn: (update: NumberedSetUpdateString) => void) => () => void;
|
|
13
14
|
}
|
|
14
15
|
interface SetRTXJson<P extends primitive> extends Json.Object {
|
|
15
16
|
members: P[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/transceivers/set-rtx/set-rtx.ts"],"sourcesContent":[],"mappings":";;;;KAKY,aAAA;AAAA,KACA,eAAA,GADA,GACqB,aADrB,IAAA,MAAA,EAAA;AACA,KACA,uBAAA,GADqB,GAAA,MAAA,GAAA,GAAA,IACwB,eADxB,EAAA;AACrB,UAEK,UAFL,CAAA,UAE0B,SAFmB,CAAA,SAEA,WAFA,CAEY,CAFZ,CAAA,CAAA;EAEzD,SAAiB,KAAA,EACA,aADA,CACc,uBADd,GAAA,IAAA,CAAA;EAAA,SAAA,UAAA,EAAA,MAAA;WAAqB,QAAA,EAAA,MAAA;WAA+B,iBAAA,EAAA,MAAA;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/transceivers/set-rtx/set-rtx.ts"],"sourcesContent":[],"mappings":";;;;KAKY,aAAA;AAAA,KACA,eAAA,GADA,GACqB,aADrB,IAAA,MAAA,EAAA;AACA,KACA,uBAAA,GADqB,GAAA,MAAA,GAAA,GAAA,IACwB,eADxB,EAAA;AACrB,UAEK,UAFL,CAAA,UAE0B,SAFmB,CAAA,SAEA,WAFA,CAEY,CAFZ,CAAA,CAAA;EAEzD,SAAiB,KAAA,EACA,aADA,CACc,uBADd,GAAA,IAAA,CAAA;EAAA,SAAA,UAAA,EAAA,MAAA;WAAqB,QAAA,EAAA,MAAA;WAA+B,iBAAA,EAAA,MAAA;WACtC,SAAA,EAAA,CAAA,GAAA,EAAA,MAAA,EAAA,EAAA,EAAA,CAAA,MAAA,EAMhB,uBANgB,EAAA,GAAA,IAAA,EAAA,GAAA,GAAA,GAAA,IAAA;;AAMhB,UAIE,UAJF,CAAA,UAIuB,SAJvB,CAAA,SAI0C,IAAA,CAAK,MAJ/C,CAAA;SAP0C,EAY/C,CAZ+C,EAAA;EAAA,KAAA,EAAA,CAahD,uBAbgD,GAAA,IAAA,CAAA,EAAA;EAWzD,UAAiB,EAAA,MAAA;EAAA,QAAA,EAAA,MAAA;mBAAqB,EAAA,MAAA;;AAE7B,cAKI,MALJ,CAAA,UAKqB,SALrB,CAAA,SAMA,GANA,CAMI,CANJ,CAAA,YAQP,WARO,CAQK,UARL,CAQgB,CARhB,CAAA,EAQoB,uBARpB,EAQ6C,UAR7C,CAQwD,CARxD,CAAA,CAAA,EASP,OATO,CAAA;QAWK,eAbgD;EAAA,SAAA,OAAA,EAcpC,OAdoC,CAc5B,eAd4B,CAAA;EAO9D,UAAa,EAAA,MAAA;EAAA,KAAA,EAAA,CAUG,uBAVH,GAAA,IAAA,CAAA,EAAA;UAAiB,EAAA,MAAA;mBACjB,EAAA,MAAA;aAEY,CAAA,MAAA,CAAA,EAWI,QAXJ,CAWa,CAXb,CAAA,EAAA,UAAA,CAAA,EAAA,MAAA;WAAX,aAAA,EA4BkB,UA5BlB,CA4B6B,CA5B7B,CAAA;QAAe,CAAA,CAAA,EA8BX,UA9BW,CA8BA,CA9BA,CAAA;SAAoC,QAAA,CAAA,UAwC/B,SAxC+B,CAAA,CAAA,IAAA,EAwCd,UAxCc,CAwCH,CAxCG,CAAA,CAAA,EAwCE,MAxCF,CAwCS,CAxCT,CAAA;WAAX,EAgDnC,CAhDmC,CAAA,EAAA,IAAA;SAGxC,EAAA,IAAA;QACoB,CAAA,KAAA,EA8DZ,CA9DY,CAAA,EAAA,OAAA;WAAR,MAAA,EAuED,MAvEC,CAuEM,CAvEN,CAAA,GAAA,IAAA;SAwEX,MArEC,CAqEM,CArEN,CAAA,GAAA,IAAA;oBAIsB,EAkEV,eAlEU,EAAA,GAAA,IAAA;aAAT,CAAA,GAAA,EAAA,CAAA,KAAA,EAmEI,MAnEJ,CAmEW,CAnEX,CAAA,EAAA,GAAA,OAAA,CAAA,EAAA,IAAA;YAiBc,UAAA,CAAA,GAAA,EAAA,MAAA,EAAA,EAAA,EAAA,CAAA,MAAA,EAmF5B,eAnF4B,EAAA,GAAA,IAAA,CAAA,EAAA,GAAA,GAAA,IAAA;WAAX,CAAA,GAAA,EAAA,MAAA,EAAA,EAAA,EAAA,CAAA,MAAA,EAyFjB,uBAzFiB,EAAA,GAAA,IAAA,CAAA,EAAA,GAAA,GAAA,IAAA;aAEH,EA8FR,eA9FQ,CAAA,EAAA,IAAA;UAAX,MAAA;iBAUgB,CAAA,MAAA,EA6GF,uBA7GE,CAAA,EAAA,MAAA;WAA4B,EAkH3C,uBAlH2C,CAAA,EAAA,MAAA,GAAA,cAAA,GAAA,IAAA;UAAX,CAAA,MAAA,EA6J1B,eA7J0B,CAAA,EAAA,IAAA;aAAuB,EAsLrD,uBAtLqD,CAAA,EAAA,MAAA,GAAA,IAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/transceivers/set-rtx/set-rtx.ts"],"sourcesContent":["import type { Lineage, Transceiver, TransceiverMode } from \"atom.io/internal\"\nimport { Subject } from \"atom.io/internal\"\nimport type { Json, primitive } from \"atom.io/json\"\nimport { stringifyJson } from \"atom.io/json\"\n\nexport type SetUpdateType = `add` | `clear` | `del` | `tx`\nexport type SetUpdateString = `${SetUpdateType}:${string}`\nexport type NumberedSetUpdateString = `${number | `*`}=${SetUpdateString}`\n\nexport interface SetRTXView<P extends primitive> extends ReadonlySet<P> {\n\treadonly cache: ReadonlyArray<NumberedSetUpdateString | null>\n\treadonly cacheLimit: number\n\treadonly cacheIdx: number\n\treadonly cacheUpdateNumber: number\n}\n\nexport interface SetRTXJson<P extends primitive> extends Json.Object {\n\tmembers: P[]\n\tcache: (NumberedSetUpdateString | null)[]\n\tcacheLimit: number\n\tcacheIdx: number\n\tcacheUpdateNumber: number\n}\nexport class SetRTX<P extends primitive>\n\textends Set<P>\n\timplements\n\t\tTransceiver<SetRTXView<P>, NumberedSetUpdateString, SetRTXJson<P>>,\n\t\tLineage\n{\n\tpublic mode: TransceiverMode = `record`\n\tpublic readonly subject: Subject<SetUpdateString> =\n\t\tnew Subject<SetUpdateString>()\n\tpublic cacheLimit = 0\n\tpublic cache: (NumberedSetUpdateString | null)[] = []\n\tpublic cacheIdx = -1\n\tpublic cacheUpdateNumber = -1\n\n\tpublic constructor(values?: Iterable<P>, cacheLimit = 0) {\n\t\tsuper(values)\n\t\tif (values instanceof SetRTX) {\n\t\t\tthis.parent = values\n\t\t\tthis.cacheUpdateNumber = values.cacheUpdateNumber\n\t\t}\n\t\tif (cacheLimit) {\n\t\t\tthis.cacheLimit = cacheLimit\n\t\t\tthis.cache = new Array(cacheLimit)\n\t\t\tthis.subscribe(`auto cache`, (update) => {\n\t\t\t\tthis.cacheIdx++\n\t\t\t\tthis.cacheIdx %= this.cacheLimit\n\t\t\t\tthis.cache[this.cacheIdx] = update\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic readonly READONLY_VIEW: SetRTXView<P> = this\n\n\tpublic toJSON(): SetRTXJson<P> {\n\t\treturn {\n\t\t\tmembers: [...this],\n\t\t\tcache: this.cache,\n\t\t\tcacheLimit: this.cacheLimit,\n\t\t\tcacheIdx: this.cacheIdx,\n\t\t\tcacheUpdateNumber: this.cacheUpdateNumber,\n\t\t}\n\t}\n\n\tpublic static fromJSON<P extends primitive>(json: SetRTXJson<P>): SetRTX<P> {\n\t\tconst set = new SetRTX<P>(json.members, json.cacheLimit)\n\t\tset.cache = json.cache\n\t\tset.cacheIdx = json.cacheIdx\n\t\tset.cacheUpdateNumber = json.cacheUpdateNumber\n\t\treturn set\n\t}\n\n\tpublic add(value: P): this {\n\t\tconst result = super.add(value)\n\t\tif (this.mode === `record`) {\n\t\t\tthis.cacheUpdateNumber++\n\t\t\tthis.emit(`add:${stringifyJson<P>(value)}`)\n\t\t}\n\t\treturn result\n\t}\n\n\tpublic clear(): void {\n\t\tconst capturedContents = this.mode === `record` ? [...this] : null\n\t\tsuper.clear()\n\t\tif (capturedContents) {\n\t\t\tthis.cacheUpdateNumber++\n\t\t\tthis.emit(`clear:${JSON.stringify(capturedContents)}`)\n\t\t}\n\t}\n\n\tpublic delete(value: P): boolean {\n\t\tconst result = super.delete(value)\n\t\tif (this.mode === `record`) {\n\t\t\tthis.cacheUpdateNumber++\n\t\t\tthis.emit(`del:${stringifyJson<P>(value)}`)\n\t\t}\n\t\treturn result\n\t}\n\n\tpublic readonly parent: SetRTX<P> | null = null\n\tpublic child: SetRTX<P> | null = null\n\tpublic transactionUpdates: SetUpdateString[] | null = null\n\tpublic transaction(run: (child: SetRTX<P>) => boolean): void {\n\t\tthis.mode = `transaction`\n\t\tthis.transactionUpdates = []\n\t\tthis.child = new SetRTX(this)\n\t\tconst unsubscribe = this.child._subscribe(`transaction`, (update) => {\n\t\t\tthis.transactionUpdates?.push(update)\n\t\t})\n\t\ttry {\n\t\t\tconst shouldCommit = run(this.child)\n\t\t\tif (shouldCommit) {\n\t\t\t\tfor (const update of this.transactionUpdates) {\n\t\t\t\t\tthis.doStep(update)\n\t\t\t\t}\n\t\t\t\tthis.cacheUpdateNumber++\n\t\t\t\tthis.emit(`tx:${this.transactionUpdates.join(`;`)}`)\n\t\t\t}\n\t\t} catch (thrown) {\n\t\t\t/* eslint-disable-next-line no-console */\n\t\t\tconsole.warn(\n\t\t\t\t`Did not apply transaction to SetRTX; this error was thrown:`,\n\t\t\t\tthrown,\n\t\t\t)\n\t\t\tthrow thrown\n\t\t} finally {\n\t\t\tunsubscribe()\n\t\t\tthis.child = null\n\t\t\tthis.transactionUpdates = null\n\t\t\tthis.mode = `record`\n\t\t}\n\t}\n\n\tprotected _subscribe(\n\t\tkey: string,\n\t\tfn: (update: SetUpdateString) => void,\n\t): () => void {\n\t\treturn this.subject.subscribe(key, fn)\n\t}\n\tpublic subscribe(\n\t\tkey: string,\n\t\tfn: (update: NumberedSetUpdateString) => void,\n\t): () => void {\n\t\treturn this.subject.subscribe(key, (update) => {\n\t\t\tfn(`${this.cacheUpdateNumber}=${update}`)\n\t\t})\n\t}\n\n\tpublic emit(update: SetUpdateString): void {\n\t\tthis.subject.next(update)\n\t}\n\n\tprivate doStep(update: SetUpdateString): void {\n\t\tconst typeValueBreak = update.indexOf(`:`)\n\t\tconst type = update.substring(0, typeValueBreak) as SetUpdateType\n\t\tconst value = update.substring(typeValueBreak + 1)\n\t\tswitch (type) {\n\t\t\tcase `add`:\n\t\t\t\tthis.add(JSON.parse(value))\n\t\t\t\tbreak\n\t\t\tcase `clear`:\n\t\t\t\tthis.clear()\n\t\t\t\tbreak\n\t\t\tcase `del`:\n\t\t\t\tthis.delete(JSON.parse(value))\n\t\t\t\tbreak\n\t\t\tcase `tx`:\n\t\t\t\tfor (const subUpdate of value.split(`;`)) {\n\t\t\t\t\tthis.doStep(subUpdate as SetUpdateString)\n\t\t\t\t}\n\t\t}\n\t}\n\n\tpublic getUpdateNumber(update: NumberedSetUpdateString): number {\n\t\tconst breakpoint = update.indexOf(`=`)\n\t\treturn Number(update.substring(0, breakpoint))\n\t}\n\n\tpublic do(update: NumberedSetUpdateString): number | `OUT_OF_RANGE` | null {\n\t\tconst breakpoint = update.indexOf(`=`)\n\t\tconst updateNumber = Number(update.substring(0, breakpoint))\n\t\tconst eventOffset = updateNumber - this.cacheUpdateNumber\n\t\tconst isFuture = eventOffset > 0\n\t\tif (isFuture || Number.isNaN(eventOffset)) {\n\t\t\tif (eventOffset === 1 || Number.isNaN(eventOffset)) {\n\t\t\t\tthis.mode = `playback`\n\t\t\t\tconst innerUpdate = update.substring(breakpoint + 1) as SetUpdateString\n\t\t\t\tthis.doStep(innerUpdate)\n\t\t\t\tthis.mode = `record`\n\t\t\t\tthis.cacheUpdateNumber = updateNumber\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.cacheUpdateNumber + 1\n\t\t}\n\t\tif (Math.abs(eventOffset) < this.cacheLimit) {\n\t\t\tconst eventIdx = this.cacheIdx + eventOffset\n\t\t\tconst cachedUpdate = this.cache[eventIdx]\n\t\t\tif (cachedUpdate === update) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tthis.mode = `playback`\n\t\t\tlet done = false\n\t\t\twhile (!done) {\n\t\t\t\tthis.cacheIdx %= this.cacheLimit\n\t\t\t\tconst u = this.cache[this.cacheIdx]\n\t\t\t\tthis.cacheIdx--\n\t\t\t\tif (!u) {\n\t\t\t\t\treturn `OUT_OF_RANGE`\n\t\t\t\t}\n\t\t\t\tthis.undo(u)\n\t\t\t\tdone = this.cacheIdx === eventIdx - 1\n\t\t\t}\n\t\t\tconst innerUpdate = update.substring(breakpoint + 1) as SetUpdateString\n\t\t\tthis.doStep(innerUpdate)\n\t\t\tthis.mode = `record`\n\t\t\tthis.cacheUpdateNumber = updateNumber\n\t\t\treturn null\n\t\t}\n\t\treturn `OUT_OF_RANGE`\n\t}\n\n\tpublic undoStep(update: SetUpdateString): void {\n\t\tconst breakpoint = update.indexOf(`:`)\n\t\tconst type = update.substring(0, breakpoint) as SetUpdateType\n\t\tconst value = update.substring(breakpoint + 1)\n\t\tswitch (type) {\n\t\t\tcase `add`:\n\t\t\t\tthis.delete(JSON.parse(value))\n\t\t\t\tbreak\n\t\t\tcase `del`:\n\t\t\t\tthis.add(JSON.parse(value))\n\t\t\t\tbreak\n\t\t\tcase `clear`: {\n\t\t\t\tconst values = JSON.parse(value) as P[]\n\t\t\t\tfor (const v of values) this.add(v)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase `tx`: {\n\t\t\t\tconst updates = value.split(`;`) as SetUpdateString[]\n\t\t\t\tfor (let i = updates.length - 1; i >= 0; i--) {\n\t\t\t\t\tthis.undoStep(updates[i])\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic undo(update: NumberedSetUpdateString): number | null {\n\t\tconst breakpoint = update.indexOf(`=`)\n\t\tconst updateNumber = Number(update.substring(0, breakpoint))\n\t\tif (updateNumber === this.cacheUpdateNumber) {\n\t\t\tthis.mode = `playback`\n\t\t\tconst innerUpdate = update.substring(breakpoint + 1) as SetUpdateString\n\t\t\tthis.undoStep(innerUpdate)\n\t\t\tthis.mode = `record`\n\t\t\tthis.cacheUpdateNumber--\n\t\t\treturn null\n\t\t}\n\t\treturn this.cacheUpdateNumber\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/transceivers/set-rtx/set-rtx.ts"],"sourcesContent":["import type { Lineage, Transceiver, TransceiverMode } from \"atom.io/internal\"\nimport { Subject } from \"atom.io/internal\"\nimport type { Json, primitive } from \"atom.io/json\"\nimport { stringifyJson } from \"atom.io/json\"\n\nexport type SetUpdateType = `add` | `clear` | `del` | `tx`\nexport type SetUpdateString = `${SetUpdateType}:${string}`\nexport type NumberedSetUpdateString = `${number | `*`}=${SetUpdateString}`\n\nexport interface SetRTXView<P extends primitive> extends ReadonlySet<P> {\n\treadonly cache: ReadonlyArray<NumberedSetUpdateString | null>\n\treadonly cacheLimit: number\n\treadonly cacheIdx: number\n\treadonly cacheUpdateNumber: number\n\treadonly subscribe: (\n\t\tkey: string,\n\t\tfn: (update: NumberedSetUpdateString) => void,\n\t) => () => void\n}\n\nexport interface SetRTXJson<P extends primitive> extends Json.Object {\n\tmembers: P[]\n\tcache: (NumberedSetUpdateString | null)[]\n\tcacheLimit: number\n\tcacheIdx: number\n\tcacheUpdateNumber: number\n}\nexport class SetRTX<P extends primitive>\n\textends Set<P>\n\timplements\n\t\tTransceiver<SetRTXView<P>, NumberedSetUpdateString, SetRTXJson<P>>,\n\t\tLineage\n{\n\tpublic mode: TransceiverMode = `record`\n\tpublic readonly subject: Subject<SetUpdateString> =\n\t\tnew Subject<SetUpdateString>()\n\tpublic cacheLimit = 0\n\tpublic cache: (NumberedSetUpdateString | null)[] = []\n\tpublic cacheIdx = -1\n\tpublic cacheUpdateNumber = -1\n\n\tpublic constructor(values?: Iterable<P>, cacheLimit = 0) {\n\t\tsuper(values)\n\t\tif (values instanceof SetRTX) {\n\t\t\tthis.parent = values\n\t\t\tthis.cacheUpdateNumber = values.cacheUpdateNumber\n\t\t}\n\t\tif (cacheLimit) {\n\t\t\tthis.cacheLimit = cacheLimit\n\t\t\tthis.cache = new Array(cacheLimit)\n\t\t\tthis.subscribe(`auto cache`, (update) => {\n\t\t\t\tthis.cacheIdx++\n\t\t\t\tthis.cacheIdx %= this.cacheLimit\n\t\t\t\tthis.cache[this.cacheIdx] = update\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic readonly READONLY_VIEW: SetRTXView<P> = this\n\n\tpublic toJSON(): SetRTXJson<P> {\n\t\treturn {\n\t\t\tmembers: [...this],\n\t\t\tcache: this.cache,\n\t\t\tcacheLimit: this.cacheLimit,\n\t\t\tcacheIdx: this.cacheIdx,\n\t\t\tcacheUpdateNumber: this.cacheUpdateNumber,\n\t\t}\n\t}\n\n\tpublic static fromJSON<P extends primitive>(json: SetRTXJson<P>): SetRTX<P> {\n\t\tconst set = new SetRTX<P>(json.members, json.cacheLimit)\n\t\tset.cache = json.cache\n\t\tset.cacheIdx = json.cacheIdx\n\t\tset.cacheUpdateNumber = json.cacheUpdateNumber\n\t\treturn set\n\t}\n\n\tpublic add(value: P): this {\n\t\tconst result = super.add(value)\n\t\tif (this.mode === `record`) {\n\t\t\tthis.cacheUpdateNumber++\n\t\t\tthis.emit(`add:${stringifyJson<P>(value)}`)\n\t\t}\n\t\treturn result\n\t}\n\n\tpublic clear(): void {\n\t\tconst capturedContents = this.mode === `record` ? [...this] : null\n\t\tsuper.clear()\n\t\tif (capturedContents) {\n\t\t\tthis.cacheUpdateNumber++\n\t\t\tthis.emit(`clear:${JSON.stringify(capturedContents)}`)\n\t\t}\n\t}\n\n\tpublic delete(value: P): boolean {\n\t\tconst result = super.delete(value)\n\t\tif (this.mode === `record`) {\n\t\t\tthis.cacheUpdateNumber++\n\t\t\tthis.emit(`del:${stringifyJson<P>(value)}`)\n\t\t}\n\t\treturn result\n\t}\n\n\tpublic readonly parent: SetRTX<P> | null = null\n\tpublic child: SetRTX<P> | null = null\n\tpublic transactionUpdates: SetUpdateString[] | null = null\n\tpublic transaction(run: (child: SetRTX<P>) => boolean): void {\n\t\tthis.mode = `transaction`\n\t\tthis.transactionUpdates = []\n\t\tthis.child = new SetRTX(this)\n\t\tconst unsubscribe = this.child._subscribe(`transaction`, (update) => {\n\t\t\tthis.transactionUpdates?.push(update)\n\t\t})\n\t\ttry {\n\t\t\tconst shouldCommit = run(this.child)\n\t\t\tif (shouldCommit) {\n\t\t\t\tfor (const update of this.transactionUpdates) {\n\t\t\t\t\tthis.doStep(update)\n\t\t\t\t}\n\t\t\t\tthis.cacheUpdateNumber++\n\t\t\t\tthis.emit(`tx:${this.transactionUpdates.join(`;`)}`)\n\t\t\t}\n\t\t} catch (thrown) {\n\t\t\t/* eslint-disable-next-line no-console */\n\t\t\tconsole.warn(\n\t\t\t\t`Did not apply transaction to SetRTX; this error was thrown:`,\n\t\t\t\tthrown,\n\t\t\t)\n\t\t\tthrow thrown\n\t\t} finally {\n\t\t\tunsubscribe()\n\t\t\tthis.child = null\n\t\t\tthis.transactionUpdates = null\n\t\t\tthis.mode = `record`\n\t\t}\n\t}\n\n\tprotected _subscribe(\n\t\tkey: string,\n\t\tfn: (update: SetUpdateString) => void,\n\t): () => void {\n\t\treturn this.subject.subscribe(key, fn)\n\t}\n\tpublic subscribe(\n\t\tkey: string,\n\t\tfn: (update: NumberedSetUpdateString) => void,\n\t): () => void {\n\t\treturn this.subject.subscribe(key, (update) => {\n\t\t\tfn(`${this.cacheUpdateNumber}=${update}`)\n\t\t})\n\t}\n\n\tpublic emit(update: SetUpdateString): void {\n\t\tthis.subject.next(update)\n\t}\n\n\tprivate doStep(update: SetUpdateString): void {\n\t\tconst typeValueBreak = update.indexOf(`:`)\n\t\tconst type = update.substring(0, typeValueBreak) as SetUpdateType\n\t\tconst value = update.substring(typeValueBreak + 1)\n\t\tswitch (type) {\n\t\t\tcase `add`:\n\t\t\t\tthis.add(JSON.parse(value))\n\t\t\t\tbreak\n\t\t\tcase `clear`:\n\t\t\t\tthis.clear()\n\t\t\t\tbreak\n\t\t\tcase `del`:\n\t\t\t\tthis.delete(JSON.parse(value))\n\t\t\t\tbreak\n\t\t\tcase `tx`:\n\t\t\t\tfor (const subUpdate of value.split(`;`)) {\n\t\t\t\t\tthis.doStep(subUpdate as SetUpdateString)\n\t\t\t\t}\n\t\t}\n\t}\n\n\tpublic getUpdateNumber(update: NumberedSetUpdateString): number {\n\t\tconst breakpoint = update.indexOf(`=`)\n\t\treturn Number(update.substring(0, breakpoint))\n\t}\n\n\tpublic do(update: NumberedSetUpdateString): number | `OUT_OF_RANGE` | null {\n\t\tconst breakpoint = update.indexOf(`=`)\n\t\tconst updateNumber = Number(update.substring(0, breakpoint))\n\t\tconst eventOffset = updateNumber - this.cacheUpdateNumber\n\t\tconst isFuture = eventOffset > 0\n\t\tif (isFuture || Number.isNaN(eventOffset)) {\n\t\t\tif (eventOffset === 1 || Number.isNaN(eventOffset)) {\n\t\t\t\tthis.mode = `playback`\n\t\t\t\tconst innerUpdate = update.substring(breakpoint + 1) as SetUpdateString\n\t\t\t\tthis.doStep(innerUpdate)\n\t\t\t\tthis.mode = `record`\n\t\t\t\tthis.cacheUpdateNumber = updateNumber\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.cacheUpdateNumber + 1\n\t\t}\n\t\tif (Math.abs(eventOffset) < this.cacheLimit) {\n\t\t\tconst eventIdx = this.cacheIdx + eventOffset\n\t\t\tconst cachedUpdate = this.cache[eventIdx]\n\t\t\tif (cachedUpdate === update) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tthis.mode = `playback`\n\t\t\tlet done = false\n\t\t\twhile (!done) {\n\t\t\t\tthis.cacheIdx %= this.cacheLimit\n\t\t\t\tconst u = this.cache[this.cacheIdx]\n\t\t\t\tthis.cacheIdx--\n\t\t\t\tif (!u) {\n\t\t\t\t\treturn `OUT_OF_RANGE`\n\t\t\t\t}\n\t\t\t\tthis.undo(u)\n\t\t\t\tdone = this.cacheIdx === eventIdx - 1\n\t\t\t}\n\t\t\tconst innerUpdate = update.substring(breakpoint + 1) as SetUpdateString\n\t\t\tthis.doStep(innerUpdate)\n\t\t\tthis.mode = `record`\n\t\t\tthis.cacheUpdateNumber = updateNumber\n\t\t\treturn null\n\t\t}\n\t\treturn `OUT_OF_RANGE`\n\t}\n\n\tpublic undoStep(update: SetUpdateString): void {\n\t\tconst breakpoint = update.indexOf(`:`)\n\t\tconst type = update.substring(0, breakpoint) as SetUpdateType\n\t\tconst value = update.substring(breakpoint + 1)\n\t\tswitch (type) {\n\t\t\tcase `add`:\n\t\t\t\tthis.delete(JSON.parse(value))\n\t\t\t\tbreak\n\t\t\tcase `del`:\n\t\t\t\tthis.add(JSON.parse(value))\n\t\t\t\tbreak\n\t\t\tcase `clear`: {\n\t\t\t\tconst values = JSON.parse(value) as P[]\n\t\t\t\tfor (const v of values) this.add(v)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase `tx`: {\n\t\t\t\tconst updates = value.split(`;`) as SetUpdateString[]\n\t\t\t\tfor (let i = updates.length - 1; i >= 0; i--) {\n\t\t\t\t\tthis.undoStep(updates[i])\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic undo(update: NumberedSetUpdateString): number | null {\n\t\tconst breakpoint = update.indexOf(`=`)\n\t\tconst updateNumber = Number(update.substring(0, breakpoint))\n\t\tif (updateNumber === this.cacheUpdateNumber) {\n\t\t\tthis.mode = `playback`\n\t\t\tconst innerUpdate = update.substring(breakpoint + 1) as SetUpdateString\n\t\t\tthis.undoStep(innerUpdate)\n\t\t\tthis.mode = `record`\n\t\t\tthis.cacheUpdateNumber--\n\t\t\treturn null\n\t\t}\n\t\treturn this.cacheUpdateNumber\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fn, Subject, Transceiver, TransceiverMode } from "atom.io/internal";
|
|
2
2
|
import { primitive } from "atom.io/json";
|
|
3
|
+
import { Enumeration } from "atom.io/struct";
|
|
3
4
|
|
|
4
5
|
//#region src/transceivers/u-list/u-list.d.ts
|
|
5
6
|
type SetMutations = Exclude<keyof Set<any>, symbol | keyof ReadonlySet<any>>;
|
|
@@ -15,14 +16,15 @@ type PackedSetUpdate<P extends primitive> = string & {
|
|
|
15
16
|
update?: SetUpdate<P>;
|
|
16
17
|
};
|
|
17
18
|
declare const SET_UPDATE_ENUM: Enumeration<[`add`, `delete`, `clear`]>;
|
|
18
|
-
declare function packSetUpdate<P extends primitive>(update: SetUpdate<P>): PackedSetUpdate<P>;
|
|
19
|
-
declare function unpackSetUpdate<P extends primitive>(packed: PackedSetUpdate<P>): SetUpdate<P>;
|
|
20
19
|
type SetMutationHandler = { [K in UListUpdateType]: Fn };
|
|
21
|
-
|
|
20
|
+
type UListView<P extends primitive> = ReadonlySet<P> & {
|
|
21
|
+
subscribe: (key: string, fn: (update: PackedSetUpdate<P>) => void) => () => void;
|
|
22
|
+
};
|
|
23
|
+
declare class UList<P extends primitive> extends Set<P> implements Transceiver<UListView<P>, PackedSetUpdate<P>, ReadonlyArray<P>>, SetMutationHandler {
|
|
22
24
|
mode: TransceiverMode;
|
|
23
25
|
readonly subject: Subject<PackedSetUpdate<P>>;
|
|
24
26
|
constructor(values?: Iterable<P>);
|
|
25
|
-
readonly READONLY_VIEW:
|
|
27
|
+
readonly READONLY_VIEW: UListView<P>;
|
|
26
28
|
toJSON(): ReadonlyArray<P>;
|
|
27
29
|
static fromJSON<P extends primitive>(json: ReadonlyArray<P>): UList<P>;
|
|
28
30
|
add(value: P): this;
|
|
@@ -32,7 +34,9 @@ declare class UList<P extends primitive> extends Set<P> implements Transceiver<R
|
|
|
32
34
|
emit(update: SetUpdate<P>): void;
|
|
33
35
|
do(packed: PackedSetUpdate<P>): null;
|
|
34
36
|
undo(packed: PackedSetUpdate<P>): number | null;
|
|
37
|
+
static packUpdate<P extends primitive>(update: SetUpdate<P>): PackedSetUpdate<P>;
|
|
38
|
+
static unpackUpdate<P extends primitive>(packed: PackedSetUpdate<P>): SetUpdate<P>;
|
|
35
39
|
}
|
|
36
40
|
//#endregion
|
|
37
|
-
export { PackedSetUpdate, SET_UPDATE_ENUM, SetMutationHandler, SetMutations, SetUpdate, UList, UListUpdateType,
|
|
41
|
+
export { PackedSetUpdate, SET_UPDATE_ENUM, SetMutationHandler, SetMutations, SetUpdate, UList, UListUpdateType, UListView };
|
|
38
42
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":["SET_UPDATE_ENUM: Enumeration<[`add`, `delete`, `clear`]>"],"sources":["../../../src/transceivers/u-list/u-list.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["SET_UPDATE_ENUM: Enumeration<[`add`, `delete`, `clear`]>"],"sources":["../../../src/transceivers/u-list/u-list.ts"],"sourcesContent":[],"mappings":";;;;;KAMY,YAAA,GAAe,cACpB,yBACS;AAFJ,KAIA,SAJA,CAAA,UAIoB,SAJpB,CAAA,GAAA;EAAA,IAAA,EAAA,KAAA,GAAA,QAAA;SAOF,CANH;;QADoB,OAAA;EAAA,MAAA,EAWhB,CAXgB,EAAA;AAI3B,CAAA;AAAY,KASA,eAAA,GAAkB,SATlB,CAAA,GAAA,CAAA,CAAA,MAAA,CAAA;AAAoB,KAcpB,eAdoB,CAAA,UAcM,SAdN,CAAA,GAAA,MAAA,GAAA;QAGtB,CAAA,EAYA,SAZA,CAYU,CAZV,CAAA;;AAIC,cAWEA,eAXF,EAWmB,WAXnB,CAAA,CAAA,KAAA,EAAA,QAAA,EAAA,OAAA,CAAA,CAAA;AAEC,KAYA,kBAAA,GAZkB,QAYW,eAZX,GAY6B,EAZ7B,EAAA;AAKlB,KASA,SATA,CAAA,UASoB,SATpB,CAAA,GASiC,WATjC,CAS6C,CAT7C,CAAA,GAAA;EAAA,SAAA,EAAA,CAAA,GAAA,EAAA,MAAA,EAAA,EAAA,EAAA,CAAA,MAAA,EAYG,eAZH,CAYmB,CAZnB,CAAA,EAAA,GAAA,IAAA,EAAA,GAAA,GAAA,GAAA,IAAA;;AACQ,cAeP,KAfO,CAAA,UAeS,SAfT,CAAA,SAgBX,GAhBW,CAgBP,CAhBO,CAAA,YAkBlB,WAlBkB,CAkBN,SAlBM,CAkBI,CAlBJ,CAAA,EAkBQ,eAlBR,CAkBwB,CAlBxB,CAAA,EAkB4B,aAlB5B,CAkB0C,CAlB1C,CAAA,CAAA,EAmBlB,kBAnBkB,CAAA;QAqBN,eArBJ;EAAA,SAAA,OAAA,EAsBgB,OAtBhB,CAsBwB,eAtBxB,CAsBwC,CAtBxC,CAAA,CAAA;EAGV,WAAaA,CAAAA,MAAiB,CAAjBA,EAqBgB,QArB+B,CAqBtB,CArBsB,CAA9B;EAG9B,SAAY,aAAA,EAwBoB,SAxBpB,CAwB8B,CAxB9B,CAAA;EAAA,MAAA,CAAA,CAAA,EA0BM,aA1BN,CA0BoB,CA1BpB,CAAA;SAA6B,QAAA,CAAA,UA8BP,SA9BO,CAAA,CAAA,IAAA,EA8BU,aA9BV,CA8BwB,CA9BxB,CAAA,CAAA,EA8B6B,KA9B7B,CA8BmC,CA9BnC,CAAA;WAAkB,EAkCxC,CAlCwC,CAAA,EAAA,IAAA;EAAA,KAAA,CAAA,CAAA,EAAA,IAAA;EAE3D,MAAY,CAAA,KAAA,EAgDU,CAhDV,CAAA,EAAA,OAAA;EAAA,SAAA,CAAA,GAAA,EAAA,MAAA,EAAA,EAAA,EAAA,CAAA,MAAA,EA0DG,eA1DH,CA0DmB,CA1DnB,CAAA,EAAA,GAAA,IAAA,CAAA,EAAA,GAAA,GAAA,IAAA;aAAoB,EA+DX,SA/DW,CA+DD,CA/DC,CAAA,CAAA,EAAA,IAAA;WAAyB,EAmEtC,eAnEsC,CAmEtB,CAnEsB,CAAA,CAAA,EAAA,IAAA;aAAZ,EAoFxB,eApFwB,CAoFR,CApFQ,CAAA,CAAA,EAAA,MAAA,GAAA,IAAA;SAGd,UAAA,CAAA,UAoGK,SApGL,CAAA,CAAA,MAAA,EAqGrB,SArGqB,CAqGX,CArGW,CAAA,CAAA,EAsG3B,eAtG2B,CAsGX,CAtGW,CAAA;SAAhB,YAAA,CAAA,UA6GuB,SA7GvB,CAAA,CAAA,MAAA,EA8GL,eA9GK,CA8GW,CA9GX,CAAA,CAAA,EA+GX,SA/GW,CA+GD,CA/GC,CAAA"}
|