atom.io 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/dist/index.cjs +614 -0
- package/data/dist/index.cjs.map +1 -0
- package/data/dist/index.d.cts +158 -0
- package/data/dist/index.d.ts +118 -1
- package/data/dist/index.js +551 -30
- package/data/dist/index.js.map +1 -1
- package/data/dist/metafile-cjs.json +1 -0
- package/data/dist/metafile-esm.json +1 -0
- package/data/package.json +4 -3
- package/data/src/index.ts +1 -0
- package/data/src/join.ts +450 -0
- package/data/src/struct-family.ts +34 -24
- package/data/src/struct.ts +6 -8
- package/dist/index.cjs +257 -0
- package/dist/index.cjs.map +1 -0
- package/dist/{index.d.mts → index.d.cts} +10 -11
- package/dist/index.d.ts +10 -11
- package/dist/index.js +63 -104
- package/dist/index.js.map +1 -1
- package/dist/metafile-cjs.json +1 -0
- package/dist/metafile-esm.json +1 -0
- package/internal/dist/{index.mjs → index.cjs} +692 -503
- package/internal/dist/index.cjs.map +1 -0
- package/internal/dist/{index.d.mts → index.d.cts} +114 -105
- package/internal/dist/index.d.ts +114 -105
- package/internal/dist/index.js +628 -563
- package/internal/dist/index.js.map +1 -1
- package/internal/dist/metafile-cjs.json +1 -0
- package/internal/dist/metafile-esm.json +1 -0
- package/internal/package.json +4 -3
- package/internal/src/atom/create-atom.ts +29 -16
- package/internal/src/atom/delete-atom.ts +25 -6
- package/internal/src/atom/is-default.ts +4 -17
- package/internal/src/caching.ts +28 -23
- package/internal/src/families/create-atom-family.ts +3 -2
- package/internal/src/families/create-readonly-selector-family.ts +1 -1
- package/internal/src/families/create-selector-family.ts +4 -4
- package/internal/src/index.ts +2 -1
- package/internal/src/mutable/create-mutable-atom-family.ts +2 -2
- package/internal/src/mutable/create-mutable-atom.ts +1 -2
- package/internal/src/mutable/get-json-family.ts +22 -0
- package/internal/src/mutable/get-json-token.ts +1 -0
- package/internal/src/mutable/index.ts +1 -0
- package/internal/src/mutable/tracker-family.ts +1 -2
- package/internal/src/mutable/tracker.ts +8 -6
- package/internal/src/mutable/transceiver.ts +2 -0
- package/internal/src/not-found-error.ts +27 -0
- package/internal/src/operation.ts +2 -3
- package/internal/src/{get-state-internal.ts → read-or-compute-value.ts} +13 -6
- package/internal/src/selector/create-selector.ts +6 -7
- package/internal/src/selector/delete-selector.ts +37 -0
- package/internal/src/selector/index.ts +2 -1
- package/internal/src/selector/register-selector.ts +7 -7
- package/internal/src/set-state/copy-mutable-in-transaction.ts +3 -2
- package/internal/src/set-state/emit-update.ts +1 -3
- package/internal/src/set-state/evict-downstream.ts +6 -8
- package/internal/src/set-state/index.ts +1 -1
- package/internal/src/set-state/{set-state-internal.ts → set-atom-or-selector.ts} +2 -3
- package/internal/src/set-state/set-atom.ts +5 -6
- package/internal/src/store/store.ts +1 -1
- package/internal/src/store/withdraw-new-family-member.ts +6 -6
- package/internal/src/subscribe/recall-state.ts +1 -2
- package/internal/src/subscribe/subscribe-to-root-atoms.ts +2 -2
- package/internal/src/timeline/add-atom-to-timeline.ts +5 -16
- package/internal/src/timeline/{timeline-internal.ts → create-timeline.ts} +4 -5
- package/internal/src/timeline/index.ts +2 -2
- package/internal/src/timeline/time-travel.ts +89 -0
- package/internal/src/transaction/{transaction-internal.ts → create-transaction.ts} +6 -5
- package/internal/src/transaction/index.ts +2 -3
- package/introspection/dist/{index.mjs → index.cjs} +54 -29
- package/introspection/dist/index.cjs.map +1 -0
- package/introspection/dist/{index.d.mts → index.d.cts} +2 -2
- package/introspection/dist/index.d.ts +2 -2
- package/introspection/dist/index.js +32 -49
- package/introspection/dist/index.js.map +1 -1
- package/introspection/dist/metafile-cjs.json +1 -0
- package/introspection/dist/metafile-esm.json +1 -0
- package/introspection/package.json +4 -3
- package/introspection/src/attach-introspection-states.ts +2 -2
- package/introspection/src/attach-selector-index.ts +8 -4
- package/json/dist/{index.mjs → index.cjs} +20 -7
- package/json/dist/{index.mjs.map → index.cjs.map} +1 -1
- package/json/dist/{index.d.mts → index.d.cts} +1 -1
- package/json/dist/index.d.ts +1 -1
- package/json/dist/index.js +6 -19
- package/json/dist/index.js.map +1 -1
- package/json/dist/metafile-cjs.json +1 -0
- package/json/dist/metafile-esm.json +1 -0
- package/json/package.json +4 -3
- package/package.json +48 -47
- package/react/dist/index.cjs +59 -0
- package/react/dist/index.cjs.map +1 -0
- package/react/dist/index.js +20 -42
- package/react/dist/index.js.map +1 -1
- package/react/dist/metafile-cjs.json +1 -0
- package/react/dist/metafile-esm.json +1 -0
- package/react/package.json +4 -3
- package/react/src/store-hooks.ts +8 -2
- package/react-devtools/dist/{index.mjs → index.cjs} +286 -240
- package/react-devtools/dist/index.cjs.map +1 -0
- package/react-devtools/dist/{index.d.mts → index.d.cts} +29 -17
- package/react-devtools/dist/index.d.ts +29 -17
- package/react-devtools/dist/index.js +251 -273
- package/react-devtools/dist/index.js.map +1 -1
- package/react-devtools/dist/metafile-cjs.json +1 -0
- package/react-devtools/dist/metafile-esm.json +1 -0
- package/react-devtools/package.json +4 -3
- package/react-devtools/src/StateEditor.tsx +8 -8
- package/realtime-client/dist/{index.mjs → index.cjs} +50 -21
- package/realtime-client/dist/index.js +20 -49
- package/realtime-client/dist/metafile-cjs.json +1 -0
- package/realtime-client/dist/metafile-esm.json +1 -0
- package/realtime-client/package.json +4 -3
- package/realtime-react/dist/index.cjs +99 -0
- package/realtime-react/dist/index.js +35 -66
- package/realtime-react/dist/metafile-cjs.json +1 -0
- package/realtime-react/dist/metafile-esm.json +1 -0
- package/realtime-react/package.json +4 -3
- package/realtime-server/dist/{index.mjs → index.cjs} +67 -40
- package/realtime-server/dist/index.js +39 -66
- package/realtime-server/dist/metafile-cjs.json +1 -0
- package/realtime-server/dist/metafile-esm.json +1 -0
- package/realtime-server/package.json +4 -3
- package/realtime-testing/dist/{index.mjs → index.cjs} +54 -23
- package/realtime-testing/dist/index.js +22 -53
- package/realtime-testing/dist/metafile-cjs.json +1 -0
- package/realtime-testing/dist/metafile-esm.json +1 -0
- package/realtime-testing/package.json +4 -3
- package/src/atom.ts +6 -8
- package/src/dispose.ts +18 -0
- package/src/get-state.ts +16 -0
- package/src/index.ts +3 -1
- package/src/logger.ts +1 -1
- package/src/selector.ts +3 -3
- package/src/set-state.ts +22 -0
- package/src/silo.ts +7 -8
- package/src/timeline.ts +6 -11
- package/src/transaction.ts +2 -2
- package/transceivers/set-rtx/dist/{index.mjs → index.cjs} +40 -36
- package/transceivers/set-rtx/dist/index.cjs.map +1 -0
- package/transceivers/set-rtx/dist/{index.d.mts → index.d.cts} +2 -1
- package/transceivers/set-rtx/dist/index.d.ts +2 -1
- package/transceivers/set-rtx/dist/index.js +37 -37
- package/transceivers/set-rtx/dist/index.js.map +1 -1
- package/transceivers/set-rtx/dist/metafile-cjs.json +1 -0
- package/transceivers/set-rtx/dist/metafile-esm.json +1 -0
- package/transceivers/set-rtx/package.json +4 -3
- package/transceivers/set-rtx/src/set-rtx.ts +29 -26
- package/data/dist/index.d.mts +0 -41
- package/data/dist/index.mjs +0 -82
- package/data/dist/index.mjs.map +0 -1
- package/dist/index.mjs +0 -215
- package/dist/index.mjs.map +0 -1
- package/internal/dist/index.mjs.map +0 -1
- package/internal/src/set-state/set-selector-state.ts +0 -8
- package/internal/src/timeline/time-travel-internal.ts +0 -109
- package/introspection/dist/index.mjs.map +0 -1
- package/react/dist/index.mjs +0 -29
- package/react/dist/index.mjs.map +0 -1
- package/react-devtools/dist/index.mjs.map +0 -1
- package/realtime-react/dist/index.mjs +0 -68
- package/src/get-set.ts +0 -48
- package/transceivers/set-rtx/dist/index.mjs.map +0 -1
- /package/react/dist/{index.d.mts → index.d.cts} +0 -0
- /package/realtime-client/dist/{index.mjs.map → index.cjs.map} +0 -0
- /package/realtime-client/dist/{index.d.mts → index.d.cts} +0 -0
- /package/realtime-react/dist/{index.mjs.map → index.cjs.map} +0 -0
- /package/realtime-react/dist/{index.d.mts → index.d.cts} +0 -0
- /package/realtime-server/dist/{index.mjs.map → index.cjs.map} +0 -0
- /package/realtime-server/dist/{index.d.mts → index.d.cts} +0 -0
- /package/realtime-testing/dist/{index.mjs.map → index.cjs.map} +0 -0
- /package/realtime-testing/dist/{index.d.mts → index.d.cts} +0 -0
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var internal = require('atom.io/internal');
|
|
4
|
-
var json = require('atom.io/json');
|
|
1
|
+
import { Subject } from 'atom.io/internal';
|
|
2
|
+
import { stringifyJson, parseJson } from 'atom.io/json';
|
|
5
3
|
|
|
6
4
|
// src/set-rtx.ts
|
|
7
5
|
var SetRTX = class _SetRTX extends Set {
|
|
8
6
|
constructor(values, cacheLimit = 0) {
|
|
9
7
|
super(values);
|
|
10
8
|
this.mode = `record`;
|
|
11
|
-
this.subject = new
|
|
9
|
+
this.subject = new Subject();
|
|
12
10
|
this.cacheLimit = 0;
|
|
13
11
|
this.cache = [];
|
|
14
12
|
this.cacheIdx = -1;
|
|
@@ -48,7 +46,7 @@ var SetRTX = class _SetRTX extends Set {
|
|
|
48
46
|
add(value) {
|
|
49
47
|
if (this.mode === `record`) {
|
|
50
48
|
this.cacheUpdateNumber++;
|
|
51
|
-
this.emit(`add:${
|
|
49
|
+
this.emit(`add:${stringifyJson(value)}`);
|
|
52
50
|
}
|
|
53
51
|
return super.add(value);
|
|
54
52
|
}
|
|
@@ -62,7 +60,7 @@ var SetRTX = class _SetRTX extends Set {
|
|
|
62
60
|
delete(value) {
|
|
63
61
|
if (this.mode === `record`) {
|
|
64
62
|
this.cacheUpdateNumber++;
|
|
65
|
-
this.emit(`del:${
|
|
63
|
+
this.emit(`del:${stringifyJson(value)}`);
|
|
66
64
|
}
|
|
67
65
|
return super.delete(value);
|
|
68
66
|
}
|
|
@@ -110,13 +108,13 @@ var SetRTX = class _SetRTX extends Set {
|
|
|
110
108
|
const value = update.substring(typeValueBreak + 1);
|
|
111
109
|
switch (type) {
|
|
112
110
|
case `add`:
|
|
113
|
-
this.add(
|
|
111
|
+
this.add(parseJson(value));
|
|
114
112
|
break;
|
|
115
113
|
case `clear`:
|
|
116
114
|
this.clear();
|
|
117
115
|
break;
|
|
118
116
|
case `del`:
|
|
119
|
-
this.delete(
|
|
117
|
+
this.delete(parseJson(value));
|
|
120
118
|
break;
|
|
121
119
|
case `tx`:
|
|
122
120
|
for (const update2 of value.split(`;`)) {
|
|
@@ -124,6 +122,10 @@ var SetRTX = class _SetRTX extends Set {
|
|
|
124
122
|
}
|
|
125
123
|
}
|
|
126
124
|
}
|
|
125
|
+
getUpdateNumber(update) {
|
|
126
|
+
const breakpoint = update.indexOf(`=`);
|
|
127
|
+
return Number(update.substring(0, breakpoint));
|
|
128
|
+
}
|
|
127
129
|
do(update) {
|
|
128
130
|
const breakpoint = update.indexOf(`=`);
|
|
129
131
|
const updateNumber = Number(update.substring(0, breakpoint));
|
|
@@ -139,34 +141,32 @@ var SetRTX = class _SetRTX extends Set {
|
|
|
139
141
|
return null;
|
|
140
142
|
}
|
|
141
143
|
return this.cacheUpdateNumber + 1;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
return null;
|
|
148
|
-
}
|
|
149
|
-
this.mode = `playback`;
|
|
150
|
-
let done = false;
|
|
151
|
-
while (!done) {
|
|
152
|
-
this.cacheIdx %= this.cacheLimit;
|
|
153
|
-
const update2 = this.cache[this.cacheIdx];
|
|
154
|
-
this.cacheIdx--;
|
|
155
|
-
if (!update2) {
|
|
156
|
-
return `OUT_OF_RANGE`;
|
|
157
|
-
}
|
|
158
|
-
this.undo(update2);
|
|
159
|
-
done = this.cacheIdx === eventIdx - 1;
|
|
160
|
-
}
|
|
161
|
-
const innerUpdate = update.substring(breakpoint + 1);
|
|
162
|
-
this.doStep(innerUpdate);
|
|
163
|
-
this.mode = `record`;
|
|
164
|
-
this.cacheUpdateNumber = updateNumber;
|
|
144
|
+
}
|
|
145
|
+
if (Math.abs(eventOffset) < this.cacheLimit) {
|
|
146
|
+
const eventIdx = this.cacheIdx + eventOffset;
|
|
147
|
+
const cachedUpdate = this.cache[eventIdx];
|
|
148
|
+
if (cachedUpdate === update) {
|
|
165
149
|
return null;
|
|
166
|
-
} else {
|
|
167
|
-
return `OUT_OF_RANGE`;
|
|
168
150
|
}
|
|
151
|
+
this.mode = `playback`;
|
|
152
|
+
let done = false;
|
|
153
|
+
while (!done) {
|
|
154
|
+
this.cacheIdx %= this.cacheLimit;
|
|
155
|
+
const update2 = this.cache[this.cacheIdx];
|
|
156
|
+
this.cacheIdx--;
|
|
157
|
+
if (!update2) {
|
|
158
|
+
return `OUT_OF_RANGE`;
|
|
159
|
+
}
|
|
160
|
+
this.undo(update2);
|
|
161
|
+
done = this.cacheIdx === eventIdx - 1;
|
|
162
|
+
}
|
|
163
|
+
const innerUpdate = update.substring(breakpoint + 1);
|
|
164
|
+
this.doStep(innerUpdate);
|
|
165
|
+
this.mode = `record`;
|
|
166
|
+
this.cacheUpdateNumber = updateNumber;
|
|
167
|
+
return null;
|
|
169
168
|
}
|
|
169
|
+
return `OUT_OF_RANGE`;
|
|
170
170
|
}
|
|
171
171
|
undoStep(update) {
|
|
172
172
|
const breakpoint = update.indexOf(`:`);
|
|
@@ -174,10 +174,10 @@ var SetRTX = class _SetRTX extends Set {
|
|
|
174
174
|
const value = update.substring(breakpoint + 1);
|
|
175
175
|
switch (type) {
|
|
176
176
|
case `add`:
|
|
177
|
-
this.delete(
|
|
177
|
+
this.delete(parseJson(value));
|
|
178
178
|
break;
|
|
179
179
|
case `del`:
|
|
180
|
-
this.add(
|
|
180
|
+
this.add(parseJson(value));
|
|
181
181
|
break;
|
|
182
182
|
case `clear`: {
|
|
183
183
|
const values = JSON.parse(value);
|
|
@@ -208,6 +208,6 @@ var SetRTX = class _SetRTX extends Set {
|
|
|
208
208
|
}
|
|
209
209
|
};
|
|
210
210
|
|
|
211
|
-
|
|
211
|
+
export { SetRTX };
|
|
212
212
|
//# sourceMappingURL=out.js.map
|
|
213
213
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/set-rtx.ts"],"names":["update","value"],"mappings":"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","sourcesContent":["import type { Transceiver, TransceiverMode } from \"atom.io/internal\"\nimport { Subject } from \"atom.io/internal\"\nimport type { Json, Stringified, primitive } from \"atom.io/json\"\nimport { parseJson, stringifyJson } from \"atom.io/json\"\n\nexport type SetUpdate =\n\t| `add:${string}`\n\t| `clear:${string}`\n\t| `del:${string}`\n\t| `tx:${string}`\nexport type NumberedSetUpdate = `${number}=${SetUpdate}`\n\nexport interface SetRTXJson<P extends primitive> extends Json.Object {\n\tmembers: P[]\n\tcache: (NumberedSetUpdate | null)[]\n\tcacheLimit: number\n\tcacheIdx: number\n\tcacheUpdateNumber: number\n}\nexport class SetRTX<P extends primitive>\n\textends Set<P>\n\timplements Transceiver<NumberedSetUpdate>\n{\n\tpublic mode: TransceiverMode = `record`\n\tpublic readonly subject = new Subject<SetUpdate>()\n\tpublic cacheLimit = 0\n\tpublic cache: (NumberedSetUpdate | null)[] = []\n\tpublic cacheIdx = -1\n\tpublic cacheUpdateNumber = -1\n\n\tpublic constructor(values?: Set<P> | readonly P[] | null, cacheLimit = 0) {\n\t\tsuper(values)\n\t\tif (values instanceof SetRTX) {\n\t\t\tthis.parent = values\n\t\t\tthis.cacheUpdateNumber = values.cacheUpdateNumber\n\t\t}\n\t\tif (cacheLimit) {\n\t\t\tthis.cacheLimit = cacheLimit\n\t\t\tthis.cache = new Array(cacheLimit)\n\t\t\tthis.subscribe(`auto cache`, (update) => {\n\t\t\t\tthis.cacheIdx++\n\t\t\t\tthis.cacheIdx %= this.cacheLimit\n\t\t\t\tthis.cache[this.cacheIdx] = update\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic toJSON(): SetRTXJson<P> {\n\t\treturn {\n\t\t\tmembers: [...this],\n\t\t\tcache: this.cache,\n\t\t\tcacheLimit: this.cacheLimit,\n\t\t\tcacheIdx: this.cacheIdx,\n\t\t\tcacheUpdateNumber: this.cacheUpdateNumber,\n\t\t}\n\t}\n\n\tpublic static fromJSON<P extends primitive>(json: SetRTXJson<P>): SetRTX<P> {\n\t\tconst set = new SetRTX<P>(json.members, json.cacheLimit)\n\t\tset.cache = json.cache\n\t\tset.cacheIdx = json.cacheIdx\n\t\tset.cacheUpdateNumber = json.cacheUpdateNumber\n\t\treturn set\n\t}\n\n\tpublic add(value: P): this {\n\t\tif (this.mode === `record`) {\n\t\t\tthis.cacheUpdateNumber++\n\t\t\tthis.emit(`add:${stringifyJson<P>(value)}`)\n\t\t}\n\t\treturn super.add(value)\n\t}\n\n\tpublic clear(): void {\n\t\tif (this.mode === `record`) {\n\t\t\tthis.cacheUpdateNumber++\n\t\t\tthis.emit(`clear:${JSON.stringify([...this])}`)\n\t\t}\n\t\tsuper.clear()\n\t}\n\n\tpublic delete(value: P): boolean {\n\t\tif (this.mode === `record`) {\n\t\t\tthis.cacheUpdateNumber++\n\t\t\tthis.emit(`del:${stringifyJson<P>(value)}`)\n\t\t}\n\t\treturn super.delete(value)\n\t}\n\n\tpublic readonly parent: SetRTX<P> | null\n\tpublic child: SetRTX<P> | null = null\n\tpublic transactionUpdates: SetUpdate[] | null = null\n\tpublic transaction(run: (child: SetRTX<P>) => boolean): void {\n\t\tthis.mode = `transaction`\n\t\tthis.transactionUpdates = []\n\t\tthis.child = new SetRTX(this)\n\t\tconst unsubscribe = this.child._subscribe(`transaction`, (update) => {\n\t\t\tthis.transactionUpdates?.push(update)\n\t\t})\n\t\ttry {\n\t\t\tconst shouldCommit = run(this.child)\n\t\t\tif (shouldCommit) {\n\t\t\t\tthis.cacheUpdateNumber++\n\t\t\t\tthis.emit(`tx:${this.transactionUpdates.join(`;`)}`)\n\t\t\t\tfor (const update of this.transactionUpdates) {\n\t\t\t\t\tthis.doStep(update)\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (thrown) {\n\t\t\tconsole.error(`Failed to apply transaction: ${thrown}`)\n\t\t} finally {\n\t\t\tunsubscribe()\n\t\t\tthis.child = null\n\t\t\tthis.transactionUpdates = null\n\t\t\tthis.mode = `record`\n\t\t}\n\t}\n\n\tprotected _subscribe(\n\t\tkey: string,\n\t\tfn: (update: SetUpdate) => void,\n\t): () => void {\n\t\treturn this.subject.subscribe(key, fn)\n\t}\n\tpublic subscribe(\n\t\tkey: string,\n\t\tfn: (update: NumberedSetUpdate) => void,\n\t): () => void {\n\t\treturn this.subject.subscribe(key, (update) =>\n\t\t\tfn(`${this.cacheUpdateNumber}=${update}`),\n\t\t)\n\t}\n\n\tpublic emit(update: SetUpdate): void {\n\t\tthis.subject.next(update)\n\t}\n\n\tprivate doStep(update: SetUpdate): void {\n\t\tconst typeValueBreak = update.indexOf(`:`)\n\t\tconst type = update.substring(0, typeValueBreak)\n\t\tconst value = update.substring(typeValueBreak + 1)\n\t\tswitch (type) {\n\t\t\tcase `add`:\n\t\t\t\tthis.add(parseJson(value as Stringified<P>))\n\t\t\t\tbreak\n\t\t\tcase `clear`:\n\t\t\t\tthis.clear()\n\t\t\t\tbreak\n\t\t\tcase `del`:\n\t\t\t\tthis.delete(parseJson(value as Stringified<P>))\n\t\t\t\tbreak\n\t\t\tcase `tx`:\n\t\t\t\tfor (const update of value.split(`;`)) {\n\t\t\t\t\tthis.doStep(update as SetUpdate)\n\t\t\t\t}\n\t\t}\n\t}\n\n\tpublic do(update: NumberedSetUpdate): number | `OUT_OF_RANGE` | null {\n\t\tconst breakpoint = update.indexOf(`=`)\n\t\tconst updateNumber = Number(update.substring(0, breakpoint))\n\t\tconst eventOffset = updateNumber - this.cacheUpdateNumber\n\t\tconst isFuture = eventOffset > 0\n\t\tif (isFuture) {\n\t\t\tif (eventOffset === 1) {\n\t\t\t\tthis.mode = `playback`\n\t\t\t\tconst innerUpdate = update.substring(breakpoint + 1) as SetUpdate\n\t\t\t\tthis.doStep(innerUpdate)\n\t\t\t\tthis.mode = `record`\n\t\t\t\tthis.cacheUpdateNumber = updateNumber\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.cacheUpdateNumber + 1\n\t\t} else {\n\t\t\tif (Math.abs(eventOffset) < this.cacheLimit) {\n\t\t\t\tconst eventIdx = this.cacheIdx + eventOffset\n\t\t\t\tconst cachedUpdate = this.cache[eventIdx]\n\t\t\t\tif (cachedUpdate === update) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\tthis.mode = `playback`\n\t\t\t\tlet done = false\n\t\t\t\twhile (!done) {\n\t\t\t\t\tthis.cacheIdx %= this.cacheLimit\n\t\t\t\t\tconst update = this.cache[this.cacheIdx]\n\t\t\t\t\tthis.cacheIdx--\n\t\t\t\t\tif (!update) {\n\t\t\t\t\t\treturn `OUT_OF_RANGE`\n\t\t\t\t\t}\n\t\t\t\t\tconst undoRes = this.undo(update)\n\t\t\t\t\tdone = this.cacheIdx === eventIdx - 1\n\t\t\t\t}\n\t\t\t\tconst innerUpdate = update.substring(breakpoint + 1) as SetUpdate\n\t\t\t\tthis.doStep(innerUpdate)\n\t\t\t\tthis.mode = `record`\n\t\t\t\tthis.cacheUpdateNumber = updateNumber\n\t\t\t\treturn null\n\t\t\t} else {\n\t\t\t\treturn `OUT_OF_RANGE`\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic undoStep(update: SetUpdate): void {\n\t\tconst breakpoint = update.indexOf(`:`)\n\t\tconst type = update.substring(0, breakpoint)\n\t\tconst value = update.substring(breakpoint + 1)\n\t\tswitch (type) {\n\t\t\tcase `add`:\n\t\t\t\tthis.delete(parseJson(value as Stringified<P>))\n\t\t\t\tbreak\n\t\t\tcase `del`:\n\t\t\t\tthis.add(parseJson(value as Stringified<P>))\n\t\t\t\tbreak\n\t\t\tcase `clear`: {\n\t\t\t\tconst values = JSON.parse(value) as P[]\n\t\t\t\tfor (const value of values) this.add(value)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase `tx`: {\n\t\t\t\tconst updates = value.split(`;`) as SetUpdate[]\n\t\t\t\tfor (let i = updates.length - 1; i >= 0; i--) {\n\t\t\t\t\tthis.undoStep(updates[i])\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic undo(update: NumberedSetUpdate): number | null {\n\t\tconst breakpoint = update.indexOf(`=`)\n\t\tconst updateNumber = Number(update.substring(0, breakpoint))\n\t\tif (updateNumber === this.cacheUpdateNumber) {\n\t\t\tthis.mode = `playback`\n\t\t\tconst innerUpdate = update.substring(breakpoint + 1) as SetUpdate\n\t\t\tthis.undoStep(innerUpdate)\n\t\t\tthis.mode = `record`\n\t\t\tthis.cacheUpdateNumber--\n\t\t\treturn null\n\t\t}\n\t\treturn this.cacheUpdateNumber\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/set-rtx.ts"],"names":["update","value"],"mappings":"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","sourcesContent":["import type { Transceiver, TransceiverMode } from \"atom.io/internal\"\nimport { Subject } from \"atom.io/internal\"\nimport type { Json, Stringified, primitive } from \"atom.io/json\"\nimport { parseJson, stringifyJson } from \"atom.io/json\"\n\nexport type SetUpdate =\n\t| `add:${string}`\n\t| `clear:${string}`\n\t| `del:${string}`\n\t| `tx:${string}`\nexport type NumberedSetUpdate = `${number}=${SetUpdate}`\n\nexport interface SetRTXJson<P extends primitive> extends Json.Object {\n\tmembers: P[]\n\tcache: (NumberedSetUpdate | null)[]\n\tcacheLimit: number\n\tcacheIdx: number\n\tcacheUpdateNumber: number\n}\nexport class SetRTX<P extends primitive>\n\textends Set<P>\n\timplements Transceiver<NumberedSetUpdate>\n{\n\tpublic mode: TransceiverMode = `record`\n\tpublic readonly subject = new Subject<SetUpdate>()\n\tpublic cacheLimit = 0\n\tpublic cache: (NumberedSetUpdate | null)[] = []\n\tpublic cacheIdx = -1\n\tpublic cacheUpdateNumber = -1\n\n\tpublic constructor(values?: Iterable<P>, cacheLimit = 0) {\n\t\tsuper(values)\n\t\tif (values instanceof SetRTX) {\n\t\t\tthis.parent = values\n\t\t\tthis.cacheUpdateNumber = values.cacheUpdateNumber\n\t\t}\n\t\tif (cacheLimit) {\n\t\t\tthis.cacheLimit = cacheLimit\n\t\t\tthis.cache = new Array(cacheLimit)\n\t\t\tthis.subscribe(`auto cache`, (update) => {\n\t\t\t\tthis.cacheIdx++\n\t\t\t\tthis.cacheIdx %= this.cacheLimit\n\t\t\t\tthis.cache[this.cacheIdx] = update\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic toJSON(): SetRTXJson<P> {\n\t\treturn {\n\t\t\tmembers: [...this],\n\t\t\tcache: this.cache,\n\t\t\tcacheLimit: this.cacheLimit,\n\t\t\tcacheIdx: this.cacheIdx,\n\t\t\tcacheUpdateNumber: this.cacheUpdateNumber,\n\t\t}\n\t}\n\n\tpublic static fromJSON<P extends primitive>(json: SetRTXJson<P>): SetRTX<P> {\n\t\tconst set = new SetRTX<P>(json.members, json.cacheLimit)\n\t\tset.cache = json.cache\n\t\tset.cacheIdx = json.cacheIdx\n\t\tset.cacheUpdateNumber = json.cacheUpdateNumber\n\t\treturn set\n\t}\n\n\tpublic add(value: P): this {\n\t\tif (this.mode === `record`) {\n\t\t\tthis.cacheUpdateNumber++\n\t\t\tthis.emit(`add:${stringifyJson<P>(value)}`)\n\t\t}\n\t\treturn super.add(value)\n\t}\n\n\tpublic clear(): void {\n\t\tif (this.mode === `record`) {\n\t\t\tthis.cacheUpdateNumber++\n\t\t\tthis.emit(`clear:${JSON.stringify([...this])}`)\n\t\t}\n\t\tsuper.clear()\n\t}\n\n\tpublic delete(value: P): boolean {\n\t\tif (this.mode === `record`) {\n\t\t\tthis.cacheUpdateNumber++\n\t\t\tthis.emit(`del:${stringifyJson<P>(value)}`)\n\t\t}\n\t\treturn super.delete(value)\n\t}\n\n\tpublic readonly parent: SetRTX<P> | null\n\tpublic child: SetRTX<P> | null = null\n\tpublic transactionUpdates: SetUpdate[] | null = null\n\tpublic transaction(run: (child: SetRTX<P>) => boolean): void {\n\t\tthis.mode = `transaction`\n\t\tthis.transactionUpdates = []\n\t\tthis.child = new SetRTX(this)\n\t\tconst unsubscribe = this.child._subscribe(`transaction`, (update) => {\n\t\t\tthis.transactionUpdates?.push(update)\n\t\t})\n\t\ttry {\n\t\t\tconst shouldCommit = run(this.child)\n\t\t\tif (shouldCommit) {\n\t\t\t\tthis.cacheUpdateNumber++\n\t\t\t\tthis.emit(`tx:${this.transactionUpdates.join(`;`)}`)\n\t\t\t\tfor (const update of this.transactionUpdates) {\n\t\t\t\t\tthis.doStep(update)\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (thrown) {\n\t\t\tconsole.error(`Failed to apply transaction: ${thrown}`)\n\t\t} finally {\n\t\t\tunsubscribe()\n\t\t\tthis.child = null\n\t\t\tthis.transactionUpdates = null\n\t\t\tthis.mode = `record`\n\t\t}\n\t}\n\n\tprotected _subscribe(\n\t\tkey: string,\n\t\tfn: (update: SetUpdate) => void,\n\t): () => void {\n\t\treturn this.subject.subscribe(key, fn)\n\t}\n\tpublic subscribe(\n\t\tkey: string,\n\t\tfn: (update: NumberedSetUpdate) => void,\n\t): () => void {\n\t\treturn this.subject.subscribe(key, (update) =>\n\t\t\tfn(`${this.cacheUpdateNumber}=${update}`),\n\t\t)\n\t}\n\n\tpublic emit(update: SetUpdate): void {\n\t\tthis.subject.next(update)\n\t}\n\n\tprivate doStep(update: SetUpdate): void {\n\t\tconst typeValueBreak = update.indexOf(`:`)\n\t\tconst type = update.substring(0, typeValueBreak)\n\t\tconst value = update.substring(typeValueBreak + 1)\n\t\tswitch (type) {\n\t\t\tcase `add`:\n\t\t\t\tthis.add(parseJson(value as Stringified<P>))\n\t\t\t\tbreak\n\t\t\tcase `clear`:\n\t\t\t\tthis.clear()\n\t\t\t\tbreak\n\t\t\tcase `del`:\n\t\t\t\tthis.delete(parseJson(value as Stringified<P>))\n\t\t\t\tbreak\n\t\t\tcase `tx`:\n\t\t\t\tfor (const update of value.split(`;`)) {\n\t\t\t\t\tthis.doStep(update as SetUpdate)\n\t\t\t\t}\n\t\t}\n\t}\n\n\tpublic getUpdateNumber(update: NumberedSetUpdate): number {\n\t\tconst breakpoint = update.indexOf(`=`)\n\t\treturn Number(update.substring(0, breakpoint))\n\t}\n\n\tpublic do(update: NumberedSetUpdate): number | `OUT_OF_RANGE` | null {\n\t\tconst breakpoint = update.indexOf(`=`)\n\t\tconst updateNumber = Number(update.substring(0, breakpoint))\n\t\tconst eventOffset = updateNumber - this.cacheUpdateNumber\n\t\tconst isFuture = eventOffset > 0\n\t\tif (isFuture) {\n\t\t\tif (eventOffset === 1) {\n\t\t\t\tthis.mode = `playback`\n\t\t\t\tconst innerUpdate = update.substring(breakpoint + 1) as SetUpdate\n\t\t\t\tthis.doStep(innerUpdate)\n\t\t\t\tthis.mode = `record`\n\t\t\t\tthis.cacheUpdateNumber = updateNumber\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.cacheUpdateNumber + 1\n\t\t}\n\t\tif (Math.abs(eventOffset) < this.cacheLimit) {\n\t\t\tconst eventIdx = this.cacheIdx + eventOffset\n\t\t\tconst cachedUpdate = this.cache[eventIdx]\n\t\t\tif (cachedUpdate === update) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tthis.mode = `playback`\n\t\t\tlet done = false\n\t\t\twhile (!done) {\n\t\t\t\tthis.cacheIdx %= this.cacheLimit\n\t\t\t\tconst update = this.cache[this.cacheIdx]\n\t\t\t\tthis.cacheIdx--\n\t\t\t\tif (!update) {\n\t\t\t\t\treturn `OUT_OF_RANGE`\n\t\t\t\t}\n\t\t\t\tconst undoRes = this.undo(update)\n\t\t\t\tdone = this.cacheIdx === eventIdx - 1\n\t\t\t}\n\t\t\tconst innerUpdate = update.substring(breakpoint + 1) as SetUpdate\n\t\t\tthis.doStep(innerUpdate)\n\t\t\tthis.mode = `record`\n\t\t\tthis.cacheUpdateNumber = updateNumber\n\t\t\treturn null\n\t\t}\n\t\treturn `OUT_OF_RANGE`\n\t}\n\n\tpublic undoStep(update: SetUpdate): void {\n\t\tconst breakpoint = update.indexOf(`:`)\n\t\tconst type = update.substring(0, breakpoint)\n\t\tconst value = update.substring(breakpoint + 1)\n\t\tswitch (type) {\n\t\t\tcase `add`:\n\t\t\t\tthis.delete(parseJson(value as Stringified<P>))\n\t\t\t\tbreak\n\t\t\tcase `del`:\n\t\t\t\tthis.add(parseJson(value as Stringified<P>))\n\t\t\t\tbreak\n\t\t\tcase `clear`: {\n\t\t\t\tconst values = JSON.parse(value) as P[]\n\t\t\t\tfor (const value of values) this.add(value)\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase `tx`: {\n\t\t\t\tconst updates = value.split(`;`) as SetUpdate[]\n\t\t\t\tfor (let i = updates.length - 1; i >= 0; i--) {\n\t\t\t\t\tthis.undoStep(updates[i])\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic undo(update: NumberedSetUpdate): number | null {\n\t\tconst breakpoint = update.indexOf(`=`)\n\t\tconst updateNumber = Number(update.substring(0, breakpoint))\n\t\tif (updateNumber === this.cacheUpdateNumber) {\n\t\t\tthis.mode = `playback`\n\t\t\tconst innerUpdate = update.substring(breakpoint + 1) as SetUpdate\n\t\t\tthis.undoStep(innerUpdate)\n\t\t\tthis.mode = `record`\n\t\t\tthis.cacheUpdateNumber--\n\t\t\treturn null\n\t\t}\n\t\treturn this.cacheUpdateNumber\n\t}\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"inputs":{"src/set-rtx.ts":{"bytes":6611,"imports":[{"path":"atom.io/internal","kind":"import-statement","external":true},{"path":"atom.io/json","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":26,"imports":[{"path":"src/set-rtx.ts","kind":"import-statement","original":"./set-rtx"}],"format":"esm"}},"outputs":{"dist/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":11743},"dist/index.cjs":{"imports":[{"path":"atom.io/internal","kind":"import-statement","external":true},{"path":"atom.io/json","kind":"import-statement","external":true}],"exports":["SetRTX"],"entryPoint":"src/index.ts","inputs":{"src/set-rtx.ts":{"bytesInOutput":5908},"src/index.ts":{"bytesInOutput":0}},"bytes":5947}}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"inputs":{"src/set-rtx.ts":{"bytes":6611,"imports":[{"path":"atom.io/internal","kind":"import-statement","external":true},{"path":"atom.io/json","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":26,"imports":[{"path":"src/set-rtx.ts","kind":"import-statement","original":"./set-rtx"}],"format":"esm"}},"outputs":{"dist/index.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":11743},"dist/index.js":{"imports":[{"path":"atom.io/internal","kind":"import-statement","external":true},{"path":"atom.io/json","kind":"import-statement","external":true}],"exports":["SetRTX"],"entryPoint":"src/index.ts","inputs":{"src/set-rtx.ts":{"bytesInOutput":5908},"src/index.ts":{"bytesInOutput":0}},"bytes":5947}}}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "atom.io-set-rtx",
|
|
3
|
+
"type": "module",
|
|
3
4
|
"private": true,
|
|
4
5
|
"main": "dist/index.js",
|
|
5
6
|
"types": "dist/index.d.ts",
|
|
@@ -7,9 +8,9 @@
|
|
|
7
8
|
"exports": {
|
|
8
9
|
".": {
|
|
9
10
|
"types": "./dist/index.d.ts",
|
|
10
|
-
"browser": "./dist/index.
|
|
11
|
-
"import": "./dist/index.
|
|
12
|
-
"require": "./dist/index.
|
|
11
|
+
"browser": "./dist/index.js",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
13
14
|
}
|
|
14
15
|
}
|
|
15
16
|
}
|
|
@@ -28,7 +28,7 @@ export class SetRTX<P extends primitive>
|
|
|
28
28
|
public cacheIdx = -1
|
|
29
29
|
public cacheUpdateNumber = -1
|
|
30
30
|
|
|
31
|
-
public constructor(values?:
|
|
31
|
+
public constructor(values?: Iterable<P>, cacheLimit = 0) {
|
|
32
32
|
super(values)
|
|
33
33
|
if (values instanceof SetRTX) {
|
|
34
34
|
this.parent = values
|
|
@@ -156,6 +156,11 @@ export class SetRTX<P extends primitive>
|
|
|
156
156
|
}
|
|
157
157
|
}
|
|
158
158
|
|
|
159
|
+
public getUpdateNumber(update: NumberedSetUpdate): number {
|
|
160
|
+
const breakpoint = update.indexOf(`=`)
|
|
161
|
+
return Number(update.substring(0, breakpoint))
|
|
162
|
+
}
|
|
163
|
+
|
|
159
164
|
public do(update: NumberedSetUpdate): number | `OUT_OF_RANGE` | null {
|
|
160
165
|
const breakpoint = update.indexOf(`=`)
|
|
161
166
|
const updateNumber = Number(update.substring(0, breakpoint))
|
|
@@ -171,34 +176,32 @@ export class SetRTX<P extends primitive>
|
|
|
171
176
|
return null
|
|
172
177
|
}
|
|
173
178
|
return this.cacheUpdateNumber + 1
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
return null
|
|
180
|
-
}
|
|
181
|
-
this.mode = `playback`
|
|
182
|
-
let done = false
|
|
183
|
-
while (!done) {
|
|
184
|
-
this.cacheIdx %= this.cacheLimit
|
|
185
|
-
const update = this.cache[this.cacheIdx]
|
|
186
|
-
this.cacheIdx--
|
|
187
|
-
if (!update) {
|
|
188
|
-
return `OUT_OF_RANGE`
|
|
189
|
-
}
|
|
190
|
-
const undoRes = this.undo(update)
|
|
191
|
-
done = this.cacheIdx === eventIdx - 1
|
|
192
|
-
}
|
|
193
|
-
const innerUpdate = update.substring(breakpoint + 1) as SetUpdate
|
|
194
|
-
this.doStep(innerUpdate)
|
|
195
|
-
this.mode = `record`
|
|
196
|
-
this.cacheUpdateNumber = updateNumber
|
|
179
|
+
}
|
|
180
|
+
if (Math.abs(eventOffset) < this.cacheLimit) {
|
|
181
|
+
const eventIdx = this.cacheIdx + eventOffset
|
|
182
|
+
const cachedUpdate = this.cache[eventIdx]
|
|
183
|
+
if (cachedUpdate === update) {
|
|
197
184
|
return null
|
|
198
|
-
} else {
|
|
199
|
-
return `OUT_OF_RANGE`
|
|
200
185
|
}
|
|
186
|
+
this.mode = `playback`
|
|
187
|
+
let done = false
|
|
188
|
+
while (!done) {
|
|
189
|
+
this.cacheIdx %= this.cacheLimit
|
|
190
|
+
const update = this.cache[this.cacheIdx]
|
|
191
|
+
this.cacheIdx--
|
|
192
|
+
if (!update) {
|
|
193
|
+
return `OUT_OF_RANGE`
|
|
194
|
+
}
|
|
195
|
+
const undoRes = this.undo(update)
|
|
196
|
+
done = this.cacheIdx === eventIdx - 1
|
|
197
|
+
}
|
|
198
|
+
const innerUpdate = update.substring(breakpoint + 1) as SetUpdate
|
|
199
|
+
this.doStep(innerUpdate)
|
|
200
|
+
this.mode = `record`
|
|
201
|
+
this.cacheUpdateNumber = updateNumber
|
|
202
|
+
return null
|
|
201
203
|
}
|
|
204
|
+
return `OUT_OF_RANGE`
|
|
202
205
|
}
|
|
203
206
|
|
|
204
207
|
public undoStep(update: SetUpdate): void {
|
package/data/dist/index.d.mts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import * as AtomIO from 'atom.io';
|
|
2
|
-
import { Store } from 'atom.io/internal';
|
|
3
|
-
import { Json, Stringified } from 'atom.io/json';
|
|
4
|
-
|
|
5
|
-
declare function dict<State, Key extends Json.Serializable>(findState: AtomIO.AtomFamily<State, Key> | AtomIO.ReadonlySelectorFamily<State, Key> | AtomIO.SelectorFamily<State, Key>, index: AtomIO.AtomToken<Key[]> | AtomIO.ReadonlySelectorToken<Key[]> | AtomIO.SelectorToken<Key[]>, store?: Store): AtomIO.ReadonlySelectorToken<{
|
|
6
|
-
[K in Stringified<Key>]: State;
|
|
7
|
-
}>;
|
|
8
|
-
|
|
9
|
-
declare function struct<Struct extends {
|
|
10
|
-
[key: string]: unknown;
|
|
11
|
-
}, Key extends string>(options: {
|
|
12
|
-
key: Key;
|
|
13
|
-
default: Struct;
|
|
14
|
-
}, store?: Store): [
|
|
15
|
-
{
|
|
16
|
-
[K in keyof Struct as `${Key}${Capitalize<K & string>}State`]: AtomIO.AtomToken<Struct[K]>;
|
|
17
|
-
},
|
|
18
|
-
AtomIO.ReadonlySelectorToken<Struct>
|
|
19
|
-
];
|
|
20
|
-
|
|
21
|
-
declare function structFamily<Struct extends object, Key extends string>(options: {
|
|
22
|
-
key: Key;
|
|
23
|
-
default: Struct;
|
|
24
|
-
}): [
|
|
25
|
-
{
|
|
26
|
-
[K in keyof Struct as `find${Capitalize<Key & string>}${Capitalize<K & string>}State`]: AtomIO.AtomFamily<Struct[K], string>;
|
|
27
|
-
},
|
|
28
|
-
AtomIO.ReadonlySelectorFamily<Struct>
|
|
29
|
-
];
|
|
30
|
-
|
|
31
|
-
type Loadable<T> = Promise<T> | T;
|
|
32
|
-
type Fated<T, E extends Error = Error> = Loadable<E | T>;
|
|
33
|
-
/**
|
|
34
|
-
* Utility for handling loadable values
|
|
35
|
-
* @param loadable Loadable value
|
|
36
|
-
* @param fallback Fallback value until Loadable is resolved
|
|
37
|
-
* @returns Fallback value if your loadable is a promise, otherwise the loadable's resolved value
|
|
38
|
-
*/
|
|
39
|
-
declare function until<T>(loadable: Loadable<T>, fallback: T): T;
|
|
40
|
-
|
|
41
|
-
export { type Fated, type Loadable, dict, struct, structFamily, until };
|
package/data/dist/index.mjs
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { createSelector, IMPLICIT, createAtom, createAtomFamily, createSelectorFamily } from 'atom.io/internal';
|
|
2
|
-
|
|
3
|
-
// src/dict.ts
|
|
4
|
-
function dict(findState, index, store = IMPLICIT.STORE) {
|
|
5
|
-
return createSelector(
|
|
6
|
-
{
|
|
7
|
-
key: `${findState.key}Dict`,
|
|
8
|
-
get: ({ get }) => {
|
|
9
|
-
const keys = get(index);
|
|
10
|
-
return keys.reduce((acc, key) => {
|
|
11
|
-
acc[key] = get(findState(key));
|
|
12
|
-
return acc;
|
|
13
|
-
}, {});
|
|
14
|
-
}
|
|
15
|
-
},
|
|
16
|
-
void 0,
|
|
17
|
-
store
|
|
18
|
-
);
|
|
19
|
-
}
|
|
20
|
-
var capitalize = (str) => str[0].toUpperCase() + str.slice(1);
|
|
21
|
-
function struct(options, store = IMPLICIT.STORE) {
|
|
22
|
-
const atoms = Object.keys(options.default).reduce((acc, key) => {
|
|
23
|
-
const atomName = options.key + capitalize(key) + `State`;
|
|
24
|
-
acc[atomName] = createAtom(
|
|
25
|
-
{
|
|
26
|
-
key: `${options.key}.${key}`,
|
|
27
|
-
default: options.default[key]
|
|
28
|
-
},
|
|
29
|
-
void 0,
|
|
30
|
-
store
|
|
31
|
-
);
|
|
32
|
-
return acc;
|
|
33
|
-
}, {});
|
|
34
|
-
const structState = createSelector(
|
|
35
|
-
{
|
|
36
|
-
key: options.key,
|
|
37
|
-
get: ({ get }) => {
|
|
38
|
-
return Object.keys(options.default).reduce((acc, key) => {
|
|
39
|
-
acc[key] = get(atoms[options.key + capitalize(key) + `State`]);
|
|
40
|
-
return acc;
|
|
41
|
-
}, {});
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
|
-
void 0,
|
|
45
|
-
store
|
|
46
|
-
);
|
|
47
|
-
return [atoms, structState];
|
|
48
|
-
}
|
|
49
|
-
var capitalize2 = (str) => str[0].toUpperCase() + str.slice(1);
|
|
50
|
-
var nameFamily = (topKey, subKey) => `find` + capitalize2(topKey) + capitalize2(subKey) + `State`;
|
|
51
|
-
function structFamily(options) {
|
|
52
|
-
const atoms = Object.keys(options.default).reduce((acc, subKey) => {
|
|
53
|
-
const atomFamilyName = nameFamily(options.key, subKey);
|
|
54
|
-
acc[atomFamilyName] = createAtomFamily({
|
|
55
|
-
key: `${options.key}.${subKey}`,
|
|
56
|
-
default: options.default[subKey]
|
|
57
|
-
});
|
|
58
|
-
return acc;
|
|
59
|
-
}, {});
|
|
60
|
-
const findStructState = createSelectorFamily({
|
|
61
|
-
key: options.key,
|
|
62
|
-
get: (id) => ({ get }) => {
|
|
63
|
-
return Object.keys(options.default).reduce((acc, subKey) => {
|
|
64
|
-
acc[subKey] = get(atoms[nameFamily(options.key, subKey)](id));
|
|
65
|
-
return acc;
|
|
66
|
-
}, {});
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
return [atoms, findStructState];
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// src/until.ts
|
|
73
|
-
function until(loadable, fallback) {
|
|
74
|
-
if (loadable instanceof Promise) {
|
|
75
|
-
return fallback;
|
|
76
|
-
}
|
|
77
|
-
return loadable;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export { dict, struct, structFamily, until };
|
|
81
|
-
//# sourceMappingURL=out.js.map
|
|
82
|
-
//# sourceMappingURL=index.mjs.map
|
package/data/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dict.ts","../src/struct.ts","../src/struct-family.ts","../src/until.ts"],"names":["IMPLICIT","createSelector","capitalize"],"mappings":";AAEA,SAAS,UAAU,sBAAsB;AAGlC,SAAS,KACf,WAIA,OAIA,QAAe,SAAS,OAC2C;AACnE,SAAO;AAAA,IACN;AAAA,MACC,KAAK,GAAG,UAAU,GAAG;AAAA,MACrB,KAAK,CAAC,EAAE,IAAI,MAAM;AACjB,cAAM,OAAO,IAAI,KAAK;AACtB,eAAO,KAAK,OAAO,CAAC,KAAK,QAAQ;AAChC,cAAI,GAAG,IAAI,IAAI,UAAU,GAAG,CAAC;AAC7B,iBAAO;AAAA,QACR,GAAG,CAAC,CAAQ;AAAA,MACb;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;;;AC5BA,SAAS,YAAAA,iBAAgB;AAEzB,SAAS,YAAY,kBAAAC,uBAAsB;AAE3C,IAAM,aAAa,CAAC,QAAgB,IAAI,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAE/D,SAAS,OAIf,SAIA,QAAeD,UAAS,OASvB;AACD,QAAM,QAKF,OAAO,KAAK,QAAQ,OAAO,EAAE,OAAO,CAAC,KAAK,QAAQ;AACrD,UAAM,WAAW,QAAQ,MAAM,WAAW,GAAG,IAAI;AACjD,QAAI,QAAQ,IAAI;AAAA,MACf;AAAA,QACC,KAAK,GAAG,QAAQ,GAAG,IAAI,GAAG;AAAA,QAC1B,SAAS,QAAQ,QAAQ,GAAG;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,WAAO;AAAA,EACR,GAAG,CAAC,CAAQ;AACZ,QAAM,cAAcC;AAAA,IACnB;AAAA,MACC,KAAK,QAAQ;AAAA,MACb,KAAK,CAAC,EAAE,IAAI,MAAM;AACjB,eAAO,OAAO,KAAK,QAAQ,OAAO,EAAE,OAAO,CAAC,KAAK,QAAQ;AACxD,cAAI,GAAG,IAAI,IAAI,MAAM,QAAQ,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC;AAC7D,iBAAO;AAAA,QACR,GAAG,CAAC,CAAQ;AAAA,MACb;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACA,SAAO,CAAC,OAAO,WAAW;AAC3B;;;ACxDA,SAAS,kBAAkB,4BAA4B;AAEvD,IAAMC,cAAa,CAAC,QAAgB,IAAI,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AACtE,IAAM,aAAa,CAAC,QAAgB,WACnC,SAASA,YAAW,MAAM,IAAIA,YAAW,MAAM,IAAI;AAE7C,SAAS,aAGd,SAWA;AACD,QAAM,QAKF,OAAO,KAAK,QAAQ,OAAO,EAAE,OAAO,CAAC,KAAK,WAAW;AACxD,UAAM,iBAAiB,WAAW,QAAQ,KAAK,MAAM;AACrD,QAAI,cAAc,IAAI,iBAAiB;AAAA,MACtC,KAAK,GAAG,QAAQ,GAAG,IAAI,MAAM;AAAA,MAC7B,SAAU,QAAQ,QAAgB,MAAM;AAAA,IACzC,CAAC;AACD,WAAO;AAAA,EACR,GAAG,CAAC,CAAQ;AACZ,QAAM,kBAAkB,qBAAqB;AAAA,IAC5C,KAAK,QAAQ;AAAA,IACb,KACC,CAAC,OACD,CAAC,EAAE,IAAI,MAAM;AACZ,aAAO,OAAO,KAAK,QAAQ,OAAO,EAAE,OAAO,CAAC,KAAK,WAAW;AAC3D,YAAI,MAAM,IAAI,IAAK,MAAc,WAAW,QAAQ,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC;AACrE,eAAO;AAAA,MACR,GAAG,CAAC,CAAQ;AAAA,IACb;AAAA,EACF,CAAC;AACD,SAAO,CAAC,OAAO,eAAe;AAC/B;;;ACtCO,SAAS,MAAS,UAAuB,UAAgB;AAC/D,MAAI,oBAAoB,SAAS;AAChC,WAAO;AAAA,EACR;AACA,SAAO;AACR","sourcesContent":["import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, createSelector } from \"atom.io/internal\"\nimport type { Json, Stringified } from \"atom.io/json\"\n\nexport function dict<State, Key extends Json.Serializable>(\n\tfindState:\n\t\t| AtomIO.AtomFamily<State, Key>\n\t\t| AtomIO.ReadonlySelectorFamily<State, Key>\n\t\t| AtomIO.SelectorFamily<State, Key>,\n\tindex:\n\t\t| AtomIO.AtomToken<Key[]>\n\t\t| AtomIO.ReadonlySelectorToken<Key[]>\n\t\t| AtomIO.SelectorToken<Key[]>,\n\tstore: Store = IMPLICIT.STORE,\n): AtomIO.ReadonlySelectorToken<{ [K in Stringified<Key>]: State }> {\n\treturn createSelector(\n\t\t{\n\t\t\tkey: `${findState.key}Dict`,\n\t\t\tget: ({ get }) => {\n\t\t\t\tconst keys = get(index)\n\t\t\t\treturn keys.reduce((acc, key) => {\n\t\t\t\t\tacc[key] = get(findState(key))\n\t\t\t\t\treturn acc\n\t\t\t\t}, {} as any)\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t\tstore,\n\t)\n}\n","import type * as AtomIO from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { IMPLICIT } from \"atom.io/internal\"\n\nimport { createAtom, createSelector } from \"atom.io/internal\"\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\n\nexport function struct<\n\tStruct extends { [key: string]: unknown },\n\tKey extends string,\n>(\n\toptions: {\n\t\tkey: Key\n\t\tdefault: Struct\n\t},\n\tstore: Store = IMPLICIT.STORE,\n): [\n\t{\n\t\t[K in\n\t\t\tkeyof Struct as `${Key}${Capitalize<K & string>}State`]: AtomIO.AtomToken<\n\t\t\tStruct[K]\n\t\t>\n\t},\n\tAtomIO.ReadonlySelectorToken<Struct>,\n] {\n\tconst atoms: {\n\t\t[K in\n\t\t\tkeyof Struct as `${Key}${Capitalize<K & string>}State`]: AtomIO.AtomToken<\n\t\t\tStruct[K]\n\t\t>\n\t} = Object.keys(options.default).reduce((acc, key) => {\n\t\tconst atomName = options.key + capitalize(key) + `State`\n\t\tacc[atomName] = createAtom(\n\t\t\t{\n\t\t\t\tkey: `${options.key}.${key}`,\n\t\t\t\tdefault: options.default[key],\n\t\t\t},\n\t\t\tundefined,\n\t\t\tstore,\n\t\t)\n\t\treturn acc\n\t}, {} as any)\n\tconst structState = createSelector(\n\t\t{\n\t\t\tkey: options.key,\n\t\t\tget: ({ get }) => {\n\t\t\t\treturn Object.keys(options.default).reduce((acc, key) => {\n\t\t\t\t\tacc[key] = get(atoms[options.key + capitalize(key) + `State`])\n\t\t\t\t\treturn acc\n\t\t\t\t}, {} as any)\n\t\t\t},\n\t\t},\n\t\tundefined,\n\t\tstore,\n\t)\n\treturn [atoms, structState]\n}\n","import type * as AtomIO from \"atom.io\"\nimport { createAtomFamily, createSelectorFamily } from \"atom.io/internal\"\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\nconst nameFamily = (topKey: string, subKey: string) =>\n\t`find` + capitalize(topKey) + capitalize(subKey) + `State`\n\nexport function structFamily<\n\tStruct extends object,\n\tKey extends string,\n>(options: {\n\tkey: Key\n\tdefault: Struct\n}): [\n\t{\n\t\t[K in\n\t\t\tkeyof Struct as `find${Capitalize<Key & string>}${Capitalize<\n\t\t\t\tK & string\n\t\t\t>}State`]: AtomIO.AtomFamily<Struct[K], string>\n\t},\n\tAtomIO.ReadonlySelectorFamily<Struct>,\n] {\n\tconst atoms: {\n\t\t[K in\n\t\t\tkeyof Struct as `find${Capitalize<Key & string>}${Capitalize<\n\t\t\t\tK & string\n\t\t\t>}State`]: AtomIO.AtomFamily<Struct[K], string>\n\t} = Object.keys(options.default).reduce((acc, subKey) => {\n\t\tconst atomFamilyName = nameFamily(options.key, subKey)\n\t\tacc[atomFamilyName] = createAtomFamily({\n\t\t\tkey: `${options.key}.${subKey}`,\n\t\t\tdefault: (options.default as any)[subKey],\n\t\t})\n\t\treturn acc\n\t}, {} as any)\n\tconst findStructState = createSelectorFamily({\n\t\tkey: options.key,\n\t\tget:\n\t\t\t(id) =>\n\t\t\t({ get }) => {\n\t\t\t\treturn Object.keys(options.default).reduce((acc, subKey) => {\n\t\t\t\t\tacc[subKey] = get((atoms as any)[nameFamily(options.key, subKey)](id))\n\t\t\t\t\treturn acc\n\t\t\t\t}, {} as any)\n\t\t\t},\n\t})\n\treturn [atoms, findStructState]\n}\n","export type Loadable<T> = Promise<T> | T\nexport type Fated<T, E extends Error = Error> = Loadable<E | T>\n\n/**\n * Utility for handling loadable values\n * @param loadable Loadable value\n * @param fallback Fallback value until Loadable is resolved\n * @returns Fallback value if your loadable is a promise, otherwise the loadable's resolved value\n */\nexport function until<T>(loadable: Loadable<T>, fallback: T): T {\n\tif (loadable instanceof Promise) {\n\t\treturn fallback\n\t}\n\treturn loadable\n}\n"]}
|
package/dist/index.mjs
DELETED
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
import * as Internal from 'atom.io/internal';
|
|
2
|
-
import { createMutableAtom, createAtom, createMutableAtomFamily, createAtomFamily, createSelector, createSelectorFamily, Store, transaction__INTERNAL, timeline__INTERNAL, undo__INTERNAL, redo__INTERNAL, withdraw, subscribeToRootAtoms, IMPLICIT } from 'atom.io/internal';
|
|
3
|
-
export { deleteAtom } from 'atom.io/internal';
|
|
4
|
-
|
|
5
|
-
// src/atom.ts
|
|
6
|
-
function atom(options) {
|
|
7
|
-
if (`mutable` in options) {
|
|
8
|
-
return createMutableAtom(options);
|
|
9
|
-
}
|
|
10
|
-
return createAtom(options);
|
|
11
|
-
}
|
|
12
|
-
function atomFamily(options) {
|
|
13
|
-
if (`mutable` in options) {
|
|
14
|
-
return createMutableAtomFamily(options);
|
|
15
|
-
}
|
|
16
|
-
return createAtomFamily(options);
|
|
17
|
-
}
|
|
18
|
-
var getState = (token, store = Internal.IMPLICIT.STORE) => {
|
|
19
|
-
var _a;
|
|
20
|
-
const state = (_a = Internal.withdraw(token, store)) != null ? _a : Internal.withdrawNewFamilyMember(token, store);
|
|
21
|
-
if (state === void 0) {
|
|
22
|
-
throw new NotFoundError(token, store);
|
|
23
|
-
}
|
|
24
|
-
return Internal.getState__INTERNAL(state, store);
|
|
25
|
-
};
|
|
26
|
-
var setState = (token, value, store = Internal.IMPLICIT.STORE) => {
|
|
27
|
-
var _a;
|
|
28
|
-
const rejection = Internal.openOperation(token, store);
|
|
29
|
-
if (rejection) {
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
const state = (_a = Internal.withdraw(token, store)) != null ? _a : Internal.withdrawNewFamilyMember(token, store);
|
|
33
|
-
if (state === void 0) {
|
|
34
|
-
throw new NotFoundError(token, store);
|
|
35
|
-
}
|
|
36
|
-
Internal.setState__INTERNAL(state, value, store);
|
|
37
|
-
Internal.closeOperation(store);
|
|
38
|
-
};
|
|
39
|
-
var capitalize = (str) => str[0].toUpperCase() + str.slice(1);
|
|
40
|
-
var NotFoundError = class extends Error {
|
|
41
|
-
constructor(token, store) {
|
|
42
|
-
super(
|
|
43
|
-
`${capitalize(token.type)} "${token.key}" not found in store "${store.config.name}".`
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
// src/logger.ts
|
|
49
|
-
var LOG_LEVELS = [`info`, `warn`, `error`];
|
|
50
|
-
var simpleLog = (logLevel) => (icon, tokenType, tokenKey, message, ...rest) => {
|
|
51
|
-
console[logLevel](`${icon} ${tokenType} "${tokenKey}" ${message}`, ...rest);
|
|
52
|
-
};
|
|
53
|
-
var simpleLogger = {
|
|
54
|
-
error: simpleLog(`error`),
|
|
55
|
-
info: simpleLog(`info`),
|
|
56
|
-
warn: simpleLog(`warn`)
|
|
57
|
-
};
|
|
58
|
-
var AtomIOLogger = class {
|
|
59
|
-
constructor(logLevel, filter, logger = simpleLogger) {
|
|
60
|
-
this.logLevel = logLevel;
|
|
61
|
-
this.filter = filter;
|
|
62
|
-
this.logger = logger;
|
|
63
|
-
this.error = (...args) => {
|
|
64
|
-
var _a, _b;
|
|
65
|
-
if (((_b = (_a = this.filter) == null ? void 0 : _a.call(this, ...args)) != null ? _b : true) && this.logLevel !== null) {
|
|
66
|
-
this.logger.error(...args);
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
this.info = (...args) => {
|
|
70
|
-
var _a, _b;
|
|
71
|
-
if (((_b = (_a = this.filter) == null ? void 0 : _a.call(this, ...args)) != null ? _b : true) && this.logLevel === `info`) {
|
|
72
|
-
this.logger.info(...args);
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
this.warn = (...args) => {
|
|
76
|
-
var _a, _b;
|
|
77
|
-
if (((_b = (_a = this.filter) == null ? void 0 : _a.call(this, ...args)) != null ? _b : true) && this.logLevel !== `error` && this.logLevel !== null) {
|
|
78
|
-
this.logger.warn(...args);
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
function selector(options) {
|
|
84
|
-
return createSelector(options);
|
|
85
|
-
}
|
|
86
|
-
function selectorFamily(options) {
|
|
87
|
-
return createSelectorFamily(options);
|
|
88
|
-
}
|
|
89
|
-
var Silo = class {
|
|
90
|
-
constructor(name, fromStore = null) {
|
|
91
|
-
const s = new Store(name, fromStore);
|
|
92
|
-
this.store = s;
|
|
93
|
-
this.atom = (options) => {
|
|
94
|
-
if (`mutable` in options) {
|
|
95
|
-
return createMutableAtom(options, s);
|
|
96
|
-
}
|
|
97
|
-
return createAtom(options, void 0, s);
|
|
98
|
-
};
|
|
99
|
-
this.atomFamily = (options) => {
|
|
100
|
-
if (`mutable` in options) {
|
|
101
|
-
return createMutableAtomFamily(options, s);
|
|
102
|
-
}
|
|
103
|
-
return createAtomFamily(options, s);
|
|
104
|
-
};
|
|
105
|
-
this.selector = (options) => createSelector(options, void 0, s);
|
|
106
|
-
this.selectorFamily = (options) => createSelectorFamily(options, s);
|
|
107
|
-
this.transaction = (options) => transaction__INTERNAL(options, s);
|
|
108
|
-
this.timeline = (options) => timeline__INTERNAL(options, s);
|
|
109
|
-
this.getState = (token) => getState(token, s);
|
|
110
|
-
this.setState = (token, newValue) => setState(token, newValue, s);
|
|
111
|
-
this.subscribe = (token, handler, key) => subscribe(token, handler, key, s);
|
|
112
|
-
this.undo = (token) => undo__INTERNAL(token, s);
|
|
113
|
-
this.redo = (token) => redo__INTERNAL(token, s);
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
function subscribe(token, handleUpdate, key = Math.random().toString(36).slice(2), store = IMPLICIT.STORE) {
|
|
117
|
-
const state = withdraw(token, store);
|
|
118
|
-
if (state === void 0) {
|
|
119
|
-
throw new Error(
|
|
120
|
-
`State "${token.key}" not found in this store. Did you forget to initialize with the "atom" or "selector" function?`
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
const unsubFunction = state.subject.subscribe(key, handleUpdate);
|
|
124
|
-
store.logger.info(`\u{1F440}`, state.type, state.key, `Adding subscription "${key}"`);
|
|
125
|
-
const dependencyUnsubFunctions = state.type !== `atom` ? subscribeToRootAtoms(state, store) : null;
|
|
126
|
-
const unsubscribe = dependencyUnsubFunctions === null ? () => {
|
|
127
|
-
store.logger.info(
|
|
128
|
-
`\u{1F648}`,
|
|
129
|
-
state.type,
|
|
130
|
-
state.key,
|
|
131
|
-
`Removing subscription "${key}"`
|
|
132
|
-
);
|
|
133
|
-
unsubFunction();
|
|
134
|
-
} : () => {
|
|
135
|
-
store.logger.info(
|
|
136
|
-
`\u{1F648}`,
|
|
137
|
-
state.type,
|
|
138
|
-
state.key,
|
|
139
|
-
`Removing subscription "${key}"`
|
|
140
|
-
);
|
|
141
|
-
unsubFunction();
|
|
142
|
-
for (const unsubFromDependency of dependencyUnsubFunctions) {
|
|
143
|
-
unsubFromDependency();
|
|
144
|
-
}
|
|
145
|
-
};
|
|
146
|
-
return unsubscribe;
|
|
147
|
-
}
|
|
148
|
-
var subscribeToTransaction = (token, handleUpdate, key = Math.random().toString(36).slice(2), store = IMPLICIT.STORE) => {
|
|
149
|
-
const tx = withdraw(token, store);
|
|
150
|
-
if (tx === void 0) {
|
|
151
|
-
throw new Error(
|
|
152
|
-
`Cannot subscribe to transaction "${token.key}": transaction not found in store "${store.config.name}".`
|
|
153
|
-
);
|
|
154
|
-
}
|
|
155
|
-
store.logger.info(
|
|
156
|
-
`\u{1F440}`,
|
|
157
|
-
`transaction`,
|
|
158
|
-
token.key,
|
|
159
|
-
`Adding subscription "${key}"`
|
|
160
|
-
);
|
|
161
|
-
const unsubscribe = tx.subject.subscribe(key, handleUpdate);
|
|
162
|
-
return () => {
|
|
163
|
-
store.logger.info(
|
|
164
|
-
`\u{1F648}`,
|
|
165
|
-
`transaction`,
|
|
166
|
-
token.key,
|
|
167
|
-
`Removing subscription "${key}"`
|
|
168
|
-
);
|
|
169
|
-
unsubscribe();
|
|
170
|
-
};
|
|
171
|
-
};
|
|
172
|
-
var subscribeToTimeline = (token, handleUpdate, key = Math.random().toString(36).slice(2), store = IMPLICIT.STORE) => {
|
|
173
|
-
const tl = withdraw(token, store);
|
|
174
|
-
if (tl === void 0) {
|
|
175
|
-
throw new Error(
|
|
176
|
-
`Cannot subscribe to timeline "${token.key}": timeline not found in store "${store.config.name}".`
|
|
177
|
-
);
|
|
178
|
-
}
|
|
179
|
-
store.logger.info(`\u{1F440}`, `timeline`, token.key, `Adding subscription "${key}"`);
|
|
180
|
-
const unsubscribe = tl.subject.subscribe(key, handleUpdate);
|
|
181
|
-
return () => {
|
|
182
|
-
store.logger.info(
|
|
183
|
-
`\u{1F648}`,
|
|
184
|
-
`timeline`,
|
|
185
|
-
token.key,
|
|
186
|
-
`Removing subscription "${key}" from timeline`
|
|
187
|
-
);
|
|
188
|
-
unsubscribe();
|
|
189
|
-
};
|
|
190
|
-
};
|
|
191
|
-
var timeline = (options) => {
|
|
192
|
-
return timeline__INTERNAL(options);
|
|
193
|
-
};
|
|
194
|
-
var redo = (token) => {
|
|
195
|
-
redo__INTERNAL(token, IMPLICIT.STORE);
|
|
196
|
-
};
|
|
197
|
-
var undo = (token) => {
|
|
198
|
-
undo__INTERNAL(token, IMPLICIT.STORE);
|
|
199
|
-
};
|
|
200
|
-
function transaction(options) {
|
|
201
|
-
return transaction__INTERNAL(options);
|
|
202
|
-
}
|
|
203
|
-
var runTransaction = (token, store = IMPLICIT.STORE) => (...parameters) => {
|
|
204
|
-
const tx = withdraw(token, store);
|
|
205
|
-
if (tx) {
|
|
206
|
-
return tx.run(...parameters);
|
|
207
|
-
}
|
|
208
|
-
throw new Error(
|
|
209
|
-
`Cannot run transaction "${token.key}": transaction not found in store "${store.config.name}".`
|
|
210
|
-
);
|
|
211
|
-
};
|
|
212
|
-
|
|
213
|
-
export { AtomIOLogger, LOG_LEVELS, NotFoundError, Silo, atom, atomFamily, getState, redo, runTransaction, selector, selectorFamily, setState, simpleLog, simpleLogger, subscribe, subscribeToTimeline, subscribeToTransaction, timeline, transaction, undo };
|
|
214
|
-
//# sourceMappingURL=out.js.map
|
|
215
|
-
//# sourceMappingURL=index.mjs.map
|