atom.io 0.41.0 → 0.41.1
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/transceivers/o-list/index.d.ts +3 -3
- package/dist/transceivers/o-list/index.d.ts.map +1 -1
- package/dist/transceivers/o-list/index.js +168 -168
- package/dist/transceivers/o-list/index.js.map +1 -1
- package/dist/transceivers/u-list/index.d.ts +3 -3
- package/dist/transceivers/u-list/index.d.ts.map +1 -1
- package/dist/transceivers/u-list/index.js +21 -21
- package/dist/transceivers/u-list/index.js.map +1 -1
- package/package.json +2 -2
- package/src/transceivers/o-list/o-list.ts +162 -162
- package/src/transceivers/u-list/u-list.ts +24 -24
|
@@ -54,8 +54,6 @@ type PackedArrayUpdate<P extends primitive> = string & {
|
|
|
54
54
|
};
|
|
55
55
|
declare const ARRAY_UPDATES: readonly ["set", "truncate", "extend", "pop", "push", "shift", "unshift", "copyWithin", "fill", "splice", "reverse", "sort"];
|
|
56
56
|
declare const ARRAY_UPDATE_ENUM: Enumeration<typeof ARRAY_UPDATES>;
|
|
57
|
-
declare function packArrayUpdate<P extends primitive>(update: ArrayUpdate<P>): PackedArrayUpdate<P>;
|
|
58
|
-
declare function unpackArrayUpdate<P extends primitive>(packed: PackedArrayUpdate<P>): ArrayUpdate<P>;
|
|
59
57
|
type ArrayMutationHandler = { [K in Exclude<OListUpdateType, `extend` | `set` | `truncate`>]: Fn };
|
|
60
58
|
declare class OList<P extends primitive> extends Array<P> implements Transceiver<ReadonlyArray<P>, PackedArrayUpdate<P>, ReadonlyArray<P>>, ArrayMutationHandler {
|
|
61
59
|
mode: TransceiverMode;
|
|
@@ -81,7 +79,9 @@ declare class OList<P extends primitive> extends Array<P> implements Transceiver
|
|
|
81
79
|
do(update: PackedArrayUpdate<P>): null;
|
|
82
80
|
undoStep(update: ArrayUpdate<P>): void;
|
|
83
81
|
undo(update: PackedArrayUpdate<P>): number | null;
|
|
82
|
+
static packUpdate<P extends primitive>(update: ArrayUpdate<P>): PackedArrayUpdate<P>;
|
|
83
|
+
static unpackUpdate<P extends primitive>(packed: PackedArrayUpdate<P>): ArrayUpdate<P>;
|
|
84
84
|
}
|
|
85
85
|
//#endregion
|
|
86
|
-
export { ARRAY_UPDATE_ENUM, ArrayMutationHandler, ArrayMutations, ArrayUpdate, OList, OListUpdateType, PackedArrayUpdate
|
|
86
|
+
export { ARRAY_UPDATE_ENUM, ArrayMutationHandler, ArrayMutations, ArrayUpdate, OList, OListUpdateType, PackedArrayUpdate };
|
|
87
87
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":["ARRAY_UPDATE_ENUM: Enumeration<typeof ARRAY_UPDATES>"],"sources":["../../../src/transceivers/o-list/o-list.ts"],"sourcesContent":[],"mappings":";;;;KASY,cAAA,GAAiB,cAAc,kBAAkB;AAAjD,KACA,WADA,CAAA,UACsB,SADtB,CAAA,GAAA;EAAA,IAAA,EAAA,YAAA;QAA+B,EAAA,MAAA;SAAkB,MAAA;QAAhC,MAAA;EAAA,IAAA,EAAA,SAOX,CAPW,EAAA;AAC7B,CAAA,GAAY;EAAA,IAAA,EAAA,QAAA;QAAsB,MAAA;QAMhB,MAAA;;QAYA,MAAA;SAHR,CAOC;QAIQ,EAAA,MAAA;QAOV,MAAA;QACC,SAhBQ,CAgBR,EAAA;;QAMQ,KAAA,GAAA,OAAA;QAMC,EAxBR,CAwBQ;;QAMA,MAAA,GAAA,SAAA;EAAA,KAAA,EAAA,SA1BA,CA0BA,EAAA;AAEnB,CAAA,GAAY;EAKZ,IAAY,EAAA,SAAA;CAAA,GAAA;QAA4B,KAAA;QA1B/B,CA2Ba;SA1BZ,CA0BA;SACF,MAAA;CAAA,GAAA;MAGF,EAAA,MAAA;EAoBN,IAAaA,EAAAA,SA7CK,CA6CLA,EAAAA;EAAsC,IAAA,EAAA,SA5CjC,CA4CiC,EAAA;;QAAnB,QAAA;EAAA,KAAA,EAAA,MAAA;EAGhC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["ARRAY_UPDATE_ENUM: Enumeration<typeof ARRAY_UPDATES>"],"sources":["../../../src/transceivers/o-list/o-list.ts"],"sourcesContent":[],"mappings":";;;;KASY,cAAA,GAAiB,cAAc,kBAAkB;AAAjD,KACA,WADA,CAAA,UACsB,SADtB,CAAA,GAAA;EAAA,IAAA,EAAA,YAAA;QAA+B,EAAA,MAAA;SAAkB,MAAA;QAAhC,MAAA;EAAA,IAAA,EAAA,SAOX,CAPW,EAAA;AAC7B,CAAA,GAAY;EAAA,IAAA,EAAA,QAAA;QAAsB,MAAA;QAMhB,MAAA;;QAYA,MAAA;SAHR,CAOC;QAIQ,EAAA,MAAA;QAOV,MAAA;QACC,SAhBQ,CAgBR,EAAA;;QAMQ,KAAA,GAAA,OAAA;QAMC,EAxBR,CAwBQ;;QAMA,MAAA,GAAA,SAAA;EAAA,KAAA,EAAA,SA1BA,CA0BA,EAAA;AAEnB,CAAA,GAAY;EAKZ,IAAY,EAAA,SAAA;CAAA,GAAA;QAA4B,KAAA;QA1B/B,CA2Ba;SA1BZ,CA0BA;SACF,MAAA;CAAA,GAAA;MAGF,EAAA,MAAA;EAoBN,IAAaA,EAAAA,SA7CK,CA6CLA,EAAAA;EAAsC,IAAA,EAAA,SA5CjC,CA4CiC,EAAA;;QAAnB,QAAA;EAAA,KAAA,EAAA,MAAA;EAGhC,WAAY,EAAA,MAAA;EAAA,KAAA,EAAA,SAzCO,CAyCP,EAAA;SACG,EAAA,SAzCM,CAyCN,EAAA;;QAAkD,UAAA;EAAA,MAAA,EAAA,MAAA;EAGjE,KAAa,EAAA,SAvCM,CAuCN,EAAA;CAAA;AAAgB,KArCjB,eAAA,GAAkB,WAqCD,CAAA,GAAA,CAAA,CAAA,MAAA,CAAA;AACd,KAjCH,iBAiCG,CAAA,UAjCyB,SAiCzB,CAAA,GAAA,MAAA,GAAA;QAEa,CAAA,EAlClB,WAkCkB,CAlCN,CAkCM,CAAA;SAjCpB,CAiCM;;cA9BR,aA8B0B,EAAA,SAAA,CAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,CAAA;AAAoC,cAVvDA,iBAUuD,EAVpC,WAUoC,CAAA,OAVjB,aAUiB,CAAA;AAAd,KAP1C,oBAAA,GAO0C,QAN/C,OAM+C,CANvC,eAMuC,EAAA,QAAA,GAAA,KAAA,GAAA,UAAA,CAAA,GANW,EAMX,EAAA;AAGxC,cAND,KAMC,CAAA,UANe,SAMf,CAAA,SALL,KAKK,CALC,CAKD,CAAA,YAHZ,WAGY,CAHA,aAGA,CAHc,CAGd,CAAA,EAHkB,iBAGlB,CAHoC,CAGpC,CAAA,EAHwC,aAGxC,CAHsD,CAGtD,CAAA,CAAA,EAFZ,oBAEY,CAAA;QAAA,eACsC;WAAlB,OAAA,EAAR,OAAQ,CAAA,iBAAA,CAAkB,CAAlB,CAAA,CAAA;WAAR,aAAA,EAEM,aAFN,CAEoB,CAFpB,CAAA;aAEoB,CAAA,WAAA,CAAA,EAAA,MAAA;aAAd,CAAA,GAAA,KAAA,EAGF,CAHE,EAAA;QAGF,CAAA,CAAA,EA6CZ,aA7CY,CA6CE,CA7CF,CAAA;SA6CE,QAAA,CAAA,UAIE,SAJF,CAAA,CAAA,IAAA,EAImB,aAJnB,CAIiC,CAJjC,CAAA,CAAA,EAIsC,KAJtC,CAI4C,CAJ5C,CAAA;UAAd,KAAA,EAQK,CARL,EAAA,CAAA,EAAA,MAAA;SAoBH,CAhBmB,GAAA,SAAA;SAA+B,EAgChD,CAhCgD,GAAA,SAAA;SAAd,CAAA,GAAA,KAAA,EAgDzB,CAhDyB,EAAA,CAAA,EAAA,MAAA;SAAyB,CAAA,CAAA,EAAA,IAAA;YAAN,EAqElD,CArEkD,EAAA,KAAA,CAAA,EAAA,MAAA,EAAA,GAAA,CAAA,EAAA,MAAA,CAAA,EAAA,IAAA;gBAI/C,CAAA,EAAA,CAAA,CAAA,EAsFM,CAtFN,EAAA,CAAA,EAsFY,CAtFZ,EAAA,GAAA,MAAA,CAAA,EAAA,IAAA;QAYR,CAAA,KAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EAAA,MAAA,CAAA,EAsFsC,CAtFtC,EAAA;QAgBE,CAAA,KAAA,EAAA,MAAA,EAAA,WAAA,EAAA,MAAA,EAAA,GAAA,KAAA,EAuE4C,CAvE5C,EAAA,CAAA,EAuEkD,CAvElD,EAAA;YAgBS,CAAA,MAAA,EAAA,MAAA,EAAA,KAAA,EAAA,MAAA,EAAA,GAAA,CAAA,EAAA,MAAA,CAAA,EAAA,IAAA;WAqBN,CAAA,GAAA,EAAA,MAAA,EAAA,EAAA,EAAA,CAAA,MAAA,EA+EL,iBA/EK,CA+Ea,CA/Eb,CAAA,EAAA,GAAA,IAAA,CAAA,EAAA,GAAA,GAAA,IAAA;aAqBS,EA+DR,WA/DQ,CA+DI,CA/DJ,CAAA,CAAA,EAAA,IAAA;UAAM,MAAA;WAYkB,EAoGlC,iBApGkC,CAoGhB,CApGgB,CAAA,CAAA,EAAA,IAAA;UACQ,CAAA,MAAA,EA2GpC,WA3GoC,CA2GxB,CA3GwB,CAAA,CAAA,EAAA,IAAA;aAAM,EAqL9C,iBArL8C,CAqL5B,CArL4B,CAAA,CAAA,EAAA,MAAA,GAAA,IAAA;SA6ClC,UAAA,CAAA,UAgJG,SAhJH,CAAA,CAAA,MAAA,EAiJvB,WAjJuB,CAiJX,CAjJW,CAAA,CAAA,EAkJ7B,iBAlJ6B,CAkJX,CAlJW,CAAA;SAAlB,YAAA,CAAA,UAqNuB,SArNvB,CAAA,CAAA,MAAA,EAsNL,iBAtNK,CAsNa,CAtNb,CAAA,CAAA,EAuNX,WAvNW,CAuNC,CAvND,CAAA"}
|
|
@@ -16,170 +16,6 @@ const ARRAY_UPDATES = [
|
|
|
16
16
|
`sort`
|
|
17
17
|
];
|
|
18
18
|
const ARRAY_UPDATE_ENUM = enumeration(ARRAY_UPDATES);
|
|
19
|
-
function packArrayUpdate(update) {
|
|
20
|
-
let packed = ARRAY_UPDATE_ENUM[update.type] + `\u001F`;
|
|
21
|
-
switch (update.type) {
|
|
22
|
-
case `set`:
|
|
23
|
-
packed += update.index + `\u001E` + packValue(update.next);
|
|
24
|
-
if (update.prev !== void 0) packed += `\u001E` + packValue(update.prev);
|
|
25
|
-
return packed;
|
|
26
|
-
case `truncate`: return packed + update.length + `\u001E` + update.items.map(packValue).join(`\u001E`);
|
|
27
|
-
case `extend`: return packed + update.next + `\u001E` + update.prev;
|
|
28
|
-
case `pop`:
|
|
29
|
-
case `shift`:
|
|
30
|
-
if (update.value !== void 0) packed += packValue(update.value);
|
|
31
|
-
return packed;
|
|
32
|
-
case `push`:
|
|
33
|
-
case `unshift`: return packed + update.items.map(packValue).join(`\u001E`);
|
|
34
|
-
case `copyWithin`:
|
|
35
|
-
packed += update.target + `\u001E` + update.start;
|
|
36
|
-
if (update.end !== void 0) packed += `\u001E` + update.end;
|
|
37
|
-
packed += `\u001E\u001E` + update.prev.map(packValue).join(`\u001E`);
|
|
38
|
-
return packed;
|
|
39
|
-
case `fill`:
|
|
40
|
-
packed += packValue(update.value);
|
|
41
|
-
if (update.start !== void 0) packed += `\u001E` + update.start;
|
|
42
|
-
if (update.end !== void 0) packed += `\u001E` + update.end;
|
|
43
|
-
packed += `\u001E\u001E` + update.prev.map(packValue).join(`\u001E`);
|
|
44
|
-
return packed;
|
|
45
|
-
case `splice`: return packed + update.start + `\u001E\u001E` + update.deleteCount + `\u001E\u001E` + update.items.map(packValue).join(`\u001E`) + `\u001E\u001E` + update.deleted.map(packValue).join(`\u001E`);
|
|
46
|
-
case `reverse`: return packed;
|
|
47
|
-
case `sort`: return packed + update.next.map(packValue).join(`\u001E`) + `\u001E\u001E` + update.prev.map(packValue).join(`\u001E`);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
function unpackArrayUpdate(packed) {
|
|
51
|
-
const [head, tail] = packed.split(`\u001F`);
|
|
52
|
-
const type = ARRAY_UPDATE_ENUM[head];
|
|
53
|
-
switch (type) {
|
|
54
|
-
case `set`: {
|
|
55
|
-
const [i, n, p] = tail.split(`\u001E`);
|
|
56
|
-
const index = +i;
|
|
57
|
-
const next = unpackValue(n);
|
|
58
|
-
if (p === void 0) return {
|
|
59
|
-
type,
|
|
60
|
-
index,
|
|
61
|
-
next
|
|
62
|
-
};
|
|
63
|
-
const prev = unpackValue(p);
|
|
64
|
-
return {
|
|
65
|
-
type,
|
|
66
|
-
index,
|
|
67
|
-
next,
|
|
68
|
-
prev
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
case `truncate`: {
|
|
72
|
-
const [l, ...i] = tail.split(`\u001E`);
|
|
73
|
-
const length = +l;
|
|
74
|
-
const items = i.map(unpackValue);
|
|
75
|
-
return {
|
|
76
|
-
type,
|
|
77
|
-
length,
|
|
78
|
-
items
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
case `extend`: {
|
|
82
|
-
const [n, p] = tail.split(`\u001E`);
|
|
83
|
-
const next = +n;
|
|
84
|
-
const prev = +p;
|
|
85
|
-
return {
|
|
86
|
-
type,
|
|
87
|
-
next,
|
|
88
|
-
prev
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
case `pop`:
|
|
92
|
-
case `shift`:
|
|
93
|
-
if (tail !== ``) {
|
|
94
|
-
const value = unpackValue(tail);
|
|
95
|
-
return {
|
|
96
|
-
type,
|
|
97
|
-
value
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
return { type };
|
|
101
|
-
case `push`:
|
|
102
|
-
case `unshift`: {
|
|
103
|
-
const items = tail.split(`\u001E`).map(unpackValue);
|
|
104
|
-
return {
|
|
105
|
-
type,
|
|
106
|
-
items
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
case `copyWithin`: {
|
|
110
|
-
const [numbers, data] = tail.split(`\u001E\u001E`);
|
|
111
|
-
const prev = data ? data.split(`\u001E`).map(unpackValue) : [];
|
|
112
|
-
const [t, s, e] = numbers.split(`\u001E`);
|
|
113
|
-
const target = +t;
|
|
114
|
-
const start = +s;
|
|
115
|
-
if (e === void 0) return {
|
|
116
|
-
type,
|
|
117
|
-
target,
|
|
118
|
-
start,
|
|
119
|
-
prev
|
|
120
|
-
};
|
|
121
|
-
const end = +e;
|
|
122
|
-
return {
|
|
123
|
-
type,
|
|
124
|
-
target,
|
|
125
|
-
start,
|
|
126
|
-
prev,
|
|
127
|
-
end
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
case `fill`: {
|
|
131
|
-
const [numbers, data] = tail.split(`\u001E\u001E`);
|
|
132
|
-
const prev = data ? data.split(`\u001E`).map(unpackValue) : [];
|
|
133
|
-
const [v, s, e] = numbers.split(`\u001E`);
|
|
134
|
-
const value = unpackValue(v);
|
|
135
|
-
if (s === void 0 && e === void 0) return {
|
|
136
|
-
type,
|
|
137
|
-
value,
|
|
138
|
-
prev
|
|
139
|
-
};
|
|
140
|
-
const start = +s;
|
|
141
|
-
if (e === void 0) return {
|
|
142
|
-
type,
|
|
143
|
-
value,
|
|
144
|
-
prev,
|
|
145
|
-
start
|
|
146
|
-
};
|
|
147
|
-
const end = +e;
|
|
148
|
-
return {
|
|
149
|
-
type,
|
|
150
|
-
value,
|
|
151
|
-
prev,
|
|
152
|
-
start,
|
|
153
|
-
end
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
case `splice`: {
|
|
157
|
-
const [s, c, i, d] = tail.split(`\u001E\u001E`);
|
|
158
|
-
const start = +s;
|
|
159
|
-
const deleteCount = +c;
|
|
160
|
-
const items = i ? i.split(`\u001E`).map(unpackValue) : [];
|
|
161
|
-
const deleted = d ? d.split(`\u001E`).map(unpackValue) : [];
|
|
162
|
-
return {
|
|
163
|
-
type,
|
|
164
|
-
start,
|
|
165
|
-
deleteCount,
|
|
166
|
-
items,
|
|
167
|
-
deleted
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
case `reverse`: return { type };
|
|
171
|
-
case `sort`: {
|
|
172
|
-
const [n, p] = tail.split(`\u001E\u001E`);
|
|
173
|
-
const next = n ? n.split(`\u001E`).map(unpackValue) : [];
|
|
174
|
-
const prev = p ? p.split(`\u001E`).map(unpackValue) : [];
|
|
175
|
-
return {
|
|
176
|
-
type,
|
|
177
|
-
next,
|
|
178
|
-
prev
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
19
|
var OList = class OList extends Array {
|
|
184
20
|
mode = `record`;
|
|
185
21
|
subject = new Subject();
|
|
@@ -388,7 +224,7 @@ var OList = class OList extends Array {
|
|
|
388
224
|
return this.subject.subscribe(key, fn);
|
|
389
225
|
}
|
|
390
226
|
emit(update) {
|
|
391
|
-
this.subject.next(
|
|
227
|
+
this.subject.next(OList.packUpdate(update));
|
|
392
228
|
}
|
|
393
229
|
doStep(update) {
|
|
394
230
|
switch (update.type) {
|
|
@@ -433,7 +269,7 @@ var OList = class OList extends Array {
|
|
|
433
269
|
}
|
|
434
270
|
do(update) {
|
|
435
271
|
this.mode = `playback`;
|
|
436
|
-
const unpacked =
|
|
272
|
+
const unpacked = OList.unpackUpdate(update);
|
|
437
273
|
this.doStep(unpacked);
|
|
438
274
|
this.mode = `record`;
|
|
439
275
|
return null;
|
|
@@ -501,13 +337,177 @@ var OList = class OList extends Array {
|
|
|
501
337
|
}
|
|
502
338
|
undo(update) {
|
|
503
339
|
this.mode = `playback`;
|
|
504
|
-
const unpacked =
|
|
340
|
+
const unpacked = OList.unpackUpdate(update);
|
|
505
341
|
this.undoStep(unpacked);
|
|
506
342
|
this.mode = `record`;
|
|
507
343
|
return null;
|
|
508
344
|
}
|
|
345
|
+
static packUpdate(update) {
|
|
346
|
+
let packed = ARRAY_UPDATE_ENUM[update.type] + `\u001F`;
|
|
347
|
+
switch (update.type) {
|
|
348
|
+
case `set`:
|
|
349
|
+
packed += update.index + `\u001E` + packValue(update.next);
|
|
350
|
+
if (update.prev !== void 0) packed += `\u001E` + packValue(update.prev);
|
|
351
|
+
return packed;
|
|
352
|
+
case `truncate`: return packed + update.length + `\u001E` + update.items.map(packValue).join(`\u001E`);
|
|
353
|
+
case `extend`: return packed + update.next + `\u001E` + update.prev;
|
|
354
|
+
case `pop`:
|
|
355
|
+
case `shift`:
|
|
356
|
+
if (update.value !== void 0) packed += packValue(update.value);
|
|
357
|
+
return packed;
|
|
358
|
+
case `push`:
|
|
359
|
+
case `unshift`: return packed + update.items.map(packValue).join(`\u001E`);
|
|
360
|
+
case `copyWithin`:
|
|
361
|
+
packed += update.target + `\u001E` + update.start;
|
|
362
|
+
if (update.end !== void 0) packed += `\u001E` + update.end;
|
|
363
|
+
packed += `\u001E\u001E` + update.prev.map(packValue).join(`\u001E`);
|
|
364
|
+
return packed;
|
|
365
|
+
case `fill`:
|
|
366
|
+
packed += packValue(update.value);
|
|
367
|
+
if (update.start !== void 0) packed += `\u001E` + update.start;
|
|
368
|
+
if (update.end !== void 0) packed += `\u001E` + update.end;
|
|
369
|
+
packed += `\u001E\u001E` + update.prev.map(packValue).join(`\u001E`);
|
|
370
|
+
return packed;
|
|
371
|
+
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`);
|
|
372
|
+
case `reverse`: return packed;
|
|
373
|
+
case `sort`: return packed + update.next.map(packValue).join(`\u001E`) + `\u001E\u001E` + update.prev.map(packValue).join(`\u001E`);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
static unpackUpdate(packed) {
|
|
377
|
+
const [head, tail] = packed.split(`\u001F`);
|
|
378
|
+
const type = ARRAY_UPDATE_ENUM[head];
|
|
379
|
+
switch (type) {
|
|
380
|
+
case `set`: {
|
|
381
|
+
const [i, n, p] = tail.split(`\u001E`);
|
|
382
|
+
const index = +i;
|
|
383
|
+
const next = unpackValue(n);
|
|
384
|
+
if (p === void 0) return {
|
|
385
|
+
type,
|
|
386
|
+
index,
|
|
387
|
+
next
|
|
388
|
+
};
|
|
389
|
+
const prev = unpackValue(p);
|
|
390
|
+
return {
|
|
391
|
+
type,
|
|
392
|
+
index,
|
|
393
|
+
next,
|
|
394
|
+
prev
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
case `truncate`: {
|
|
398
|
+
const [l, ...i] = tail.split(`\u001E`);
|
|
399
|
+
const length = +l;
|
|
400
|
+
const items = i.map(unpackValue);
|
|
401
|
+
return {
|
|
402
|
+
type,
|
|
403
|
+
length,
|
|
404
|
+
items
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
case `extend`: {
|
|
408
|
+
const [n, p] = tail.split(`\u001E`);
|
|
409
|
+
const next = +n;
|
|
410
|
+
const prev = +p;
|
|
411
|
+
return {
|
|
412
|
+
type,
|
|
413
|
+
next,
|
|
414
|
+
prev
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
case `pop`:
|
|
418
|
+
case `shift`:
|
|
419
|
+
if (tail !== ``) {
|
|
420
|
+
const value = unpackValue(tail);
|
|
421
|
+
return {
|
|
422
|
+
type,
|
|
423
|
+
value
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
return { type };
|
|
427
|
+
case `push`:
|
|
428
|
+
case `unshift`: {
|
|
429
|
+
const items = tail.split(`\u001E`).map(unpackValue);
|
|
430
|
+
return {
|
|
431
|
+
type,
|
|
432
|
+
items
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
case `copyWithin`: {
|
|
436
|
+
const [numbers, data] = tail.split(`\u001E\u001E`);
|
|
437
|
+
const prev = data ? data.split(`\u001E`).map(unpackValue) : [];
|
|
438
|
+
const [t, s, e] = numbers.split(`\u001E`);
|
|
439
|
+
const target = +t;
|
|
440
|
+
const start = +s;
|
|
441
|
+
if (e === void 0) return {
|
|
442
|
+
type,
|
|
443
|
+
target,
|
|
444
|
+
start,
|
|
445
|
+
prev
|
|
446
|
+
};
|
|
447
|
+
const end = +e;
|
|
448
|
+
return {
|
|
449
|
+
type,
|
|
450
|
+
target,
|
|
451
|
+
start,
|
|
452
|
+
prev,
|
|
453
|
+
end
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
case `fill`: {
|
|
457
|
+
const [numbers, data] = tail.split(`\u001E\u001E`);
|
|
458
|
+
const prev = data ? data.split(`\u001E`).map(unpackValue) : [];
|
|
459
|
+
const [v, s, e] = numbers.split(`\u001E`);
|
|
460
|
+
const value = unpackValue(v);
|
|
461
|
+
if (s === void 0 && e === void 0) return {
|
|
462
|
+
type,
|
|
463
|
+
value,
|
|
464
|
+
prev
|
|
465
|
+
};
|
|
466
|
+
const start = +s;
|
|
467
|
+
if (e === void 0) return {
|
|
468
|
+
type,
|
|
469
|
+
value,
|
|
470
|
+
prev,
|
|
471
|
+
start
|
|
472
|
+
};
|
|
473
|
+
const end = +e;
|
|
474
|
+
return {
|
|
475
|
+
type,
|
|
476
|
+
value,
|
|
477
|
+
prev,
|
|
478
|
+
start,
|
|
479
|
+
end
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
case `splice`: {
|
|
483
|
+
const [s, c, i, d] = tail.split(`\u001E\u001E`);
|
|
484
|
+
const start = +s;
|
|
485
|
+
const deleteCount = +c;
|
|
486
|
+
const items = i ? i.split(`\u001E`).map(unpackValue) : [];
|
|
487
|
+
const deleted = d ? d.split(`\u001E`).map(unpackValue) : [];
|
|
488
|
+
return {
|
|
489
|
+
type,
|
|
490
|
+
start,
|
|
491
|
+
deleteCount,
|
|
492
|
+
items,
|
|
493
|
+
deleted
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
case `reverse`: return { type };
|
|
497
|
+
case `sort`: {
|
|
498
|
+
const [n, p] = tail.split(`\u001E\u001E`);
|
|
499
|
+
const next = n ? n.split(`\u001E`).map(unpackValue) : [];
|
|
500
|
+
const prev = p ? p.split(`\u001E`).map(unpackValue) : [];
|
|
501
|
+
return {
|
|
502
|
+
type,
|
|
503
|
+
next,
|
|
504
|
+
prev
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
509
|
};
|
|
510
510
|
|
|
511
511
|
//#endregion
|
|
512
|
-
export { ARRAY_UPDATE_ENUM, OList
|
|
512
|
+
export { ARRAY_UPDATE_ENUM, OList };
|
|
513
513
|
//# 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 {\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 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(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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"}
|
|
@@ -15,8 +15,6 @@ type PackedSetUpdate<P extends primitive> = string & {
|
|
|
15
15
|
update?: SetUpdate<P>;
|
|
16
16
|
};
|
|
17
17
|
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
18
|
type SetMutationHandler = { [K in UListUpdateType]: Fn };
|
|
21
19
|
declare class UList<P extends primitive> extends Set<P> implements Transceiver<ReadonlySet<P>, PackedSetUpdate<P>, ReadonlyArray<P>>, SetMutationHandler {
|
|
22
20
|
mode: TransceiverMode;
|
|
@@ -32,7 +30,9 @@ declare class UList<P extends primitive> extends Set<P> implements Transceiver<R
|
|
|
32
30
|
emit(update: SetUpdate<P>): void;
|
|
33
31
|
do(packed: PackedSetUpdate<P>): null;
|
|
34
32
|
undo(packed: PackedSetUpdate<P>): number | null;
|
|
33
|
+
static packUpdate<P extends primitive>(update: SetUpdate<P>): PackedSetUpdate<P>;
|
|
34
|
+
static unpackUpdate<P extends primitive>(packed: PackedSetUpdate<P>): SetUpdate<P>;
|
|
35
35
|
}
|
|
36
36
|
//#endregion
|
|
37
|
-
export { PackedSetUpdate, SET_UPDATE_ENUM, SetMutationHandler, SetMutations, SetUpdate, UList, UListUpdateType
|
|
37
|
+
export { PackedSetUpdate, SET_UPDATE_ENUM, SetMutationHandler, SetMutations, SetUpdate, UList, UListUpdateType };
|
|
38
38
|
//# 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,
|
|
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,KAYA,kBAAA,GAZkB,QAYW,eAZX,GAY6B,EAZ7B,EAAA;AAKlB,cASC,KATD,CAAA,UASiB,SATjB,CAAA,SAUH,GAVG,CAUC,CAVD,CAAA,YAYV,WAZU,CAYE,WAZF,CAYc,CAZd,CAAA,EAYkB,eAZlB,CAYkC,CAZlC,CAAA,EAYsC,aAZtC,CAYoD,CAZpD,CAAA,CAAA,EAaV,kBAbU,CAAA;EAAA,IAAA,EAeE,eAfF;WAA0B,OAAA,EAgBZ,OAhBY,CAgBJ,eAhBI,CAgBY,CAhBZ,CAAA,CAAA;aAClB,CAAA,MAAA,CAAA,EAiBS,QAjBT,CAiBkB,CAjBlB,CAAA;WAAV,aAAA,EAuBsB,WAvBtB,CAuBkC,CAvBlC,CAAA;EAAA,MAAA,CAAA,CAAA,EAyBQ,aAzBR,CAyBsB,CAzBtB,CAAA;EAGV,OAAaA,QAAAA,CAAAA,UA0BqB,SA1BJ,CAAA,CAAA,IAAA,EA0BqB,aA1BrB,CA0BmC,CA1BnC,CAAA,CAAA,EA0BwC,KA1BxC,CA0B8C,CA1B9C,CAAA;EAG9B,GAAY,CAAA,KAAA,EA2BO,CA3BP,CAAA,EAAA,IAAA;EAAA,KAAA,CAAA,CAAA,EAAA,IAAA;QAA6B,CAAA,KAAA,EA2CnB,CA3CmB,CAAA,EAAA,OAAA;WAAkB,CAAA,GAAA,EAAA,MAAA,EAAA,EAAA,EAAA,CAAA,MAAA,EAqD5C,eArD4C,CAqD5B,CArD4B,CAAA,EAAA,GAAA,IAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EAAA,IAAA,CAAA,MAAA,EA0DtC,SA1DsC,CA0D5B,CA1D4B,CAAA,CAAA,EAAA,IAAA;EAE3D,EAAA,CAAa,MAAA,EA4DM,eA5DN,CA4DsB,CA5DtB,CAAA,CAAA,EAAA,IAAA;EAAA,IAAA,CAAA,MAAA,EA6EQ,eA7ER,CA6EwB,CA7ExB,CAAA,CAAA,EAAA,MAAA,GAAA,IAAA;SAAgB,UAAA,CAAA,UAgGO,SAhGP,CAAA,CAAA,MAAA,EAiGnB,SAjGmB,CAiGT,CAjGS,CAAA,CAAA,EAkGzB,eAlGyB,CAkGT,CAlGS,CAAA;SAChB,YAAA,CAAA,UAwGyB,SAxGzB,CAAA,CAAA,MAAA,EAyGH,eAzGG,CAyGa,CAzGb,CAAA,CAAA,EA0GT,SA1GS,CA0GC,CA1GD,CAAA"}
|
|
@@ -6,23 +6,6 @@ const SET_UPDATE_ENUM = enumeration([
|
|
|
6
6
|
`delete`,
|
|
7
7
|
`clear`
|
|
8
8
|
]);
|
|
9
|
-
function packSetUpdate(update) {
|
|
10
|
-
const head = SET_UPDATE_ENUM[update.type] + `\u001F`;
|
|
11
|
-
if (update.type === `clear`) return head + update.values.map(packValue).join(`\u001E`);
|
|
12
|
-
return head + packValue(update.value);
|
|
13
|
-
}
|
|
14
|
-
function unpackSetUpdate(packed) {
|
|
15
|
-
const [type, tail] = packed.split(`\u001F`);
|
|
16
|
-
const head = SET_UPDATE_ENUM[type];
|
|
17
|
-
if (head === `clear`) return {
|
|
18
|
-
type: `clear`,
|
|
19
|
-
values: tail.split(`\u001E`).map(unpackValue)
|
|
20
|
-
};
|
|
21
|
-
return {
|
|
22
|
-
type: head,
|
|
23
|
-
value: unpackValue(tail)
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
9
|
var UList = class UList extends Set {
|
|
27
10
|
mode = `record`;
|
|
28
11
|
subject = new Subject();
|
|
@@ -65,11 +48,11 @@ var UList = class UList extends Set {
|
|
|
65
48
|
return this.subject.subscribe(key, fn);
|
|
66
49
|
}
|
|
67
50
|
emit(update) {
|
|
68
|
-
this.subject.next(
|
|
51
|
+
this.subject.next(UList.packUpdate(update));
|
|
69
52
|
}
|
|
70
53
|
do(packed) {
|
|
71
54
|
this.mode = `playback`;
|
|
72
|
-
const update =
|
|
55
|
+
const update = UList.unpackUpdate(packed);
|
|
73
56
|
switch (update.type) {
|
|
74
57
|
case `add`:
|
|
75
58
|
this.add(update.value);
|
|
@@ -83,7 +66,7 @@ var UList = class UList extends Set {
|
|
|
83
66
|
return null;
|
|
84
67
|
}
|
|
85
68
|
undo(packed) {
|
|
86
|
-
const update =
|
|
69
|
+
const update = UList.unpackUpdate(packed);
|
|
87
70
|
this.mode = `playback`;
|
|
88
71
|
switch (update.type) {
|
|
89
72
|
case `add`:
|
|
@@ -100,8 +83,25 @@ var UList = class UList extends Set {
|
|
|
100
83
|
this.mode = `record`;
|
|
101
84
|
return null;
|
|
102
85
|
}
|
|
86
|
+
static packUpdate(update) {
|
|
87
|
+
const head = SET_UPDATE_ENUM[update.type] + `\u001F`;
|
|
88
|
+
if (update.type === `clear`) return head + update.values.map(packValue).join(`\u001E`);
|
|
89
|
+
return head + packValue(update.value);
|
|
90
|
+
}
|
|
91
|
+
static unpackUpdate(packed) {
|
|
92
|
+
const [type, tail] = packed.split(`\u001F`);
|
|
93
|
+
const head = SET_UPDATE_ENUM[type];
|
|
94
|
+
if (head === `clear`) return {
|
|
95
|
+
type: `clear`,
|
|
96
|
+
values: tail.split(`\u001E`).map(unpackValue)
|
|
97
|
+
};
|
|
98
|
+
return {
|
|
99
|
+
type: head,
|
|
100
|
+
value: unpackValue(tail)
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
103
|
};
|
|
104
104
|
|
|
105
105
|
//#endregion
|
|
106
|
-
export { SET_UPDATE_ENUM, UList
|
|
106
|
+
export { SET_UPDATE_ENUM, UList };
|
|
107
107
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["SET_UPDATE_ENUM: Enumeration<[`add`, `delete`, `clear`]>"],"sources":["../../../src/transceivers/u-list/u-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 SetMutations = Exclude<\n\tkeyof Set<any>,\n\tsymbol | keyof ReadonlySet<any>\n>\nexport type SetUpdate<P extends primitive> =\n\t| {\n\t\t\ttype: `add` | `delete`\n\t\t\tvalue: P\n\t }\n\t| {\n\t\t\ttype: `clear`\n\t\t\tvalues: P[]\n\t }\nexport type UListUpdateType = SetUpdate<any>[`type`]\ntrue satisfies SetMutations extends UListUpdateType\n\t? true\n\t: Exclude<SetMutations, UListUpdateType>\n\nexport type PackedSetUpdate<P extends primitive> = string & {\n\tupdate?: SetUpdate<P>\n}\n\nexport const SET_UPDATE_ENUM: Enumeration<[`add`, `delete`, `clear`]> =\n\tenumeration([`add`, `delete`, `clear`] as const)\n\nexport
|
|
1
|
+
{"version":3,"file":"index.js","names":["SET_UPDATE_ENUM: Enumeration<[`add`, `delete`, `clear`]>"],"sources":["../../../src/transceivers/u-list/u-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 SetMutations = Exclude<\n\tkeyof Set<any>,\n\tsymbol | keyof ReadonlySet<any>\n>\nexport type SetUpdate<P extends primitive> =\n\t| {\n\t\t\ttype: `add` | `delete`\n\t\t\tvalue: P\n\t }\n\t| {\n\t\t\ttype: `clear`\n\t\t\tvalues: P[]\n\t }\nexport type UListUpdateType = SetUpdate<any>[`type`]\ntrue satisfies SetMutations extends UListUpdateType\n\t? true\n\t: Exclude<SetMutations, UListUpdateType>\n\nexport type PackedSetUpdate<P extends primitive> = string & {\n\tupdate?: SetUpdate<P>\n}\n\nexport const SET_UPDATE_ENUM: Enumeration<[`add`, `delete`, `clear`]> =\n\tenumeration([`add`, `delete`, `clear`] as const)\n\nexport type SetMutationHandler = { [K in UListUpdateType]: Fn }\n\nexport class UList<P extends primitive>\n\textends Set<P>\n\timplements\n\t\tTransceiver<ReadonlySet<P>, PackedSetUpdate<P>, ReadonlyArray<P>>,\n\t\tSetMutationHandler\n{\n\tpublic mode: TransceiverMode = `record`\n\tpublic readonly subject: Subject<PackedSetUpdate<P>> = new Subject()\n\n\tpublic constructor(values?: Iterable<P>) {\n\t\tsuper(values)\n\t\tif (values instanceof UList) {\n\t\t}\n\t}\n\n\tpublic readonly READONLY_VIEW: ReadonlySet<P> = this\n\n\tpublic toJSON(): ReadonlyArray<P> {\n\t\treturn [...this]\n\t}\n\n\tpublic static fromJSON<P extends primitive>(json: ReadonlyArray<P>): UList<P> {\n\t\treturn new UList<P>(json)\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.emit({ type: `add`, 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.emit({ type: `clear`, values: 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.emit({ type: `delete`, value })\n\t\t}\n\t\treturn result\n\t}\n\n\tpublic subscribe(\n\t\tkey: string,\n\t\tfn: (update: PackedSetUpdate<P>) => void,\n\t): () => void {\n\t\treturn this.subject.subscribe(key, fn)\n\t}\n\n\tpublic emit(update: SetUpdate<P>): void {\n\t\tthis.subject.next(UList.packUpdate(update))\n\t}\n\n\tpublic do(packed: PackedSetUpdate<P>): null {\n\t\tthis.mode = `playback`\n\t\tconst update = UList.unpackUpdate(packed)\n\t\tswitch (update.type) {\n\t\t\tcase `add`:\n\t\t\t\tthis.add(update.value)\n\t\t\t\tbreak\n\t\t\tcase `delete`:\n\t\t\t\tthis.delete(update.value)\n\t\t\t\tbreak\n\t\t\tcase `clear`:\n\t\t\t\tthis.clear()\n\t\t}\n\t\tthis.mode = `record`\n\t\treturn null\n\t}\n\n\tpublic undo(packed: PackedSetUpdate<P>): number | null {\n\t\tconst update = UList.unpackUpdate(packed)\n\t\tthis.mode = `playback`\n\t\tswitch (update.type) {\n\t\t\tcase `add`:\n\t\t\t\tthis.delete(update.value)\n\t\t\t\tbreak\n\t\t\tcase `delete`:\n\t\t\t\tthis.add(update.value)\n\t\t\t\tbreak\n\t\t\tcase `clear`: {\n\t\t\t\tconst values = update.values\n\t\t\t\tfor (const v of values) this.add(v)\n\t\t\t}\n\t\t}\n\t\tthis.mode = `record`\n\t\treturn null\n\t}\n\n\tpublic static packUpdate<P extends primitive>(\n\t\tupdate: SetUpdate<P>,\n\t): PackedSetUpdate<P> {\n\t\tconst head = SET_UPDATE_ENUM[update.type] + `\\u001F`\n\t\tif (update.type === `clear`) {\n\t\t\treturn head + update.values.map(packValue).join(`\\u001E`)\n\t\t}\n\t\treturn head + packValue(update.value)\n\t}\n\tpublic static unpackUpdate<P extends primitive>(\n\t\tpacked: PackedSetUpdate<P>,\n\t): SetUpdate<P> {\n\t\tconst [type, tail] = packed.split(`\\u001F`) as [0 | 1 | 2, string]\n\t\tconst head = SET_UPDATE_ENUM[type]\n\t\tif (head === `clear`) {\n\t\t\tconst values = tail.split(`\\u001E`).map(unpackValue) as P[]\n\t\t\treturn { type: `clear`, values }\n\t\t}\n\t\treturn { type: head, value: unpackValue(tail) as P }\n\t}\n}\n"],"mappings":";;;AA+BA,MAAaA,kBACZ,YAAY;CAAC;CAAO;CAAU;CAAQ,CAAU;AAIjD,IAAa,QAAb,MAAa,cACJ,IAIT;CACC,AAAO,OAAwB;CAC/B,AAAgB,UAAuC,IAAI,SAAS;CAEpE,AAAO,YAAY,QAAsB;AACxC,QAAM,OAAO;AACb,MAAI,kBAAkB,OAAO;;CAI9B,AAAgB,gBAAgC;CAEhD,AAAO,SAA2B;AACjC,SAAO,CAAC,GAAG,KAAK;;CAGjB,OAAc,SAA8B,MAAkC;AAC7E,SAAO,IAAI,MAAS,KAAK;;CAG1B,AAAO,IAAI,OAAgB;EAC1B,MAAM,SAAS,MAAM,IAAI,MAAM;AAC/B,MAAI,KAAK,SAAS,SACjB,MAAK,KAAK;GAAE,MAAM;GAAO;GAAO,CAAC;AAElC,SAAO;;CAGR,AAAO,QAAc;EACpB,MAAM,mBAAmB,KAAK,SAAS,WAAW,CAAC,GAAG,KAAK,GAAG;AAC9D,QAAM,OAAO;AACb,MAAI,iBACH,MAAK,KAAK;GAAE,MAAM;GAAS,QAAQ;GAAkB,CAAC;;CAIxD,AAAO,OAAO,OAAmB;EAChC,MAAM,SAAS,MAAM,OAAO,MAAM;AAClC,MAAI,KAAK,SAAS,SACjB,MAAK,KAAK;GAAE,MAAM;GAAU;GAAO,CAAC;AAErC,SAAO;;CAGR,AAAO,UACN,KACA,IACa;AACb,SAAO,KAAK,QAAQ,UAAU,KAAK,GAAG;;CAGvC,AAAO,KAAK,QAA4B;AACvC,OAAK,QAAQ,KAAK,MAAM,WAAW,OAAO,CAAC;;CAG5C,AAAO,GAAG,QAAkC;AAC3C,OAAK,OAAO;EACZ,MAAM,SAAS,MAAM,aAAa,OAAO;AACzC,UAAQ,OAAO,MAAf;GACC,KAAK;AACJ,SAAK,IAAI,OAAO,MAAM;AACtB;GACD,KAAK;AACJ,SAAK,OAAO,OAAO,MAAM;AACzB;GACD,KAAK,QACJ,MAAK,OAAO;;AAEd,OAAK,OAAO;AACZ,SAAO;;CAGR,AAAO,KAAK,QAA2C;EACtD,MAAM,SAAS,MAAM,aAAa,OAAO;AACzC,OAAK,OAAO;AACZ,UAAQ,OAAO,MAAf;GACC,KAAK;AACJ,SAAK,OAAO,OAAO,MAAM;AACzB;GACD,KAAK;AACJ,SAAK,IAAI,OAAO,MAAM;AACtB;GACD,KAAK,SAAS;IACb,MAAM,SAAS,OAAO;AACtB,SAAK,MAAM,KAAK,OAAQ,MAAK,IAAI,EAAE;;;AAGrC,OAAK,OAAO;AACZ,SAAO;;CAGR,OAAc,WACb,QACqB;EACrB,MAAM,OAAO,gBAAgB,OAAO,QAAQ;AAC5C,MAAI,OAAO,SAAS,QACnB,QAAO,OAAO,OAAO,OAAO,IAAI,UAAU,CAAC,KAAK,SAAS;AAE1D,SAAO,OAAO,UAAU,OAAO,MAAM;;CAEtC,OAAc,aACb,QACe;EACf,MAAM,CAAC,MAAM,QAAQ,OAAO,MAAM,SAAS;EAC3C,MAAM,OAAO,gBAAgB;AAC7B,MAAI,SAAS,QAEZ,QAAO;GAAE,MAAM;GAAS,QADT,KAAK,MAAM,SAAS,CAAC,IAAI,YAAY;GACpB;AAEjC,SAAO;GAAE,MAAM;GAAM,OAAO,YAAY,KAAK;GAAO"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "atom.io",
|
|
3
|
-
"version": "0.41.
|
|
3
|
+
"version": "0.41.1",
|
|
4
4
|
"description": "Composable and testable reactive data library.",
|
|
5
5
|
"homepage": "https://atom.io.fyi",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
"eslint": "9.35.0",
|
|
84
84
|
"happy-dom": "18.0.1",
|
|
85
85
|
"http-proxy": "1.18.1",
|
|
86
|
-
"motion": "12.23.
|
|
86
|
+
"motion": "12.23.14",
|
|
87
87
|
"npmlog": "7.0.1",
|
|
88
88
|
"nyc": "17.1.0",
|
|
89
89
|
"postgres": "3.4.7",
|
|
@@ -95,165 +95,6 @@ true satisfies ArrayUpdate<any>[`type`] extends (typeof ARRAY_UPDATES)[number]
|
|
|
95
95
|
export const ARRAY_UPDATE_ENUM: Enumeration<typeof ARRAY_UPDATES> =
|
|
96
96
|
enumeration(ARRAY_UPDATES)
|
|
97
97
|
|
|
98
|
-
export function packArrayUpdate<P extends primitive>(
|
|
99
|
-
update: ArrayUpdate<P>,
|
|
100
|
-
): PackedArrayUpdate<P> {
|
|
101
|
-
let packed = ARRAY_UPDATE_ENUM[update.type] + `\u001F`
|
|
102
|
-
switch (update.type) {
|
|
103
|
-
case `set`:
|
|
104
|
-
packed += update.index + `\u001E` + packValue(update.next)
|
|
105
|
-
if (update.prev !== undefined) {
|
|
106
|
-
packed += `\u001E` + packValue(update.prev)
|
|
107
|
-
}
|
|
108
|
-
return packed
|
|
109
|
-
case `truncate`:
|
|
110
|
-
return (
|
|
111
|
-
packed +
|
|
112
|
-
update.length +
|
|
113
|
-
`\u001E` +
|
|
114
|
-
update.items.map(packValue).join(`\u001E`)
|
|
115
|
-
)
|
|
116
|
-
case `extend`:
|
|
117
|
-
return packed + update.next + `\u001E` + update.prev
|
|
118
|
-
case `pop`:
|
|
119
|
-
case `shift`:
|
|
120
|
-
if (update.value !== undefined) {
|
|
121
|
-
packed += packValue(update.value)
|
|
122
|
-
}
|
|
123
|
-
return packed
|
|
124
|
-
case `push`:
|
|
125
|
-
case `unshift`:
|
|
126
|
-
return packed + update.items.map(packValue).join(`\u001E`)
|
|
127
|
-
case `copyWithin`:
|
|
128
|
-
packed += update.target + `\u001E` + update.start
|
|
129
|
-
if (update.end !== undefined) {
|
|
130
|
-
packed += `\u001E` + update.end
|
|
131
|
-
}
|
|
132
|
-
packed += `\u001E\u001E` + update.prev.map(packValue).join(`\u001E`)
|
|
133
|
-
return packed
|
|
134
|
-
case `fill`:
|
|
135
|
-
packed += packValue(update.value)
|
|
136
|
-
if (update.start !== undefined) {
|
|
137
|
-
packed += `\u001E` + update.start
|
|
138
|
-
}
|
|
139
|
-
if (update.end !== undefined) {
|
|
140
|
-
packed += `\u001E` + update.end
|
|
141
|
-
}
|
|
142
|
-
packed += `\u001E\u001E` + update.prev.map(packValue).join(`\u001E`)
|
|
143
|
-
return packed
|
|
144
|
-
case `splice`:
|
|
145
|
-
return (
|
|
146
|
-
packed +
|
|
147
|
-
update.start +
|
|
148
|
-
`\u001E\u001E` +
|
|
149
|
-
update.deleteCount +
|
|
150
|
-
`\u001E\u001E` +
|
|
151
|
-
update.items.map(packValue).join(`\u001E`) +
|
|
152
|
-
`\u001E\u001E` +
|
|
153
|
-
update.deleted.map(packValue).join(`\u001E`)
|
|
154
|
-
)
|
|
155
|
-
case `reverse`:
|
|
156
|
-
return packed
|
|
157
|
-
case `sort`:
|
|
158
|
-
return (
|
|
159
|
-
packed +
|
|
160
|
-
update.next.map(packValue).join(`\u001E`) +
|
|
161
|
-
`\u001E\u001E` +
|
|
162
|
-
update.prev.map(packValue).join(`\u001E`)
|
|
163
|
-
)
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
export function unpackArrayUpdate<P extends primitive>(
|
|
168
|
-
packed: PackedArrayUpdate<P>,
|
|
169
|
-
): ArrayUpdate<P> {
|
|
170
|
-
const [head, tail] = packed.split(`\u001F`) as [
|
|
171
|
-
Extract<keyof typeof ARRAY_UPDATE_ENUM, number>,
|
|
172
|
-
string,
|
|
173
|
-
]
|
|
174
|
-
const type = ARRAY_UPDATE_ENUM[head]
|
|
175
|
-
switch (type) {
|
|
176
|
-
case `set`: {
|
|
177
|
-
const [i, n, p] = tail.split(`\u001E`)
|
|
178
|
-
const index = +i
|
|
179
|
-
const next = unpackValue(n) as P
|
|
180
|
-
if (p === undefined) {
|
|
181
|
-
return { type, index, next }
|
|
182
|
-
}
|
|
183
|
-
const prev = unpackValue(p) as P
|
|
184
|
-
return { type, index, next, prev }
|
|
185
|
-
}
|
|
186
|
-
case `truncate`: {
|
|
187
|
-
const [l, ...i] = tail.split(`\u001E`)
|
|
188
|
-
const length = +l
|
|
189
|
-
const items = i.map(unpackValue) as P[]
|
|
190
|
-
return { type, length, items }
|
|
191
|
-
}
|
|
192
|
-
case `extend`: {
|
|
193
|
-
const [n, p] = tail.split(`\u001E`)
|
|
194
|
-
const next = +n
|
|
195
|
-
const prev = +p
|
|
196
|
-
return { type, next, prev }
|
|
197
|
-
}
|
|
198
|
-
case `pop`:
|
|
199
|
-
case `shift`:
|
|
200
|
-
if (tail !== ``) {
|
|
201
|
-
const value = unpackValue(tail) as P
|
|
202
|
-
return { type, value }
|
|
203
|
-
}
|
|
204
|
-
return { type }
|
|
205
|
-
case `push`:
|
|
206
|
-
case `unshift`: {
|
|
207
|
-
const items = tail.split(`\u001E`).map(unpackValue) as P[]
|
|
208
|
-
return { type, items }
|
|
209
|
-
}
|
|
210
|
-
case `copyWithin`: {
|
|
211
|
-
const [numbers, data] = tail.split(`\u001E\u001E`)
|
|
212
|
-
const prev = data ? (data.split(`\u001E`).map(unpackValue) as P[]) : []
|
|
213
|
-
const [t, s, e] = numbers.split(`\u001E`)
|
|
214
|
-
const target = +t
|
|
215
|
-
const start = +s
|
|
216
|
-
if (e === undefined) {
|
|
217
|
-
return { type, target, start, prev }
|
|
218
|
-
}
|
|
219
|
-
const end = +e
|
|
220
|
-
return { type, target, start, prev, end }
|
|
221
|
-
}
|
|
222
|
-
case `fill`: {
|
|
223
|
-
const [numbers, data] = tail.split(`\u001E\u001E`)
|
|
224
|
-
const prev = data ? (data.split(`\u001E`).map(unpackValue) as P[]) : []
|
|
225
|
-
const [v, s, e] = numbers.split(`\u001E`)
|
|
226
|
-
const value = unpackValue(v) as P
|
|
227
|
-
if (s === undefined && e === undefined) {
|
|
228
|
-
return { type, value, prev }
|
|
229
|
-
}
|
|
230
|
-
const start = +s
|
|
231
|
-
if (e === undefined) {
|
|
232
|
-
return { type, value, prev, start }
|
|
233
|
-
}
|
|
234
|
-
const end = +e
|
|
235
|
-
return { type, value, prev, start, end }
|
|
236
|
-
}
|
|
237
|
-
case `splice`: {
|
|
238
|
-
const [s, c, i, d] = tail.split(`\u001E\u001E`)
|
|
239
|
-
|
|
240
|
-
const start = +s
|
|
241
|
-
const deleteCount = +c
|
|
242
|
-
const items = i ? (i.split(`\u001E`).map(unpackValue) as P[]) : []
|
|
243
|
-
const deleted = d ? (d.split(`\u001E`).map(unpackValue) as P[]) : []
|
|
244
|
-
return { type, start, deleteCount, items, deleted }
|
|
245
|
-
}
|
|
246
|
-
case `reverse`:
|
|
247
|
-
return { type }
|
|
248
|
-
case `sort`: {
|
|
249
|
-
const [n, p] = tail.split(`\u001E\u001E`)
|
|
250
|
-
const next = n ? (n.split(`\u001E`).map(unpackValue) as P[]) : []
|
|
251
|
-
const prev = p ? (p.split(`\u001E`).map(unpackValue) as P[]) : []
|
|
252
|
-
return { type, next, prev }
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
|
|
257
98
|
export type ArrayMutationHandler = {
|
|
258
99
|
[K in Exclude<OListUpdateType, `extend` | `set` | `truncate`>]: Fn
|
|
259
100
|
}
|
|
@@ -473,7 +314,7 @@ export class OList<P extends primitive>
|
|
|
473
314
|
}
|
|
474
315
|
|
|
475
316
|
public emit(update: ArrayUpdate<P>): void {
|
|
476
|
-
this.subject.next(
|
|
317
|
+
this.subject.next(OList.packUpdate(update))
|
|
477
318
|
}
|
|
478
319
|
|
|
479
320
|
private doStep(update: ArrayUpdate<P>): void {
|
|
@@ -523,7 +364,7 @@ export class OList<P extends primitive>
|
|
|
523
364
|
|
|
524
365
|
public do(update: PackedArrayUpdate<P>): null {
|
|
525
366
|
this.mode = `playback`
|
|
526
|
-
const unpacked =
|
|
367
|
+
const unpacked = OList.unpackUpdate(update)
|
|
527
368
|
this.doStep(unpacked)
|
|
528
369
|
this.mode = `record`
|
|
529
370
|
return null
|
|
@@ -605,9 +446,168 @@ export class OList<P extends primitive>
|
|
|
605
446
|
|
|
606
447
|
public undo(update: PackedArrayUpdate<P>): number | null {
|
|
607
448
|
this.mode = `playback`
|
|
608
|
-
const unpacked =
|
|
449
|
+
const unpacked = OList.unpackUpdate(update)
|
|
609
450
|
this.undoStep(unpacked)
|
|
610
451
|
this.mode = `record`
|
|
611
452
|
return null
|
|
612
453
|
}
|
|
454
|
+
|
|
455
|
+
public static packUpdate<P extends primitive>(
|
|
456
|
+
update: ArrayUpdate<P>,
|
|
457
|
+
): PackedArrayUpdate<P> {
|
|
458
|
+
let packed = ARRAY_UPDATE_ENUM[update.type] + `\u001F`
|
|
459
|
+
switch (update.type) {
|
|
460
|
+
case `set`:
|
|
461
|
+
packed += update.index + `\u001E` + packValue(update.next)
|
|
462
|
+
if (update.prev !== undefined) {
|
|
463
|
+
packed += `\u001E` + packValue(update.prev)
|
|
464
|
+
}
|
|
465
|
+
return packed
|
|
466
|
+
case `truncate`:
|
|
467
|
+
return (
|
|
468
|
+
packed +
|
|
469
|
+
update.length +
|
|
470
|
+
`\u001E` +
|
|
471
|
+
update.items.map(packValue).join(`\u001E`)
|
|
472
|
+
)
|
|
473
|
+
case `extend`:
|
|
474
|
+
return packed + update.next + `\u001E` + update.prev
|
|
475
|
+
case `pop`:
|
|
476
|
+
case `shift`:
|
|
477
|
+
if (update.value !== undefined) {
|
|
478
|
+
packed += packValue(update.value)
|
|
479
|
+
}
|
|
480
|
+
return packed
|
|
481
|
+
case `push`:
|
|
482
|
+
case `unshift`:
|
|
483
|
+
return packed + update.items.map(packValue).join(`\u001E`)
|
|
484
|
+
case `copyWithin`:
|
|
485
|
+
packed += update.target + `\u001E` + update.start
|
|
486
|
+
if (update.end !== undefined) {
|
|
487
|
+
packed += `\u001E` + update.end
|
|
488
|
+
}
|
|
489
|
+
packed += `\u001E\u001E` + update.prev.map(packValue).join(`\u001E`)
|
|
490
|
+
return packed
|
|
491
|
+
case `fill`:
|
|
492
|
+
packed += packValue(update.value)
|
|
493
|
+
if (update.start !== undefined) {
|
|
494
|
+
packed += `\u001E` + update.start
|
|
495
|
+
}
|
|
496
|
+
if (update.end !== undefined) {
|
|
497
|
+
packed += `\u001E` + update.end
|
|
498
|
+
}
|
|
499
|
+
packed += `\u001E\u001E` + update.prev.map(packValue).join(`\u001E`)
|
|
500
|
+
return packed
|
|
501
|
+
case `splice`:
|
|
502
|
+
return (
|
|
503
|
+
packed +
|
|
504
|
+
update.start +
|
|
505
|
+
`\u001E\u001E` +
|
|
506
|
+
update.deleteCount +
|
|
507
|
+
`\u001E\u001E` +
|
|
508
|
+
update.items.map(packValue).join(`\u001E`) +
|
|
509
|
+
`\u001E\u001E` +
|
|
510
|
+
update.deleted.map(packValue).join(`\u001E`)
|
|
511
|
+
)
|
|
512
|
+
case `reverse`:
|
|
513
|
+
return packed
|
|
514
|
+
case `sort`:
|
|
515
|
+
return (
|
|
516
|
+
packed +
|
|
517
|
+
update.next.map(packValue).join(`\u001E`) +
|
|
518
|
+
`\u001E\u001E` +
|
|
519
|
+
update.prev.map(packValue).join(`\u001E`)
|
|
520
|
+
)
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
public static unpackUpdate<P extends primitive>(
|
|
525
|
+
packed: PackedArrayUpdate<P>,
|
|
526
|
+
): ArrayUpdate<P> {
|
|
527
|
+
const [head, tail] = packed.split(`\u001F`) as [
|
|
528
|
+
Extract<keyof typeof ARRAY_UPDATE_ENUM, number>,
|
|
529
|
+
string,
|
|
530
|
+
]
|
|
531
|
+
const type = ARRAY_UPDATE_ENUM[head]
|
|
532
|
+
switch (type) {
|
|
533
|
+
case `set`: {
|
|
534
|
+
const [i, n, p] = tail.split(`\u001E`)
|
|
535
|
+
const index = +i
|
|
536
|
+
const next = unpackValue(n) as P
|
|
537
|
+
if (p === undefined) {
|
|
538
|
+
return { type, index, next }
|
|
539
|
+
}
|
|
540
|
+
const prev = unpackValue(p) as P
|
|
541
|
+
return { type, index, next, prev }
|
|
542
|
+
}
|
|
543
|
+
case `truncate`: {
|
|
544
|
+
const [l, ...i] = tail.split(`\u001E`)
|
|
545
|
+
const length = +l
|
|
546
|
+
const items = i.map(unpackValue) as P[]
|
|
547
|
+
return { type, length, items }
|
|
548
|
+
}
|
|
549
|
+
case `extend`: {
|
|
550
|
+
const [n, p] = tail.split(`\u001E`)
|
|
551
|
+
const next = +n
|
|
552
|
+
const prev = +p
|
|
553
|
+
return { type, next, prev }
|
|
554
|
+
}
|
|
555
|
+
case `pop`:
|
|
556
|
+
case `shift`:
|
|
557
|
+
if (tail !== ``) {
|
|
558
|
+
const value = unpackValue(tail) as P
|
|
559
|
+
return { type, value }
|
|
560
|
+
}
|
|
561
|
+
return { type }
|
|
562
|
+
case `push`:
|
|
563
|
+
case `unshift`: {
|
|
564
|
+
const items = tail.split(`\u001E`).map(unpackValue) as P[]
|
|
565
|
+
return { type, items }
|
|
566
|
+
}
|
|
567
|
+
case `copyWithin`: {
|
|
568
|
+
const [numbers, data] = tail.split(`\u001E\u001E`)
|
|
569
|
+
const prev = data ? (data.split(`\u001E`).map(unpackValue) as P[]) : []
|
|
570
|
+
const [t, s, e] = numbers.split(`\u001E`)
|
|
571
|
+
const target = +t
|
|
572
|
+
const start = +s
|
|
573
|
+
if (e === undefined) {
|
|
574
|
+
return { type, target, start, prev }
|
|
575
|
+
}
|
|
576
|
+
const end = +e
|
|
577
|
+
return { type, target, start, prev, end }
|
|
578
|
+
}
|
|
579
|
+
case `fill`: {
|
|
580
|
+
const [numbers, data] = tail.split(`\u001E\u001E`)
|
|
581
|
+
const prev = data ? (data.split(`\u001E`).map(unpackValue) as P[]) : []
|
|
582
|
+
const [v, s, e] = numbers.split(`\u001E`)
|
|
583
|
+
const value = unpackValue(v) as P
|
|
584
|
+
if (s === undefined && e === undefined) {
|
|
585
|
+
return { type, value, prev }
|
|
586
|
+
}
|
|
587
|
+
const start = +s
|
|
588
|
+
if (e === undefined) {
|
|
589
|
+
return { type, value, prev, start }
|
|
590
|
+
}
|
|
591
|
+
const end = +e
|
|
592
|
+
return { type, value, prev, start, end }
|
|
593
|
+
}
|
|
594
|
+
case `splice`: {
|
|
595
|
+
const [s, c, i, d] = tail.split(`\u001E\u001E`)
|
|
596
|
+
|
|
597
|
+
const start = +s
|
|
598
|
+
const deleteCount = +c
|
|
599
|
+
const items = i ? (i.split(`\u001E`).map(unpackValue) as P[]) : []
|
|
600
|
+
const deleted = d ? (d.split(`\u001E`).map(unpackValue) as P[]) : []
|
|
601
|
+
return { type, start, deleteCount, items, deleted }
|
|
602
|
+
}
|
|
603
|
+
case `reverse`:
|
|
604
|
+
return { type }
|
|
605
|
+
case `sort`: {
|
|
606
|
+
const [n, p] = tail.split(`\u001E\u001E`)
|
|
607
|
+
const next = n ? (n.split(`\u001E`).map(unpackValue) as P[]) : []
|
|
608
|
+
const prev = p ? (p.split(`\u001E`).map(unpackValue) as P[]) : []
|
|
609
|
+
return { type, next, prev }
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
613
|
}
|
|
@@ -32,27 +32,6 @@ export type PackedSetUpdate<P extends primitive> = string & {
|
|
|
32
32
|
export const SET_UPDATE_ENUM: Enumeration<[`add`, `delete`, `clear`]> =
|
|
33
33
|
enumeration([`add`, `delete`, `clear`] as const)
|
|
34
34
|
|
|
35
|
-
export function packSetUpdate<P extends primitive>(
|
|
36
|
-
update: SetUpdate<P>,
|
|
37
|
-
): PackedSetUpdate<P> {
|
|
38
|
-
const head = SET_UPDATE_ENUM[update.type] + `\u001F`
|
|
39
|
-
if (update.type === `clear`) {
|
|
40
|
-
return head + update.values.map(packValue).join(`\u001E`)
|
|
41
|
-
}
|
|
42
|
-
return head + packValue(update.value)
|
|
43
|
-
}
|
|
44
|
-
export function unpackSetUpdate<P extends primitive>(
|
|
45
|
-
packed: PackedSetUpdate<P>,
|
|
46
|
-
): SetUpdate<P> {
|
|
47
|
-
const [type, tail] = packed.split(`\u001F`) as [0 | 1 | 2, string]
|
|
48
|
-
const head = SET_UPDATE_ENUM[type]
|
|
49
|
-
if (head === `clear`) {
|
|
50
|
-
const values = tail.split(`\u001E`).map(unpackValue) as P[]
|
|
51
|
-
return { type: `clear`, values }
|
|
52
|
-
}
|
|
53
|
-
return { type: head, value: unpackValue(tail) as P }
|
|
54
|
-
}
|
|
55
|
-
|
|
56
35
|
export type SetMutationHandler = { [K in UListUpdateType]: Fn }
|
|
57
36
|
|
|
58
37
|
export class UList<P extends primitive>
|
|
@@ -112,12 +91,12 @@ export class UList<P extends primitive>
|
|
|
112
91
|
}
|
|
113
92
|
|
|
114
93
|
public emit(update: SetUpdate<P>): void {
|
|
115
|
-
this.subject.next(
|
|
94
|
+
this.subject.next(UList.packUpdate(update))
|
|
116
95
|
}
|
|
117
96
|
|
|
118
97
|
public do(packed: PackedSetUpdate<P>): null {
|
|
119
98
|
this.mode = `playback`
|
|
120
|
-
const update =
|
|
99
|
+
const update = UList.unpackUpdate(packed)
|
|
121
100
|
switch (update.type) {
|
|
122
101
|
case `add`:
|
|
123
102
|
this.add(update.value)
|
|
@@ -133,7 +112,7 @@ export class UList<P extends primitive>
|
|
|
133
112
|
}
|
|
134
113
|
|
|
135
114
|
public undo(packed: PackedSetUpdate<P>): number | null {
|
|
136
|
-
const update =
|
|
115
|
+
const update = UList.unpackUpdate(packed)
|
|
137
116
|
this.mode = `playback`
|
|
138
117
|
switch (update.type) {
|
|
139
118
|
case `add`:
|
|
@@ -150,4 +129,25 @@ export class UList<P extends primitive>
|
|
|
150
129
|
this.mode = `record`
|
|
151
130
|
return null
|
|
152
131
|
}
|
|
132
|
+
|
|
133
|
+
public static packUpdate<P extends primitive>(
|
|
134
|
+
update: SetUpdate<P>,
|
|
135
|
+
): PackedSetUpdate<P> {
|
|
136
|
+
const head = SET_UPDATE_ENUM[update.type] + `\u001F`
|
|
137
|
+
if (update.type === `clear`) {
|
|
138
|
+
return head + update.values.map(packValue).join(`\u001E`)
|
|
139
|
+
}
|
|
140
|
+
return head + packValue(update.value)
|
|
141
|
+
}
|
|
142
|
+
public static unpackUpdate<P extends primitive>(
|
|
143
|
+
packed: PackedSetUpdate<P>,
|
|
144
|
+
): SetUpdate<P> {
|
|
145
|
+
const [type, tail] = packed.split(`\u001F`) as [0 | 1 | 2, string]
|
|
146
|
+
const head = SET_UPDATE_ENUM[type]
|
|
147
|
+
if (head === `clear`) {
|
|
148
|
+
const values = tail.split(`\u001E`).map(unpackValue) as P[]
|
|
149
|
+
return { type: `clear`, values }
|
|
150
|
+
}
|
|
151
|
+
return { type: head, value: unpackValue(tail) as P }
|
|
152
|
+
}
|
|
153
153
|
}
|