atom.io 0.12.1 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -3
- package/dist/index.d.ts +6 -3
- package/dist/index.js.map +1 -1
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/internal/dist/index.cjs +1561 -1512
- package/internal/dist/index.cjs.map +1 -1
- package/internal/dist/index.d.cts +24 -14
- package/internal/dist/index.d.ts +24 -14
- package/internal/dist/index.js +1560 -1513
- package/internal/dist/index.js.map +1 -1
- package/internal/dist/metafile-cjs.json +1 -1
- package/internal/dist/metafile-esm.json +1 -1
- package/internal/src/atom/create-atom.ts +4 -4
- package/internal/src/atom/delete-atom.ts +11 -11
- package/internal/src/atom/is-default.ts +5 -5
- package/internal/src/caching.ts +12 -10
- package/internal/src/families/create-atom-family.ts +3 -3
- package/internal/src/families/create-readonly-selector-family.ts +3 -3
- package/internal/src/families/create-selector-family.ts +4 -4
- package/internal/src/index.ts +1 -0
- package/internal/src/keys.ts +4 -4
- package/internal/src/lazy-map.ts +6 -2
- package/internal/src/lineage.ts +18 -0
- package/internal/src/mutable/create-mutable-atom.ts +5 -4
- package/internal/src/mutable/get-json-family.ts +3 -3
- package/internal/src/mutable/tracker.ts +13 -10
- package/internal/src/operation.ts +19 -19
- package/internal/src/selector/create-read-write-selector.ts +5 -4
- package/internal/src/selector/create-readonly-selector.ts +4 -3
- package/internal/src/selector/create-selector.ts +6 -6
- package/internal/src/selector/delete-selector.ts +10 -10
- package/internal/src/selector/get-selector-dependency-keys.ts +2 -2
- package/internal/src/selector/register-selector.ts +4 -4
- package/internal/src/selector/update-selector-atoms.ts +2 -2
- package/internal/src/set-state/copy-mutable-if-needed.ts +4 -3
- package/internal/src/set-state/copy-mutable-in-transaction.ts +10 -16
- package/internal/src/set-state/copy-mutable-into-new-store.ts +1 -1
- package/internal/src/set-state/evict-downstream.ts +5 -5
- package/internal/src/set-state/set-atom.ts +6 -1
- package/internal/src/set-state/stow-update.ts +7 -2
- package/internal/src/store/store.ts +31 -24
- package/internal/src/store/withdraw-new-family-member.ts +3 -4
- package/internal/src/store/withdraw.ts +58 -59
- package/internal/src/subject.ts +14 -0
- package/internal/src/subscribe/recall-state.ts +5 -5
- package/internal/src/timeline/add-atom-to-timeline.ts +37 -27
- package/internal/src/timeline/create-timeline.ts +6 -8
- package/internal/src/timeline/time-travel.ts +22 -4
- package/internal/src/transaction/abort-transaction.ts +5 -3
- package/internal/src/transaction/apply-transaction.ts +80 -58
- package/internal/src/transaction/build-transaction.ts +33 -23
- package/internal/src/transaction/create-transaction.ts +6 -9
- package/internal/src/transaction/index.ts +2 -10
- package/internal/src/transaction/redo-transaction.ts +15 -10
- package/internal/src/transaction/undo-transaction.ts +15 -16
- package/introspection/dist/index.cjs +2 -2
- package/introspection/dist/index.cjs.map +1 -1
- package/introspection/dist/index.js +3 -3
- package/introspection/dist/index.js.map +1 -1
- package/introspection/src/attach-atom-index.ts +2 -2
- package/introspection/src/attach-selector-index.ts +2 -2
- package/package.json +3 -3
- package/react-devtools/dist/index.cjs +22 -8
- package/react-devtools/dist/index.cjs.map +1 -1
- package/react-devtools/dist/index.d.cts +17 -9
- package/react-devtools/dist/index.d.ts +17 -9
- package/react-devtools/dist/index.js +22 -8
- package/react-devtools/dist/index.js.map +1 -1
- package/react-devtools/dist/metafile-cjs.json +1 -1
- package/react-devtools/dist/metafile-esm.json +1 -1
- package/react-devtools/src/Updates.tsx +22 -10
- package/src/transaction.ts +7 -2
- package/transceivers/set-rtx/dist/index.cjs.map +1 -1
- package/transceivers/set-rtx/dist/index.d.cts +2 -2
- package/transceivers/set-rtx/dist/index.d.ts +2 -2
- package/transceivers/set-rtx/dist/index.js.map +1 -1
- package/transceivers/set-rtx/dist/metafile-cjs.json +1 -1
- package/transceivers/set-rtx/dist/metafile-esm.json +1 -1
- package/transceivers/set-rtx/src/set-rtx.ts +3 -3
|
@@ -9,10 +9,10 @@ import type { Json } from "atom.io/json"
|
|
|
9
9
|
import { stringifyJson } from "atom.io/json"
|
|
10
10
|
|
|
11
11
|
import { createAtom } from "../atom"
|
|
12
|
+
import { newest } from "../lineage"
|
|
12
13
|
import { deposit, withdraw } from "../store"
|
|
13
14
|
import type { Store } from "../store"
|
|
14
15
|
import { Subject } from "../subject"
|
|
15
|
-
import { target } from "../transaction"
|
|
16
16
|
|
|
17
17
|
export function createAtomFamily<T, K extends Json.Serializable>(
|
|
18
18
|
options: AtomFamilyOptions<T, K>,
|
|
@@ -54,7 +54,7 @@ export function createAtomFamily<T, K extends Json.Serializable>(
|
|
|
54
54
|
subject,
|
|
55
55
|
} as const,
|
|
56
56
|
)
|
|
57
|
-
const
|
|
58
|
-
|
|
57
|
+
const target = newest(store)
|
|
58
|
+
target.families.set(options.key, atomFamily)
|
|
59
59
|
return atomFamily
|
|
60
60
|
}
|
|
@@ -7,23 +7,23 @@ import type {
|
|
|
7
7
|
import type { Json } from "atom.io/json"
|
|
8
8
|
import { stringifyJson } from "atom.io/json"
|
|
9
9
|
|
|
10
|
+
import { newest } from "../lineage"
|
|
10
11
|
import { createSelector } from "../selector"
|
|
11
12
|
import { type Store, deposit } from "../store"
|
|
12
13
|
import { Subject } from "../subject"
|
|
13
|
-
import { target } from "../transaction"
|
|
14
14
|
|
|
15
15
|
export function createReadonlySelectorFamily<T, K extends Json.Serializable>(
|
|
16
16
|
options: ReadonlySelectorFamilyOptions<T, K>,
|
|
17
17
|
store: Store,
|
|
18
18
|
): ReadonlySelectorFamily<T, K> {
|
|
19
|
-
const core = target(store)
|
|
20
19
|
const subject = new Subject<ReadonlySelectorToken<T>>()
|
|
21
20
|
return Object.assign(
|
|
22
21
|
(key: K): ReadonlySelectorToken<T> => {
|
|
22
|
+
const target = newest(store)
|
|
23
23
|
const subKey = stringifyJson(key)
|
|
24
24
|
const family: FamilyMetadata = { key: options.key, subKey }
|
|
25
25
|
const fullKey = `${options.key}(${subKey})`
|
|
26
|
-
const existing =
|
|
26
|
+
const existing = target.readonlySelectors.get(fullKey)
|
|
27
27
|
if (existing) {
|
|
28
28
|
return deposit(existing)
|
|
29
29
|
}
|
|
@@ -9,11 +9,11 @@ import type {
|
|
|
9
9
|
import type { Json } from "atom.io/json"
|
|
10
10
|
import { stringifyJson } from "atom.io/json"
|
|
11
11
|
|
|
12
|
+
import { newest } from "../lineage"
|
|
12
13
|
import { createSelector } from "../selector"
|
|
13
14
|
import type { Store } from "../store"
|
|
14
15
|
import { deposit } from "../store"
|
|
15
16
|
import { Subject } from "../subject"
|
|
16
|
-
import { target } from "../transaction"
|
|
17
17
|
import { createReadonlySelectorFamily } from "./create-readonly-selector-family"
|
|
18
18
|
|
|
19
19
|
export function createSelectorFamily<T, K extends Json.Serializable>(
|
|
@@ -33,7 +33,7 @@ export function createSelectorFamily<T, K extends Json.Serializable>(
|
|
|
33
33
|
if (isReadonly) {
|
|
34
34
|
return createReadonlySelectorFamily(options, store)
|
|
35
35
|
}
|
|
36
|
-
const
|
|
36
|
+
const target = newest(store)
|
|
37
37
|
const subject = new Subject<SelectorToken<T>>()
|
|
38
38
|
|
|
39
39
|
const selectorFamily = Object.assign(
|
|
@@ -41,7 +41,7 @@ export function createSelectorFamily<T, K extends Json.Serializable>(
|
|
|
41
41
|
const subKey = stringifyJson(key)
|
|
42
42
|
const family: FamilyMetadata = { key: options.key, subKey }
|
|
43
43
|
const fullKey = `${options.key}(${subKey})`
|
|
44
|
-
const existing =
|
|
44
|
+
const existing = target.selectors.get(fullKey)
|
|
45
45
|
if (existing) {
|
|
46
46
|
return deposit(existing)
|
|
47
47
|
}
|
|
@@ -62,6 +62,6 @@ export function createSelectorFamily<T, K extends Json.Serializable>(
|
|
|
62
62
|
type: `selector_family`,
|
|
63
63
|
} as const,
|
|
64
64
|
) as SelectorFamily<T, K>
|
|
65
|
-
|
|
65
|
+
target.families.set(options.key, selectorFamily)
|
|
66
66
|
return selectorFamily
|
|
67
67
|
}
|
package/internal/src/index.ts
CHANGED
package/internal/src/keys.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { newest } from "./lineage"
|
|
1
2
|
import type { Store } from "./store"
|
|
2
|
-
import { target } from "./transaction"
|
|
3
3
|
|
|
4
4
|
export type AtomKey<T> = string & { __atomKey?: never; __brand?: T }
|
|
5
5
|
export type SelectorKey<T> = string & { __selectorKey?: never; __brand?: T }
|
|
@@ -9,16 +9,16 @@ export type ReadonlySelectorKey<T> = string & {
|
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export const isAtomKey = (key: string, store: Store): key is AtomKey<unknown> =>
|
|
12
|
-
|
|
12
|
+
newest(store).atoms.has(key)
|
|
13
13
|
export const isSelectorKey = (
|
|
14
14
|
key: string,
|
|
15
15
|
store: Store,
|
|
16
|
-
): key is SelectorKey<unknown> =>
|
|
16
|
+
): key is SelectorKey<unknown> => newest(store).selectors.has(key)
|
|
17
17
|
export const isReadonlySelectorKey = (
|
|
18
18
|
key: string,
|
|
19
19
|
store: Store,
|
|
20
20
|
): key is ReadonlySelectorKey<unknown> =>
|
|
21
|
-
|
|
21
|
+
newest(store).readonlySelectors.has(key)
|
|
22
22
|
|
|
23
23
|
export type StateKey<T> = AtomKey<T> | ReadonlySelectorKey<T> | SelectorKey<T>
|
|
24
24
|
export const isStateKey = (
|
package/internal/src/lazy-map.ts
CHANGED
|
@@ -12,13 +12,17 @@ export class LazyMap<K, V> extends Map<K, V> {
|
|
|
12
12
|
}
|
|
13
13
|
if (!this.deleted.has(key) && this.source.has(key)) {
|
|
14
14
|
const value = this.source.get(key)
|
|
15
|
-
super.set(key, value as V)
|
|
16
15
|
return value
|
|
17
16
|
}
|
|
18
17
|
return undefined
|
|
19
18
|
}
|
|
20
19
|
|
|
21
|
-
public
|
|
20
|
+
public set(key: K, value: V): this {
|
|
21
|
+
this.deleted.delete(key)
|
|
22
|
+
return super.set(key, value)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public hasOwn(key: K): boolean {
|
|
22
26
|
return super.has(key)
|
|
23
27
|
}
|
|
24
28
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface Lineage {
|
|
2
|
+
parent: typeof this | null
|
|
3
|
+
child: typeof this | null
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export function newest<T extends Lineage>(scion: T): T {
|
|
7
|
+
while (scion.child !== null) {
|
|
8
|
+
scion = scion.child
|
|
9
|
+
}
|
|
10
|
+
return scion
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function eldest<T extends Lineage>(scion: T): T {
|
|
14
|
+
while (scion.parent !== null) {
|
|
15
|
+
scion = scion.parent
|
|
16
|
+
}
|
|
17
|
+
return scion
|
|
18
|
+
}
|
|
@@ -4,8 +4,8 @@ import type { Json } from "atom.io/json"
|
|
|
4
4
|
import { selectJson } from "atom.io/json"
|
|
5
5
|
|
|
6
6
|
import { createAtom } from "../atom"
|
|
7
|
+
import { newest } from "../lineage"
|
|
7
8
|
import type { Store } from "../store"
|
|
8
|
-
import { target } from "../transaction"
|
|
9
9
|
import { Tracker } from "./tracker"
|
|
10
10
|
import type { Transceiver } from "./transceiver"
|
|
11
11
|
|
|
@@ -25,18 +25,19 @@ export function createMutableAtom<
|
|
|
25
25
|
const coreState = createAtom<Core>(options, undefined, store)
|
|
26
26
|
new Tracker(coreState, store)
|
|
27
27
|
const jsonState = selectJson(coreState, options, store)
|
|
28
|
+
const target = newest(store)
|
|
28
29
|
subscribe(
|
|
29
30
|
jsonState,
|
|
30
31
|
() => {
|
|
31
|
-
const trackerHasBeenInitialized =
|
|
32
|
+
const trackerHasBeenInitialized = newest(store).trackers.has(coreState.key)
|
|
32
33
|
if (!trackerHasBeenInitialized) {
|
|
33
34
|
new Tracker(coreState, store)
|
|
34
35
|
}
|
|
35
36
|
},
|
|
36
37
|
`tracker-initializer:${store?.config.name}:${
|
|
37
|
-
|
|
38
|
+
target.transactionMeta === null
|
|
38
39
|
? `main`
|
|
39
|
-
:
|
|
40
|
+
: `${target.transactionMeta.update.key}`
|
|
40
41
|
}`,
|
|
41
42
|
)
|
|
42
43
|
return coreState as MutableAtomToken<Core, SerializableCore>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { MutableAtomFamily, SelectorFamily } from "atom.io"
|
|
2
2
|
import type { Json } from "atom.io/json"
|
|
3
3
|
|
|
4
|
+
import { newest } from "../lineage"
|
|
4
5
|
import type { Store } from "../store"
|
|
5
|
-
import { target } from "../transaction"
|
|
6
6
|
import type { Transceiver } from "./transceiver"
|
|
7
7
|
|
|
8
8
|
export const getJsonFamily = <
|
|
@@ -13,9 +13,9 @@ export const getJsonFamily = <
|
|
|
13
13
|
mutableAtomFamily: MutableAtomFamily<Core, SerializableCore, Key>,
|
|
14
14
|
store: Store,
|
|
15
15
|
): SelectorFamily<SerializableCore, Key> => {
|
|
16
|
-
const
|
|
16
|
+
const target = newest(store)
|
|
17
17
|
const key = `${mutableAtomFamily.key}:JSON`
|
|
18
|
-
const jsonFamily: SelectorFamily<SerializableCore, Key> =
|
|
18
|
+
const jsonFamily: SelectorFamily<SerializableCore, Key> = target.families.get(
|
|
19
19
|
key,
|
|
20
20
|
) as SelectorFamily<SerializableCore, Key>
|
|
21
21
|
return jsonFamily
|
|
@@ -3,8 +3,8 @@ import { getState, setState, subscribe, subscribeToTimeline } from "atom.io"
|
|
|
3
3
|
import type { Json } from "atom.io/json"
|
|
4
4
|
|
|
5
5
|
import type { Store } from ".."
|
|
6
|
+
import { newest } from ".."
|
|
6
7
|
import { createAtom, deleteAtom } from "../atom"
|
|
7
|
-
import { target } from "../transaction"
|
|
8
8
|
import type { Transceiver } from "./transceiver"
|
|
9
9
|
|
|
10
10
|
/**
|
|
@@ -48,11 +48,12 @@ export class Tracker<Mutable extends Transceiver<any>> {
|
|
|
48
48
|
store: Store,
|
|
49
49
|
): void {
|
|
50
50
|
const originalInnerValue = getState(mutableState, store)
|
|
51
|
+
const target = newest(store)
|
|
51
52
|
this.unsubscribeFromInnerValue = originalInnerValue.subscribe(
|
|
52
53
|
`tracker:${store.config.name}:${
|
|
53
|
-
|
|
54
|
+
target.transactionMeta === null
|
|
54
55
|
? `main`
|
|
55
|
-
:
|
|
56
|
+
: target.transactionMeta.update.key
|
|
56
57
|
}`,
|
|
57
58
|
(update) => {
|
|
58
59
|
const unsubscribe = store.subject.operationStatus.subscribe(
|
|
@@ -69,11 +70,12 @@ export class Tracker<Mutable extends Transceiver<any>> {
|
|
|
69
70
|
(update) => {
|
|
70
71
|
if (update.newValue !== update.oldValue) {
|
|
71
72
|
this.unsubscribeFromInnerValue?.()
|
|
73
|
+
const target = newest(store)
|
|
72
74
|
this.unsubscribeFromInnerValue = update.newValue.subscribe(
|
|
73
75
|
`tracker:${store.config.name}:${
|
|
74
|
-
|
|
76
|
+
target.transactionMeta === null
|
|
75
77
|
? `main`
|
|
76
|
-
:
|
|
78
|
+
: target.transactionMeta.update.key
|
|
77
79
|
}`,
|
|
78
80
|
(update) => {
|
|
79
81
|
const unsubscribe = store.subject.operationStatus.subscribe(
|
|
@@ -136,6 +138,7 @@ export class Tracker<Mutable extends Transceiver<any>> {
|
|
|
136
138
|
const updateNumber = mutable.getUpdateNumber(newValue)
|
|
137
139
|
const eventOffset = updateNumber - mutable.cacheUpdateNumber
|
|
138
140
|
if (newValue && eventOffset === 1) {
|
|
141
|
+
// ❗ new:"0=add:\"myHand\"",old:"0=add:\"deckId\""
|
|
139
142
|
setState(
|
|
140
143
|
mutableState,
|
|
141
144
|
(transceiver) => (transceiver.do(newValue), transceiver),
|
|
@@ -158,10 +161,10 @@ export class Tracker<Mutable extends Transceiver<any>> {
|
|
|
158
161
|
store: Store,
|
|
159
162
|
) {
|
|
160
163
|
this.mutableState = mutableState
|
|
161
|
-
|
|
162
|
-
this.
|
|
163
|
-
this.
|
|
164
|
-
|
|
165
|
-
|
|
164
|
+
const target = newest(store)
|
|
165
|
+
this.latestUpdateState = this.initializeState(mutableState, target)
|
|
166
|
+
this.observeCore(mutableState, this.latestUpdateState, target)
|
|
167
|
+
this.updateCore(mutableState, this.latestUpdateState, target)
|
|
168
|
+
target.trackers.set(mutableState.key, this)
|
|
166
169
|
}
|
|
167
170
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { StateToken } from "atom.io"
|
|
2
2
|
|
|
3
|
+
import { newest } from "./lineage"
|
|
3
4
|
import type { Store } from "./store"
|
|
4
|
-
import { target } from "./transaction"
|
|
5
5
|
|
|
6
6
|
export type OperationProgress =
|
|
7
7
|
| {
|
|
@@ -19,17 +19,17 @@ export const openOperation = (
|
|
|
19
19
|
token: StateToken<any>,
|
|
20
20
|
store: Store,
|
|
21
21
|
): `rejection` | undefined => {
|
|
22
|
-
const
|
|
23
|
-
if (
|
|
22
|
+
const target = newest(store)
|
|
23
|
+
if (target.operation.open) {
|
|
24
24
|
store.logger.error(
|
|
25
25
|
`❌`,
|
|
26
26
|
token.type,
|
|
27
27
|
token.key,
|
|
28
|
-
`failed to setState during a setState for "${
|
|
28
|
+
`failed to setState during a setState for "${target.operation.token.key}"`,
|
|
29
29
|
)
|
|
30
30
|
return `rejection`
|
|
31
31
|
}
|
|
32
|
-
|
|
32
|
+
target.operation = {
|
|
33
33
|
open: true,
|
|
34
34
|
done: new Set(),
|
|
35
35
|
prev: new Map(),
|
|
@@ -41,29 +41,29 @@ export const openOperation = (
|
|
|
41
41
|
token.type,
|
|
42
42
|
token.key,
|
|
43
43
|
`operation start in store "${store.config.name}"${
|
|
44
|
-
|
|
44
|
+
target.transactionMeta === null
|
|
45
45
|
? ``
|
|
46
|
-
: ` ${
|
|
46
|
+
: ` ${target.transactionMeta.phase} "${target.transactionMeta.update.key}"`
|
|
47
47
|
}`,
|
|
48
48
|
)
|
|
49
49
|
}
|
|
50
50
|
export const closeOperation = (store: Store): void => {
|
|
51
|
-
const
|
|
52
|
-
if (
|
|
51
|
+
const target = newest(store)
|
|
52
|
+
if (target.operation.open) {
|
|
53
53
|
store.logger.info(
|
|
54
54
|
`🔴`,
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
target.operation.token.type,
|
|
56
|
+
target.operation.token.key,
|
|
57
57
|
`operation done in store "${store.config.name}"`,
|
|
58
58
|
)
|
|
59
59
|
}
|
|
60
|
-
|
|
61
|
-
store.subject.operationStatus.next(
|
|
60
|
+
target.operation = { open: false }
|
|
61
|
+
store.subject.operationStatus.next(target.operation)
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
export const isDone = (key: string, store: Store): boolean => {
|
|
65
|
-
const
|
|
66
|
-
if (!
|
|
65
|
+
const target = newest(store)
|
|
66
|
+
if (!target.operation.open) {
|
|
67
67
|
store.logger.warn(
|
|
68
68
|
`🐞`,
|
|
69
69
|
`unknown`,
|
|
@@ -72,11 +72,11 @@ export const isDone = (key: string, store: Store): boolean => {
|
|
|
72
72
|
)
|
|
73
73
|
return true
|
|
74
74
|
}
|
|
75
|
-
return
|
|
75
|
+
return target.operation.done.has(key)
|
|
76
76
|
}
|
|
77
77
|
export const markDone = (key: string, store: Store): void => {
|
|
78
|
-
const
|
|
79
|
-
if (!
|
|
78
|
+
const target = newest(store)
|
|
79
|
+
if (!target.operation.open) {
|
|
80
80
|
store.logger.warn(
|
|
81
81
|
`🐞`,
|
|
82
82
|
`unknown`,
|
|
@@ -85,5 +85,5 @@ export const markDone = (key: string, store: Store): void => {
|
|
|
85
85
|
)
|
|
86
86
|
return
|
|
87
87
|
}
|
|
88
|
-
|
|
88
|
+
target.operation.done.add(key)
|
|
89
89
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { FamilyMetadata, SelectorOptions, SelectorToken } from "atom.io"
|
|
2
2
|
|
|
3
3
|
import { cacheValue } from "../caching"
|
|
4
|
+
import { newest } from "../lineage"
|
|
4
5
|
import { markDone } from "../operation"
|
|
5
6
|
import { become } from "../set-state/become"
|
|
6
|
-
import type { Store
|
|
7
|
+
import type { Store } from "../store"
|
|
7
8
|
import { Subject } from "../subject"
|
|
8
9
|
import type { Selector } from "./create-selector"
|
|
9
10
|
import { createSelector } from "./create-selector"
|
|
@@ -13,8 +14,8 @@ export const createReadWriteSelector = <T>(
|
|
|
13
14
|
options: SelectorOptions<T>,
|
|
14
15
|
family: FamilyMetadata | undefined,
|
|
15
16
|
store: Store,
|
|
16
|
-
core: StoreCore,
|
|
17
17
|
): SelectorToken<T> => {
|
|
18
|
+
const target = newest(store)
|
|
18
19
|
const subject = new Subject<{ newValue: T; oldValue: T }>()
|
|
19
20
|
|
|
20
21
|
const { get, set } = registerSelector(options.key, store)
|
|
@@ -40,7 +41,7 @@ export const createReadWriteSelector = <T>(
|
|
|
40
41
|
)
|
|
41
42
|
cacheValue(options.key, newValue, subject, store)
|
|
42
43
|
markDone(options.key, store)
|
|
43
|
-
if (
|
|
44
|
+
if (target.transactionMeta === null) {
|
|
44
45
|
subject.next({ newValue, oldValue })
|
|
45
46
|
}
|
|
46
47
|
options.set({ get, set }, newValue)
|
|
@@ -54,7 +55,7 @@ export const createReadWriteSelector = <T>(
|
|
|
54
55
|
type: `selector`,
|
|
55
56
|
...(family && { family }),
|
|
56
57
|
}
|
|
57
|
-
|
|
58
|
+
target.selectors.set(options.key, mySelector) // ❓
|
|
58
59
|
const initialValue = getSelf()
|
|
59
60
|
store.logger.info(`✨`, mySelector.type, mySelector.key, `=`, initialValue)
|
|
60
61
|
const token: SelectorToken<T> = {
|
|
@@ -5,7 +5,8 @@ import type {
|
|
|
5
5
|
} from "atom.io"
|
|
6
6
|
|
|
7
7
|
import { cacheValue } from "../caching"
|
|
8
|
-
import
|
|
8
|
+
import { newest } from "../lineage"
|
|
9
|
+
import type { Store } from "../store"
|
|
9
10
|
import { Subject } from "../subject"
|
|
10
11
|
import type { ReadonlySelector } from "./create-selector"
|
|
11
12
|
import { createSelector } from "./create-selector"
|
|
@@ -15,8 +16,8 @@ export const createReadonlySelector = <T>(
|
|
|
15
16
|
options: ReadonlySelectorOptions<T>,
|
|
16
17
|
family: FamilyMetadata | undefined,
|
|
17
18
|
store: Store,
|
|
18
|
-
core: StoreCore,
|
|
19
19
|
): ReadonlySelectorToken<T> => {
|
|
20
|
+
const target = newest(store)
|
|
20
21
|
const subject = new Subject<{ newValue: T; oldValue: T }>()
|
|
21
22
|
|
|
22
23
|
const { get } = registerSelector(options.key, store)
|
|
@@ -34,7 +35,7 @@ export const createReadonlySelector = <T>(
|
|
|
34
35
|
type: `readonly_selector`,
|
|
35
36
|
...(family && { family }),
|
|
36
37
|
}
|
|
37
|
-
|
|
38
|
+
target.readonlySelectors.set(options.key, readonlySelector)
|
|
38
39
|
const initialValue = getSelf()
|
|
39
40
|
store.logger.info(
|
|
40
41
|
`✨`,
|
|
@@ -6,9 +6,9 @@ import type {
|
|
|
6
6
|
SelectorToken,
|
|
7
7
|
} from "atom.io"
|
|
8
8
|
|
|
9
|
+
import { newest } from "../lineage"
|
|
9
10
|
import type { Store } from "../store"
|
|
10
11
|
import type { Subject } from "../subject"
|
|
11
|
-
import { target } from "../transaction"
|
|
12
12
|
import { createReadWriteSelector } from "./create-read-write-selector"
|
|
13
13
|
import { createReadonlySelector } from "./create-readonly-selector"
|
|
14
14
|
|
|
@@ -45,9 +45,9 @@ export function createSelector<T>(
|
|
|
45
45
|
family: FamilyMetadata | undefined,
|
|
46
46
|
store: Store,
|
|
47
47
|
): ReadonlySelectorToken<T> | SelectorToken<T> {
|
|
48
|
-
const
|
|
49
|
-
const existingWritable =
|
|
50
|
-
const existingReadonly =
|
|
48
|
+
const target = newest(store)
|
|
49
|
+
const existingWritable = target.selectors.get(options.key)
|
|
50
|
+
const existingReadonly = target.readonlySelectors.get(options.key)
|
|
51
51
|
|
|
52
52
|
if (existingWritable || existingReadonly) {
|
|
53
53
|
store.logger.error(
|
|
@@ -59,7 +59,7 @@ export function createSelector<T>(
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
if (`set` in options) {
|
|
62
|
-
return createReadWriteSelector(options, family, store
|
|
62
|
+
return createReadWriteSelector(options, family, store)
|
|
63
63
|
}
|
|
64
|
-
return createReadonlySelector(options, family, store
|
|
64
|
+
return createReadonlySelector(options, family, store)
|
|
65
65
|
}
|
|
@@ -1,37 +1,37 @@
|
|
|
1
1
|
import type { ReadonlySelectorToken, SelectorToken } from "atom.io"
|
|
2
2
|
|
|
3
|
+
import { newest } from ".."
|
|
3
4
|
import type { Store } from ".."
|
|
4
|
-
import { target } from ".."
|
|
5
5
|
|
|
6
6
|
export function deleteSelector(
|
|
7
7
|
selectorToken: ReadonlySelectorToken<unknown> | SelectorToken<unknown>,
|
|
8
8
|
store: Store,
|
|
9
9
|
): void {
|
|
10
|
-
const
|
|
10
|
+
const target = newest(store)
|
|
11
11
|
const { key } = selectorToken
|
|
12
12
|
switch (selectorToken.type) {
|
|
13
13
|
case `selector`:
|
|
14
|
-
|
|
14
|
+
target.selectors.delete(key)
|
|
15
15
|
break
|
|
16
16
|
case `readonly_selector`:
|
|
17
|
-
|
|
17
|
+
target.readonlySelectors.delete(key)
|
|
18
18
|
break
|
|
19
19
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const downstreamTokens =
|
|
20
|
+
target.valueMap.delete(key)
|
|
21
|
+
target.selectorAtoms.delete(key)
|
|
22
|
+
const downstreamTokens = target.selectorGraph
|
|
23
23
|
.getRelationEntries({ upstreamSelectorKey: key })
|
|
24
24
|
.filter(([_, { source }]) => source === key)
|
|
25
25
|
.map(
|
|
26
26
|
([downstreamSelectorKey]) =>
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
target.selectors.get(downstreamSelectorKey) ??
|
|
28
|
+
target.readonlySelectors.get(downstreamSelectorKey),
|
|
29
29
|
)
|
|
30
30
|
for (const downstreamToken of downstreamTokens) {
|
|
31
31
|
if (downstreamToken) {
|
|
32
32
|
deleteSelector(downstreamToken, store)
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
-
|
|
35
|
+
target.selectorGraph.delete(key)
|
|
36
36
|
store.logger.info(`🔥`, selectorToken.type, `${key}`, `deleted`)
|
|
37
37
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AtomKey, ReadonlySelectorKey, SelectorKey } from "../keys"
|
|
2
2
|
import { isStateKey } from "../keys"
|
|
3
|
+
import { newest } from "../lineage"
|
|
3
4
|
import type { Store } from "../store"
|
|
4
|
-
import { target } from "../transaction"
|
|
5
5
|
|
|
6
6
|
export const getSelectorDependencyKeys = (
|
|
7
7
|
key: string,
|
|
@@ -11,7 +11,7 @@ export const getSelectorDependencyKeys = (
|
|
|
11
11
|
| ReadonlySelectorKey<unknown>
|
|
12
12
|
| SelectorKey<unknown>
|
|
13
13
|
)[] => {
|
|
14
|
-
const sources =
|
|
14
|
+
const sources = newest(store)
|
|
15
15
|
.selectorGraph.getRelationEntries({ downstreamSelectorKey: key })
|
|
16
16
|
.filter(([_, { source }]) => source !== key)
|
|
17
17
|
.map(([_, { source }]) => source)
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { Transactors } from "atom.io"
|
|
2
2
|
|
|
3
|
+
import { newest } from "../lineage"
|
|
3
4
|
import { readOrComputeValue } from "../read-or-compute-value"
|
|
4
5
|
import { setAtomOrSelector } from "../set-state"
|
|
5
6
|
import type { Store } from "../store"
|
|
6
7
|
import { withdraw } from "../store"
|
|
7
|
-
import { target } from "../transaction/create-transaction"
|
|
8
8
|
import { updateSelectorAtoms } from "./update-selector-atoms"
|
|
9
9
|
|
|
10
10
|
export const registerSelector = (
|
|
@@ -12,8 +12,8 @@ export const registerSelector = (
|
|
|
12
12
|
store: Store,
|
|
13
13
|
): Transactors => ({
|
|
14
14
|
get: (dependency) => {
|
|
15
|
-
const
|
|
16
|
-
const alreadyRegistered =
|
|
15
|
+
const target = newest(store)
|
|
16
|
+
const alreadyRegistered = target.selectorGraph
|
|
17
17
|
.getRelationEntries({ downstreamSelectorKey: selectorKey })
|
|
18
18
|
.some(([_, { source }]) => source === dependency.key)
|
|
19
19
|
|
|
@@ -35,7 +35,7 @@ export const registerSelector = (
|
|
|
35
35
|
)
|
|
36
36
|
|
|
37
37
|
if (!alreadyRegistered) {
|
|
38
|
-
|
|
38
|
+
target.selectorGraph = target.selectorGraph.set(
|
|
39
39
|
{
|
|
40
40
|
upstreamSelectorKey: dependency.key,
|
|
41
41
|
downstreamSelectorKey: selectorKey,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ReadonlySelectorToken, StateToken } from "atom.io"
|
|
2
2
|
|
|
3
|
+
import { newest } from "../lineage"
|
|
3
4
|
import type { Store } from "../store"
|
|
4
|
-
import { target } from "../transaction"
|
|
5
5
|
import { traceSelectorAtoms } from "./trace-selector-atoms"
|
|
6
6
|
|
|
7
7
|
export const updateSelectorAtoms = (
|
|
@@ -9,7 +9,7 @@ export const updateSelectorAtoms = (
|
|
|
9
9
|
dependency: ReadonlySelectorToken<unknown> | StateToken<unknown>,
|
|
10
10
|
store: Store,
|
|
11
11
|
): void => {
|
|
12
|
-
const core =
|
|
12
|
+
const core = newest(store)
|
|
13
13
|
if (dependency.type === `atom`) {
|
|
14
14
|
core.selectorAtoms = core.selectorAtoms.set({
|
|
15
15
|
selectorKey,
|
|
@@ -2,19 +2,20 @@ import type { JsonInterface } from "atom.io/json"
|
|
|
2
2
|
|
|
3
3
|
import type { Atom } from "../atom"
|
|
4
4
|
import { Tracker } from "../mutable"
|
|
5
|
-
import type { Store
|
|
5
|
+
import type { Store } from "../store"
|
|
6
6
|
|
|
7
7
|
export function copyMutableIfNeeded<T>(
|
|
8
8
|
atom: Atom<T>,
|
|
9
9
|
transform: JsonInterface<T>,
|
|
10
10
|
origin: Store,
|
|
11
|
-
target:
|
|
11
|
+
target: Store,
|
|
12
12
|
): T {
|
|
13
13
|
const originValue = origin.valueMap.get(atom.key)
|
|
14
14
|
const targetValue = target.valueMap.get(atom.key)
|
|
15
15
|
if (originValue === targetValue) {
|
|
16
16
|
origin.logger.info(`📃`, `atom`, `${atom.key}`, `copying`)
|
|
17
|
-
const
|
|
17
|
+
const jsonValue = transform.toJson(originValue)
|
|
18
|
+
const copiedValue = transform.fromJson(jsonValue)
|
|
18
19
|
target.valueMap.set(atom.key, copiedValue)
|
|
19
20
|
new Tracker(atom, origin)
|
|
20
21
|
return copiedValue
|