atom.io 0.42.1 → 0.42.2
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 +6 -1
- package/dist/transceivers/o-list/index.d.ts.map +1 -1
- package/dist/transceivers/o-list/index.js +88 -2
- package/dist/transceivers/o-list/index.js.map +1 -1
- package/package.json +4 -4
- package/src/transceivers/o-list/index.ts +1 -0
- package/src/transceivers/o-list/o-list-disposed-key-cleanup-effect.ts +153 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Fn, Subject, Transceiver, TransceiverMode } from "atom.io/internal";
|
|
2
|
+
import { AtomEffect } from "atom.io";
|
|
2
3
|
import { primitive } from "atom.io/json";
|
|
3
4
|
import { Enumeration } from "atom.io/struct";
|
|
4
5
|
|
|
@@ -87,5 +88,9 @@ declare class OList<P extends primitive> extends Array<P> implements Transceiver
|
|
|
87
88
|
static unpackUpdate<P extends primitive>(packed: PackedArrayUpdate<P>): ArrayUpdate<P>;
|
|
88
89
|
}
|
|
89
90
|
//#endregion
|
|
90
|
-
|
|
91
|
+
//#region src/transceivers/o-list/o-list-disposed-key-cleanup-effect.d.ts
|
|
92
|
+
declare function filterOutInPlace<T>(arr: T[], toRemove: T): T[];
|
|
93
|
+
declare const oListDisposedKeyCleanupEffect: AtomEffect<OList<primitive>>;
|
|
94
|
+
//#endregion
|
|
95
|
+
export { ARRAY_UPDATE_ENUM, ArrayMutationHandler, ArrayMutations, ArrayUpdate, OList, OListUpdateType, OListView, PackedArrayUpdate, filterOutInPlace, oListDisposedKeyCleanupEffect };
|
|
91
96
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["ARRAY_UPDATE_ENUM: Enumeration<typeof ARRAY_UPDATES>","oListDisposedKeyCleanupEffect: AtomEffect<OList<primitive>>"],"sources":["../../../src/transceivers/o-list/o-list.ts","../../../src/transceivers/o-list/o-list-disposed-key-cleanup-effect.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Subject } from "atom.io/internal";
|
|
1
|
+
import { Subject, getFromStore, getUpdateToken, subscribeInStore } from "atom.io/internal";
|
|
2
|
+
import { stringifyJson } from "atom.io/json";
|
|
2
3
|
import { enumeration, packValue, unpackValue } from "atom.io/struct";
|
|
3
4
|
|
|
4
5
|
//#region src/transceivers/o-list/o-list.ts
|
|
@@ -510,5 +511,90 @@ var OList = class OList extends Array {
|
|
|
510
511
|
};
|
|
511
512
|
|
|
512
513
|
//#endregion
|
|
513
|
-
|
|
514
|
+
//#region src/transceivers/o-list/o-list-disposed-key-cleanup-effect.ts
|
|
515
|
+
function filterOutInPlace(arr, toRemove) {
|
|
516
|
+
let writeIndex = 0;
|
|
517
|
+
for (let readIndex = 0; readIndex < arr.length; readIndex++) if (toRemove !== arr[readIndex]) {
|
|
518
|
+
arr[writeIndex] = arr[readIndex];
|
|
519
|
+
writeIndex++;
|
|
520
|
+
}
|
|
521
|
+
arr.length = writeIndex;
|
|
522
|
+
return arr;
|
|
523
|
+
}
|
|
524
|
+
const oListDisposedKeyCleanupEffect = ({ token, setSelf, store }) => {
|
|
525
|
+
const disposalSubscriptions = /* @__PURE__ */ new Map();
|
|
526
|
+
const updateToken = getUpdateToken(token);
|
|
527
|
+
const addedValues = /* @__PURE__ */ new Set();
|
|
528
|
+
const removedValues = /* @__PURE__ */ new Set();
|
|
529
|
+
function updateSubscriptions() {
|
|
530
|
+
for (const addedValue of addedValues) {
|
|
531
|
+
const molecule = store.molecules.get(stringifyJson(addedValue));
|
|
532
|
+
if (molecule) disposalSubscriptions.set(addedValue, molecule.subject.subscribe(token.key, () => {
|
|
533
|
+
disposalSubscriptions.get(addedValue)?.();
|
|
534
|
+
disposalSubscriptions.delete(addedValue);
|
|
535
|
+
setSelf((self) => {
|
|
536
|
+
filterOutInPlace(self, addedValue);
|
|
537
|
+
return self;
|
|
538
|
+
});
|
|
539
|
+
}));
|
|
540
|
+
else store.logger.warn(`❌`, token.type, token.key, `Added "${addedValue}" to ${token.key} but it has not been allocated.`);
|
|
541
|
+
}
|
|
542
|
+
for (const removedValue of removedValues) if (disposalSubscriptions.has(removedValue)) {
|
|
543
|
+
disposalSubscriptions.get(removedValue)?.();
|
|
544
|
+
disposalSubscriptions.delete(removedValue);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
subscribeInStore(store, updateToken, function manageAutoDeletionTriggers({ newValue }) {
|
|
548
|
+
const currentList = getFromStore(store, token);
|
|
549
|
+
const unpacked = OList.unpackUpdate(newValue);
|
|
550
|
+
switch (unpacked.type) {
|
|
551
|
+
case `extend`:
|
|
552
|
+
case `reverse`:
|
|
553
|
+
case `sort`: break;
|
|
554
|
+
case `set`:
|
|
555
|
+
{
|
|
556
|
+
const { next } = unpacked;
|
|
557
|
+
if (`prev` in unpacked && !currentList.includes(unpacked.prev)) removedValues.add(unpacked.prev);
|
|
558
|
+
if (!disposalSubscriptions.has(next)) addedValues.add(next);
|
|
559
|
+
}
|
|
560
|
+
break;
|
|
561
|
+
case `truncate`:
|
|
562
|
+
for (const item of unpacked.items) if (!currentList.includes(item)) removedValues.add(item);
|
|
563
|
+
break;
|
|
564
|
+
case `shift`:
|
|
565
|
+
case `pop`:
|
|
566
|
+
{
|
|
567
|
+
const { value } = unpacked;
|
|
568
|
+
if (value !== void 0 && !currentList.includes(value)) removedValues.add(value);
|
|
569
|
+
}
|
|
570
|
+
break;
|
|
571
|
+
case `push`:
|
|
572
|
+
case `unshift`:
|
|
573
|
+
for (const item of unpacked.items) if (!disposalSubscriptions.has(item)) addedValues.add(item);
|
|
574
|
+
break;
|
|
575
|
+
case `copyWithin`:
|
|
576
|
+
for (const item of unpacked.prev) if (!currentList.includes(item)) removedValues.add(item);
|
|
577
|
+
break;
|
|
578
|
+
case `fill`:
|
|
579
|
+
{
|
|
580
|
+
const { value } = unpacked;
|
|
581
|
+
if (value !== void 0) {
|
|
582
|
+
if (!disposalSubscriptions.has(value)) addedValues.add(value);
|
|
583
|
+
}
|
|
584
|
+
for (const item of unpacked.prev) if (!currentList.includes(item)) removedValues.add(item);
|
|
585
|
+
}
|
|
586
|
+
break;
|
|
587
|
+
case `splice`:
|
|
588
|
+
for (const item of unpacked.deleted) if (!currentList.includes(item)) removedValues.add(item);
|
|
589
|
+
for (const addedItem of unpacked.items) if (!disposalSubscriptions.has(addedItem)) addedValues.add(addedItem);
|
|
590
|
+
break;
|
|
591
|
+
}
|
|
592
|
+
updateSubscriptions();
|
|
593
|
+
addedValues.clear();
|
|
594
|
+
removedValues.clear();
|
|
595
|
+
}, `set-auto-deletion-triggers`);
|
|
596
|
+
};
|
|
597
|
+
|
|
598
|
+
//#endregion
|
|
599
|
+
export { ARRAY_UPDATE_ENUM, OList, filterOutInPlace, oListDisposedKeyCleanupEffect };
|
|
514
600
|
//# 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 { 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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"}
|
|
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","oListDisposedKeyCleanupEffect: AtomEffect<OList<primitive>>"],"sources":["../../../src/transceivers/o-list/o-list.ts","../../../src/transceivers/o-list/o-list-disposed-key-cleanup-effect.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","import type { AtomEffect } from \"atom.io\"\nimport { getFromStore, getUpdateToken, subscribeInStore } from \"atom.io/internal\"\nimport { type primitive, stringifyJson } from \"atom.io/json\"\n\nimport { OList } from \"./o-list\"\n\nexport function filterOutInPlace<T>(arr: T[], toRemove: T): T[] {\n\tlet writeIndex = 0\n\n\t// eslint-disable-next-line @typescript-eslint/prefer-for-of\n\tfor (let readIndex = 0; readIndex < arr.length; readIndex++) {\n\t\tif (toRemove !== arr[readIndex]) {\n\t\t\tarr[writeIndex] = arr[readIndex]\n\t\t\twriteIndex++\n\t\t}\n\t}\n\n\tarr.length = writeIndex\n\treturn arr\n}\n\nexport const oListDisposedKeyCleanupEffect: AtomEffect<OList<primitive>> = ({\n\ttoken,\n\tsetSelf,\n\tstore,\n}) => {\n\tconst disposalSubscriptions = new Map<primitive, () => void>()\n\tconst updateToken = getUpdateToken(token)\n\n\tconst addedValues = new Set<primitive>()\n\tconst removedValues = new Set<primitive>()\n\tfunction updateSubscriptions() {\n\t\tfor (const addedValue of addedValues) {\n\t\t\tconst molecule = store.molecules.get(stringifyJson(addedValue))\n\t\t\tif (molecule) {\n\t\t\t\tdisposalSubscriptions.set(\n\t\t\t\t\taddedValue,\n\t\t\t\t\tmolecule.subject.subscribe(token.key, () => {\n\t\t\t\t\t\tdisposalSubscriptions.get(addedValue)?.()\n\t\t\t\t\t\tdisposalSubscriptions.delete(addedValue)\n\t\t\t\t\t\tsetSelf((self) => {\n\t\t\t\t\t\t\tfilterOutInPlace(self, addedValue)\n\t\t\t\t\t\t\treturn self\n\t\t\t\t\t\t})\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tstore.logger.warn(\n\t\t\t\t\t`❌`,\n\t\t\t\t\ttoken.type,\n\t\t\t\t\ttoken.key,\n\t\t\t\t\t`Added \"${addedValue}\" to ${token.key} but it has not been allocated.`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tfor (const removedValue of removedValues) {\n\t\t\tif (disposalSubscriptions.has(removedValue)) {\n\t\t\t\tdisposalSubscriptions.get(removedValue)?.()\n\t\t\t\tdisposalSubscriptions.delete(removedValue)\n\t\t\t}\n\t\t}\n\t}\n\tsubscribeInStore(\n\t\tstore,\n\t\tupdateToken,\n\t\tfunction manageAutoDeletionTriggers({ newValue }) {\n\t\t\tconst currentList = getFromStore(store, token)\n\t\t\tconst unpacked = OList.unpackUpdate(newValue)\n\t\t\tswitch (unpacked.type) {\n\t\t\t\tcase `extend`:\n\t\t\t\tcase `reverse`:\n\t\t\t\tcase `sort`:\n\t\t\t\t\tbreak // these don't change what values are present in the list\n\n\t\t\t\tcase `set`:\n\t\t\t\t\t{\n\t\t\t\t\t\tconst { next } = unpacked\n\t\t\t\t\t\tif (`prev` in unpacked && !currentList.includes(unpacked.prev)) {\n\t\t\t\t\t\t\tremovedValues.add(unpacked.prev)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!disposalSubscriptions.has(next)) {\n\t\t\t\t\t\t\taddedValues.add(next)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase `truncate`:\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (const item of unpacked.items) {\n\t\t\t\t\t\t\tif (!currentList.includes(item)) {\n\t\t\t\t\t\t\t\tremovedValues.add(item)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase `shift`:\n\t\t\t\tcase `pop`:\n\t\t\t\t\t{\n\t\t\t\t\t\tconst { value } = unpacked\n\t\t\t\t\t\tif (value !== undefined && !currentList.includes(value)) {\n\t\t\t\t\t\t\tremovedValues.add(value)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase `push`:\n\t\t\t\tcase `unshift`:\n\t\t\t\t\tfor (const item of unpacked.items) {\n\t\t\t\t\t\tif (!disposalSubscriptions.has(item)) {\n\t\t\t\t\t\t\taddedValues.add(item)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase `copyWithin`:\n\t\t\t\t\tfor (const item of unpacked.prev) {\n\t\t\t\t\t\tif (!currentList.includes(item)) {\n\t\t\t\t\t\t\tremovedValues.add(item)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase `fill`:\n\t\t\t\t\t{\n\t\t\t\t\t\tconst { value } = unpacked\n\t\t\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t\t\tif (!disposalSubscriptions.has(value)) {\n\t\t\t\t\t\t\t\taddedValues.add(value)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const item of unpacked.prev) {\n\t\t\t\t\t\t\tif (!currentList.includes(item)) {\n\t\t\t\t\t\t\t\tremovedValues.add(item)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t\tcase `splice`:\n\t\t\t\t\tfor (const item of unpacked.deleted) {\n\t\t\t\t\t\tif (!currentList.includes(item)) {\n\t\t\t\t\t\t\tremovedValues.add(item)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (const addedItem of unpacked.items) {\n\t\t\t\t\t\tif (!disposalSubscriptions.has(addedItem)) {\n\t\t\t\t\t\t\taddedValues.add(addedItem)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t\tupdateSubscriptions()\n\t\t\taddedValues.clear()\n\t\t\tremovedValues.clear()\n\t\t},\n\t\t`set-auto-deletion-triggers`,\n\t)\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "atom.io",
|
|
3
|
-
"version": "0.42.
|
|
3
|
+
"version": "0.42.2",
|
|
4
4
|
"description": "Composable and testable reactive data library.",
|
|
5
5
|
"homepage": "https://atom.io.fyi",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -65,12 +65,12 @@
|
|
|
65
65
|
"@storybook/addon-onboarding": "9.1.8",
|
|
66
66
|
"@storybook/react-vite": "9.1.8",
|
|
67
67
|
"@testing-library/react": "16.3.0",
|
|
68
|
-
"@types/bun": "npm:bun-types@1.2.
|
|
68
|
+
"@types/bun": "npm:bun-types@1.2.23",
|
|
69
69
|
"@types/eslint": "9.6.1",
|
|
70
70
|
"@types/estree": "1.0.8",
|
|
71
71
|
"@types/http-proxy": "1.17.16",
|
|
72
72
|
"@types/npmlog": "7.0.0",
|
|
73
|
-
"@types/react": "19.1.
|
|
73
|
+
"@types/react": "19.1.15",
|
|
74
74
|
"@types/tmp": "0.2.6",
|
|
75
75
|
"@typescript-eslint/parser": "8.44.1",
|
|
76
76
|
"@typescript-eslint/rule-tester": "8.44.1",
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"drizzle-kit": "0.31.5",
|
|
82
82
|
"drizzle-orm": "0.44.5",
|
|
83
83
|
"eslint": "9.36.0",
|
|
84
|
-
"happy-dom": "
|
|
84
|
+
"happy-dom": "19.0.1",
|
|
85
85
|
"http-proxy": "1.18.1",
|
|
86
86
|
"motion": "12.23.22",
|
|
87
87
|
"npmlog": "7.0.1",
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import type { AtomEffect } from "atom.io"
|
|
2
|
+
import { getFromStore, getUpdateToken, subscribeInStore } from "atom.io/internal"
|
|
3
|
+
import { type primitive, stringifyJson } from "atom.io/json"
|
|
4
|
+
|
|
5
|
+
import { OList } from "./o-list"
|
|
6
|
+
|
|
7
|
+
export function filterOutInPlace<T>(arr: T[], toRemove: T): T[] {
|
|
8
|
+
let writeIndex = 0
|
|
9
|
+
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/prefer-for-of
|
|
11
|
+
for (let readIndex = 0; readIndex < arr.length; readIndex++) {
|
|
12
|
+
if (toRemove !== arr[readIndex]) {
|
|
13
|
+
arr[writeIndex] = arr[readIndex]
|
|
14
|
+
writeIndex++
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
arr.length = writeIndex
|
|
19
|
+
return arr
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const oListDisposedKeyCleanupEffect: AtomEffect<OList<primitive>> = ({
|
|
23
|
+
token,
|
|
24
|
+
setSelf,
|
|
25
|
+
store,
|
|
26
|
+
}) => {
|
|
27
|
+
const disposalSubscriptions = new Map<primitive, () => void>()
|
|
28
|
+
const updateToken = getUpdateToken(token)
|
|
29
|
+
|
|
30
|
+
const addedValues = new Set<primitive>()
|
|
31
|
+
const removedValues = new Set<primitive>()
|
|
32
|
+
function updateSubscriptions() {
|
|
33
|
+
for (const addedValue of addedValues) {
|
|
34
|
+
const molecule = store.molecules.get(stringifyJson(addedValue))
|
|
35
|
+
if (molecule) {
|
|
36
|
+
disposalSubscriptions.set(
|
|
37
|
+
addedValue,
|
|
38
|
+
molecule.subject.subscribe(token.key, () => {
|
|
39
|
+
disposalSubscriptions.get(addedValue)?.()
|
|
40
|
+
disposalSubscriptions.delete(addedValue)
|
|
41
|
+
setSelf((self) => {
|
|
42
|
+
filterOutInPlace(self, addedValue)
|
|
43
|
+
return self
|
|
44
|
+
})
|
|
45
|
+
}),
|
|
46
|
+
)
|
|
47
|
+
} else {
|
|
48
|
+
store.logger.warn(
|
|
49
|
+
`❌`,
|
|
50
|
+
token.type,
|
|
51
|
+
token.key,
|
|
52
|
+
`Added "${addedValue}" to ${token.key} but it has not been allocated.`,
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
for (const removedValue of removedValues) {
|
|
57
|
+
if (disposalSubscriptions.has(removedValue)) {
|
|
58
|
+
disposalSubscriptions.get(removedValue)?.()
|
|
59
|
+
disposalSubscriptions.delete(removedValue)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
subscribeInStore(
|
|
64
|
+
store,
|
|
65
|
+
updateToken,
|
|
66
|
+
function manageAutoDeletionTriggers({ newValue }) {
|
|
67
|
+
const currentList = getFromStore(store, token)
|
|
68
|
+
const unpacked = OList.unpackUpdate(newValue)
|
|
69
|
+
switch (unpacked.type) {
|
|
70
|
+
case `extend`:
|
|
71
|
+
case `reverse`:
|
|
72
|
+
case `sort`:
|
|
73
|
+
break // these don't change what values are present in the list
|
|
74
|
+
|
|
75
|
+
case `set`:
|
|
76
|
+
{
|
|
77
|
+
const { next } = unpacked
|
|
78
|
+
if (`prev` in unpacked && !currentList.includes(unpacked.prev)) {
|
|
79
|
+
removedValues.add(unpacked.prev)
|
|
80
|
+
}
|
|
81
|
+
if (!disposalSubscriptions.has(next)) {
|
|
82
|
+
addedValues.add(next)
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
break
|
|
86
|
+
case `truncate`:
|
|
87
|
+
{
|
|
88
|
+
for (const item of unpacked.items) {
|
|
89
|
+
if (!currentList.includes(item)) {
|
|
90
|
+
removedValues.add(item)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
break
|
|
95
|
+
case `shift`:
|
|
96
|
+
case `pop`:
|
|
97
|
+
{
|
|
98
|
+
const { value } = unpacked
|
|
99
|
+
if (value !== undefined && !currentList.includes(value)) {
|
|
100
|
+
removedValues.add(value)
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
break
|
|
104
|
+
case `push`:
|
|
105
|
+
case `unshift`:
|
|
106
|
+
for (const item of unpacked.items) {
|
|
107
|
+
if (!disposalSubscriptions.has(item)) {
|
|
108
|
+
addedValues.add(item)
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
break
|
|
112
|
+
case `copyWithin`:
|
|
113
|
+
for (const item of unpacked.prev) {
|
|
114
|
+
if (!currentList.includes(item)) {
|
|
115
|
+
removedValues.add(item)
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
break
|
|
119
|
+
case `fill`:
|
|
120
|
+
{
|
|
121
|
+
const { value } = unpacked
|
|
122
|
+
if (value !== undefined) {
|
|
123
|
+
if (!disposalSubscriptions.has(value)) {
|
|
124
|
+
addedValues.add(value)
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
for (const item of unpacked.prev) {
|
|
128
|
+
if (!currentList.includes(item)) {
|
|
129
|
+
removedValues.add(item)
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
break
|
|
134
|
+
case `splice`:
|
|
135
|
+
for (const item of unpacked.deleted) {
|
|
136
|
+
if (!currentList.includes(item)) {
|
|
137
|
+
removedValues.add(item)
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
for (const addedItem of unpacked.items) {
|
|
141
|
+
if (!disposalSubscriptions.has(addedItem)) {
|
|
142
|
+
addedValues.add(addedItem)
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
break
|
|
146
|
+
}
|
|
147
|
+
updateSubscriptions()
|
|
148
|
+
addedValues.clear()
|
|
149
|
+
removedValues.clear()
|
|
150
|
+
},
|
|
151
|
+
`set-auto-deletion-triggers`,
|
|
152
|
+
)
|
|
153
|
+
}
|