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.
Files changed (52) hide show
  1. package/dist/internal/index.d.ts +21 -38
  2. package/dist/internal/index.d.ts.map +1 -1
  3. package/dist/internal/index.js +82 -263
  4. package/dist/internal/index.js.map +1 -1
  5. package/dist/main/index.d.ts +18 -36
  6. package/dist/main/index.d.ts.map +1 -1
  7. package/dist/main/index.js +13 -2
  8. package/dist/main/index.js.map +1 -1
  9. package/dist/realtime/index.d.ts +2 -3
  10. package/dist/realtime/index.d.ts.map +1 -1
  11. package/dist/realtime/index.js +1 -1
  12. package/dist/realtime/index.js.map +1 -1
  13. package/dist/realtime-server/index.js +1 -1
  14. package/dist/realtime-server/index.js.map +1 -1
  15. package/dist/realtime-testing/index.js +1 -1
  16. package/dist/struct/index.d.ts +14 -0
  17. package/dist/struct/index.d.ts.map +1 -0
  18. package/dist/struct/index.js +35 -0
  19. package/dist/struct/index.js.map +1 -0
  20. package/dist/transceivers/o-list/index.d.ts +10 -6
  21. package/dist/transceivers/o-list/index.d.ts.map +1 -1
  22. package/dist/transceivers/o-list/index.js +170 -169
  23. package/dist/transceivers/o-list/index.js.map +1 -1
  24. package/dist/transceivers/set-rtx/index.d.ts +1 -0
  25. package/dist/transceivers/set-rtx/index.d.ts.map +1 -1
  26. package/dist/transceivers/set-rtx/index.js.map +1 -1
  27. package/dist/transceivers/u-list/index.d.ts +10 -6
  28. package/dist/transceivers/u-list/index.d.ts.map +1 -1
  29. package/dist/transceivers/u-list/index.js +23 -22
  30. package/dist/transceivers/u-list/index.js.map +1 -1
  31. package/dist/utility-types-aZkJVERa.d.ts +10 -0
  32. package/dist/utility-types-aZkJVERa.d.ts.map +1 -0
  33. package/package.json +13 -9
  34. package/src/internal/index.ts +0 -1
  35. package/src/internal/join/create-join.ts +8 -11
  36. package/src/internal/join/edit-relations-in-store.ts +6 -8
  37. package/src/internal/join/find-relations-in-store.ts +11 -67
  38. package/src/internal/join/get-internal-relations-from-store.ts +11 -5
  39. package/src/internal/join/get-join.ts +7 -9
  40. package/src/internal/join/join-internal.ts +154 -394
  41. package/src/internal/mutable/transceiver.ts +1 -5
  42. package/src/internal/set-state/dispatch-state-update.ts +1 -1
  43. package/src/internal/store/store.ts +1 -1
  44. package/src/main/join.ts +68 -151
  45. package/src/main/realm.ts +4 -4
  46. package/src/realtime/shared-room-store.ts +5 -15
  47. package/src/realtime-server/realtime-server-stores/server-room-external-store.ts +1 -1
  48. package/src/struct/index.ts +1 -0
  49. package/src/{internal → struct}/micro.ts +1 -1
  50. package/src/transceivers/o-list/o-list.ts +175 -171
  51. package/src/transceivers/set-rtx/set-rtx.ts +4 -0
  52. package/src/transceivers/u-list/u-list.ts +37 -33
@@ -1,4 +1,5 @@
1
- import { Subject, enumeration, packValue, unpackValue } from "atom.io/internal";
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(packArrayUpdate(update));
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 = unpackArrayUpdate(update);
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 = unpackArrayUpdate(update);
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, packArrayUpdate, unpackArrayUpdate };
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;;AACpD,UAMA,UANA,CAAA,UAMqB,SANrB,CAAA,SAMwC,IAAA,CAAK,MAN7C,CAAA;SADwC,EAQ/C,CAR+C,EAAA;EAAA,KAAA,EAAA,CAShD,uBATgD,GAAA,IAAA,CAAA,EAAA;EAOzD,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
+ {"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 { Enumeration, Fn, Subject, Transceiver, TransceiverMode } from "atom.io/internal";
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
- declare class UList<P extends primitive> extends Set<P> implements Transceiver<ReadonlySet<P>, PackedSetUpdate<P>, ReadonlyArray<P>>, SetMutationHandler {
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: ReadonlySet<P>;
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, packSetUpdate, unpackSetUpdate };
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":";;;;KASY,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,iBAYI,aAZc,CAAA,UAYU,SAZV,CAAA,CAAA,MAAA,EAarB,SAbqB,CAaX,CAbW,CAAA,CAAA,EAc3B,eAd2B,CAcX,CAdW,CAAA;AAKlB,iBAgBI,eAhBJ,CAAA,UAgB8B,SAhB9B,CAAA,CAAA,MAAA,EAiBH,eAjBG,CAiBa,CAjBb,CAAA,CAAA,EAkBT,SAlBS,CAkBC,CAlBD,CAAA;AAAA,KA4BA,kBAAA,GA5BA,QA4B6B,eA5B7B,GA4B+C,EA5B/C,EAAA;AAA0B,cA8BzB,KA9ByB,CAAA,UA8BT,SA9BS,CAAA,SA+B7B,GA/B6B,CA+BzB,CA/ByB,CAAA,YAiCpC,WAjCoC,CAiCxB,WAjCwB,CAiCZ,CAjCY,CAAA,EAiCR,eAjCQ,CAiCQ,CAjCR,CAAA,EAiCY,aAjCZ,CAiC0B,CAjC1B,CAAA,CAAA,EAkCpC,kBAlCoC,CAAA;QAoCxB,eAnCM;WAAV,OAAA,EAoCgB,OApChB,CAoCwB,eApCxB,CAoCwC,CApCxC,CAAA,CAAA;EAAA,WAAA,CAAA,MAAA,CAAA,EAsCmB,QAtCnB,CAsC4B,CAtC5B,CAAA;EAGV,SAAaA,aAA+C,EAyC5B,WAzCF,CAyCc,CAzCd,CAAA;EAG9B,MAAgB,CAAA,CAAA,EAwCE,aAxCF,CAwCgB,CAxChB,CAAA;EAAA,OAAA,QAAA,CAAA,UA4CkB,SA5ClB,CAAA,CAAA,IAAA,EA4CmC,aA5CnC,CA4CiD,CA5CjD,CAAA,CAAA,EA4CsD,KA5CtD,CA4C4D,CA5C5D,CAAA;WAAwB,EAgDrB,CAhDqB,CAAA,EAAA,IAAA;SACrB,EAAA,IAAA;QAAV,CAAA,KAAA,EA+Da,CA/Db,CAAA,EAAA,OAAA;WACU,CAAA,GAAA,EAAA,MAAA,EAAA,EAAA,EAAA,CAAA,MAAA,EAwEJ,eAxEI,CAwEY,CAxEZ,CAAA,EAAA,GAAA,IAAA,CAAA,EAAA,GAAA,GAAA,IAAA;aAAhB,EA6EkB,SA7ElB,CA6E4B,CA7E5B,CAAA,CAAA,EAAA,IAAA;EAAA,EAAA,CAAA,MAAA,EAiFgB,eAjFhB,CAiFgC,CAjFhC,CAAA,CAAA,EAAA,IAAA;EAOH,IAAgB,CAAA,MAAA,EA2FK,eA3FL,CA2FqB,CA3FrB,CAAA,CAAA,EAAA,MAAA,GAAA,IAAA"}
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"}