atom.io 0.33.2 → 0.33.4
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/data/index.d.ts +3 -3
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js.map +1 -1
- package/dist/eslint-plugin/index.d.ts.map +1 -1
- package/dist/internal/index.d.ts +118 -54
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +381 -128
- package/dist/internal/index.js.map +1 -1
- package/dist/introspection/index.d.ts +11 -10
- package/dist/introspection/index.d.ts.map +1 -1
- package/dist/introspection/index.js +4 -4
- package/dist/introspection/index.js.map +1 -1
- package/dist/json/index.d.ts +3 -3
- package/dist/json/index.d.ts.map +1 -1
- package/dist/json/index.js +2 -2
- package/dist/json/index.js.map +1 -1
- package/dist/main/index.d.ts +157 -36
- package/dist/main/index.d.ts.map +1 -1
- package/dist/main/index.js +15 -3
- package/dist/main/index.js.map +1 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/{devtools-Jyn42mZm.css → react-devtools/index.css} +1 -1
- package/dist/react-devtools/index.css.map +1 -0
- package/dist/react-devtools/index.d.ts +0 -1
- package/dist/react-devtools/index.d.ts.map +1 -1
- package/dist/react-devtools/index.js +8 -3
- package/dist/react-devtools/index.js.map +1 -1
- package/dist/realtime/index.d.ts +3 -2
- package/dist/realtime/index.d.ts.map +1 -1
- package/dist/realtime/index.js.map +1 -1
- package/dist/realtime-client/index.d.ts +4 -1
- package/dist/realtime-client/index.d.ts.map +1 -1
- package/dist/realtime-client/index.js.map +1 -1
- package/dist/realtime-react/index.d.ts.map +1 -1
- package/dist/realtime-react/index.js.map +1 -1
- package/dist/realtime-server/index.d.ts +27 -2
- package/dist/realtime-server/index.d.ts.map +1 -1
- package/dist/realtime-server/index.js.map +1 -1
- package/dist/realtime-testing/index.d.ts.map +1 -1
- package/dist/transceivers/set-rtx/index.d.ts.map +1 -1
- package/dist/web/index.d.ts.map +1 -1
- package/package.json +21 -21
- package/src/data/dict.ts +5 -5
- package/src/data/struct-family.ts +2 -2
- package/src/data/struct.ts +1 -1
- package/src/internal/atom/create-regular-atom.ts +14 -17
- package/src/internal/caching.ts +1 -1
- package/src/internal/families/create-readonly-held-selector-family.ts +81 -0
- package/src/internal/families/{create-readonly-selector-family.ts → create-readonly-pure-selector-family.ts} +26 -23
- package/src/internal/families/create-selector-family.ts +39 -16
- package/src/internal/families/create-writable-held-selector-family.ts +80 -0
- package/src/internal/families/{create-writable-selector-family.ts → create-writable-pure-selector-family.ts} +26 -23
- package/src/internal/families/dispose-from-store.ts +4 -2
- package/src/internal/families/find-in-store.ts +8 -8
- package/src/internal/families/get-family-of-token.ts +8 -8
- package/src/internal/families/index.ts +3 -3
- package/src/internal/families/init-family-member.ts +12 -10
- package/src/internal/families/seek-in-store.ts +13 -11
- package/src/internal/get-state/get-from-store.ts +5 -2
- package/src/internal/get-state/read-or-compute-value.ts +4 -2
- package/src/internal/index.ts +97 -20
- package/src/internal/join/join-internal.ts +18 -18
- package/src/internal/keys.ts +1 -1
- package/src/internal/mutable/create-mutable-atom.ts +17 -15
- package/src/internal/mutable/get-json-family.ts +4 -4
- package/src/internal/mutable/get-json-token.ts +7 -7
- package/src/internal/selector/create-readonly-held-selector.ts +50 -0
- package/src/internal/selector/create-readonly-pure-selector.ts +51 -0
- package/src/internal/selector/create-standalone-selector.ts +48 -15
- package/src/internal/selector/create-writable-held-selector.ts +68 -0
- package/src/internal/selector/{create-writable-selector.ts → create-writable-pure-selector.ts} +18 -25
- package/src/internal/selector/dispose-selector.ts +37 -7
- package/src/internal/selector/get-selector-dependency-keys.ts +1 -1
- package/src/internal/selector/index.ts +4 -2
- package/src/internal/selector/register-selector.ts +17 -5
- package/src/internal/selector/trace-selector-atoms.ts +5 -5
- package/src/internal/selector/update-selector-atoms.ts +16 -10
- package/src/internal/set-state/emit-update.ts +4 -2
- package/src/internal/set-state/set-atom-or-selector.ts +2 -1
- package/src/internal/store/counterfeit.ts +13 -11
- package/src/internal/store/deposit.ts +18 -14
- package/src/internal/store/store.ts +9 -14
- package/src/internal/store/withdraw.ts +83 -7
- package/src/internal/subscribe/subscribe-in-store.ts +4 -2
- package/src/internal/subscribe/subscribe-to-state.ts +2 -1
- package/src/internal/timeline/create-timeline.ts +4 -2
- package/src/internal/transaction/build-transaction.ts +1 -1
- package/src/introspection/attach-atom-index.ts +2 -2
- package/src/introspection/attach-introspection-states.ts +9 -9
- package/src/introspection/attach-selector-index.ts +3 -3
- package/src/introspection/attach-timeline-family.ts +2 -2
- package/src/introspection/attach-timeline-index.ts +2 -2
- package/src/introspection/attach-transaction-index.ts +2 -2
- package/src/introspection/attach-transaction-logs.ts +2 -2
- package/src/introspection/attach-type-selectors.ts +5 -5
- package/src/introspection/auditor.ts +3 -3
- package/src/json/select-json-family.ts +5 -5
- package/src/json/select-json.ts +1 -1
- package/src/main/find-state.ts +8 -8
- package/src/main/index.ts +51 -6
- package/src/main/join.ts +13 -13
- package/src/main/logger.ts +32 -15
- package/src/main/selector.ts +164 -30
- package/src/main/transaction.ts +3 -3
- package/src/main/validators.ts +16 -12
- package/src/react-devtools/StateEditor.tsx +14 -4
- package/src/react-devtools/StateIndex.tsx +6 -4
- package/src/react-devtools/TimelineIndex.tsx +2 -2
- package/src/react-devtools/TransactionIndex.tsx +2 -2
- package/src/realtime/shared-room-store.ts +3 -3
- package/src/realtime-client/realtime-client-stores/client-main-store.ts +1 -1
- package/src/realtime-react/use-pull-selector-family-member.ts +1 -0
- package/src/realtime-server/realtime-server-stores/server-room-external-store.ts +2 -2
- package/dist/devtools-CAg2k57t.js +0 -0
- package/dist/devtools-Jyn42mZm.css.map +0 -1
- package/src/internal/selector/create-readonly-selector.ts +0 -55
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
FamilyMetadata,
|
|
3
|
+
WritableHeldSelectorOptions,
|
|
4
|
+
WritableHeldSelectorToken,
|
|
5
|
+
} from "atom.io"
|
|
6
|
+
|
|
7
|
+
import type { WritableHeldSelector } from ".."
|
|
8
|
+
import { cacheValue } from "../caching"
|
|
9
|
+
import { newest } from "../lineage"
|
|
10
|
+
import { markDone } from "../operation"
|
|
11
|
+
import { become } from "../set-state"
|
|
12
|
+
import type { Store } from "../store"
|
|
13
|
+
import { Subject } from "../subject"
|
|
14
|
+
import { isRootStore } from "../transaction"
|
|
15
|
+
import { registerSelector } from "./register-selector"
|
|
16
|
+
|
|
17
|
+
export const createWritableHeldSelector = <T extends object>(
|
|
18
|
+
store: Store,
|
|
19
|
+
options: WritableHeldSelectorOptions<T>,
|
|
20
|
+
family: FamilyMetadata | undefined,
|
|
21
|
+
): WritableHeldSelectorToken<T> => {
|
|
22
|
+
const target = newest(store)
|
|
23
|
+
const subject = new Subject<{ newValue: T; oldValue: T }>()
|
|
24
|
+
const covered = new Set<string>()
|
|
25
|
+
const { key, const: constant } = options
|
|
26
|
+
const type = `writable_held_selector` as const
|
|
27
|
+
const setterToolkit = registerSelector(target, type, key, covered)
|
|
28
|
+
const { find, get, json } = setterToolkit
|
|
29
|
+
const getterToolkit = { find, get, json }
|
|
30
|
+
|
|
31
|
+
const getSelf = (getFn = options.get, innerTarget = newest(store)): T => {
|
|
32
|
+
getFn(getterToolkit, constant)
|
|
33
|
+
cacheValue(innerTarget, key, constant, subject)
|
|
34
|
+
covered.clear()
|
|
35
|
+
return constant
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const setSelf = (next: T | ((oldValue: T) => T)): void => {
|
|
39
|
+
const innerTarget = newest(store)
|
|
40
|
+
const oldValue = getSelf(options.get, innerTarget)
|
|
41
|
+
const newValue = become(next)(oldValue)
|
|
42
|
+
store.logger.info(`📝`, type, key, `set (`, oldValue, `->`, newValue, `)`)
|
|
43
|
+
cacheValue(innerTarget, key, newValue, subject)
|
|
44
|
+
markDone(innerTarget, key)
|
|
45
|
+
if (isRootStore(innerTarget)) {
|
|
46
|
+
subject.next({ newValue, oldValue })
|
|
47
|
+
}
|
|
48
|
+
options.set(setterToolkit, newValue)
|
|
49
|
+
}
|
|
50
|
+
const mySelector: WritableHeldSelector<T> = {
|
|
51
|
+
...options,
|
|
52
|
+
type,
|
|
53
|
+
subject,
|
|
54
|
+
install: (s: Store) => createWritableHeldSelector(s, options, family),
|
|
55
|
+
get: getSelf,
|
|
56
|
+
set: setSelf,
|
|
57
|
+
...(family && { family }),
|
|
58
|
+
}
|
|
59
|
+
target.writableSelectors.set(key, mySelector)
|
|
60
|
+
const initialValue = getSelf()
|
|
61
|
+
store.logger.info(`✨`, type, key, `=`, initialValue)
|
|
62
|
+
|
|
63
|
+
const token: WritableHeldSelectorToken<T> = { key, type }
|
|
64
|
+
if (family) {
|
|
65
|
+
token.family = family
|
|
66
|
+
}
|
|
67
|
+
return token
|
|
68
|
+
}
|
package/src/internal/selector/{create-writable-selector.ts → create-writable-pure-selector.ts}
RENAMED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
FamilyMetadata,
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
WritablePureSelectorOptions,
|
|
4
|
+
WritablePureSelectorToken,
|
|
5
5
|
} from "atom.io"
|
|
6
6
|
|
|
7
|
-
import type {
|
|
7
|
+
import type { WritablePureSelector } from ".."
|
|
8
8
|
import { cacheValue } from "../caching"
|
|
9
9
|
import { newest } from "../lineage"
|
|
10
10
|
import { markDone } from "../operation"
|
|
@@ -14,21 +14,23 @@ import { Subject } from "../subject"
|
|
|
14
14
|
import { isRootStore } from "../transaction"
|
|
15
15
|
import { registerSelector } from "./register-selector"
|
|
16
16
|
|
|
17
|
-
export const
|
|
17
|
+
export const createWritablePureSelector = <T>(
|
|
18
18
|
store: Store,
|
|
19
|
-
options:
|
|
19
|
+
options: WritablePureSelectorOptions<T>,
|
|
20
20
|
family: FamilyMetadata | undefined,
|
|
21
|
-
):
|
|
21
|
+
): WritablePureSelectorToken<T> => {
|
|
22
22
|
const target = newest(store)
|
|
23
23
|
const subject = new Subject<{ newValue: T; oldValue: T }>()
|
|
24
24
|
const covered = new Set<string>()
|
|
25
|
-
const
|
|
25
|
+
const key = options.key
|
|
26
|
+
const type = `writable_pure_selector` as const
|
|
27
|
+
const setterToolkit = registerSelector(target, type, key, covered)
|
|
26
28
|
const { find, get, json } = setterToolkit
|
|
27
29
|
const getterToolkit = { find, get, json }
|
|
28
30
|
|
|
29
31
|
const getSelf = (getFn = options.get, innerTarget = newest(store)): T => {
|
|
30
32
|
const value = getFn(getterToolkit)
|
|
31
|
-
cacheValue(innerTarget,
|
|
33
|
+
cacheValue(innerTarget, key, value, subject)
|
|
32
34
|
covered.clear()
|
|
33
35
|
return value
|
|
34
36
|
}
|
|
@@ -37,16 +39,7 @@ export const createWritableSelector = <T>(
|
|
|
37
39
|
const innerTarget = newest(store)
|
|
38
40
|
const oldValue = getSelf(options.get, innerTarget)
|
|
39
41
|
const newValue = become(next)(oldValue)
|
|
40
|
-
store.logger.info(
|
|
41
|
-
`📝`,
|
|
42
|
-
`selector`,
|
|
43
|
-
options.key,
|
|
44
|
-
`set (`,
|
|
45
|
-
oldValue,
|
|
46
|
-
`->`,
|
|
47
|
-
newValue,
|
|
48
|
-
`)`,
|
|
49
|
-
)
|
|
42
|
+
store.logger.info(`📝`, type, key, `set (`, oldValue, `->`, newValue, `)`)
|
|
50
43
|
cacheValue(innerTarget, options.key, newValue, subject)
|
|
51
44
|
markDone(innerTarget, options.key)
|
|
52
45
|
if (isRootStore(innerTarget)) {
|
|
@@ -54,21 +47,21 @@ export const createWritableSelector = <T>(
|
|
|
54
47
|
}
|
|
55
48
|
options.set(setterToolkit, newValue)
|
|
56
49
|
}
|
|
57
|
-
const mySelector:
|
|
50
|
+
const mySelector: WritablePureSelector<T> = {
|
|
58
51
|
...options,
|
|
52
|
+
type,
|
|
59
53
|
subject,
|
|
60
|
-
install: (s: Store) =>
|
|
54
|
+
install: (s: Store) => createWritablePureSelector(s, options, family),
|
|
61
55
|
get: getSelf,
|
|
62
56
|
set: setSelf,
|
|
63
|
-
type: `selector`,
|
|
64
57
|
...(family && { family }),
|
|
65
58
|
}
|
|
66
|
-
target.
|
|
59
|
+
target.writableSelectors.set(key, mySelector)
|
|
67
60
|
const initialValue = getSelf()
|
|
68
61
|
store.logger.info(`✨`, mySelector.type, mySelector.key, `=`, initialValue)
|
|
69
|
-
const token:
|
|
70
|
-
key
|
|
71
|
-
type
|
|
62
|
+
const token: WritablePureSelectorToken<T> = {
|
|
63
|
+
key,
|
|
64
|
+
type,
|
|
72
65
|
}
|
|
73
66
|
if (family) {
|
|
74
67
|
token.family = family
|
|
@@ -8,12 +8,12 @@ export function disposeSelector(
|
|
|
8
8
|
selectorToken: SelectorToken<unknown>,
|
|
9
9
|
): void {
|
|
10
10
|
const target = newest(store)
|
|
11
|
-
const { key } = selectorToken
|
|
11
|
+
const { key, type } = selectorToken
|
|
12
12
|
const selector = withdraw(target, selectorToken)
|
|
13
13
|
if (!selector.family) {
|
|
14
14
|
store.logger.error(
|
|
15
15
|
`❌`,
|
|
16
|
-
|
|
16
|
+
type,
|
|
17
17
|
key,
|
|
18
18
|
`Standalone selectors cannot be disposed.`,
|
|
19
19
|
)
|
|
@@ -24,12 +24,12 @@ export function disposeSelector(
|
|
|
24
24
|
}
|
|
25
25
|
let familyToken: SelectorFamilyToken<any, any>
|
|
26
26
|
switch (selectorToken.type) {
|
|
27
|
-
case `
|
|
27
|
+
case `writable_held_selector`:
|
|
28
28
|
{
|
|
29
|
-
target.
|
|
29
|
+
target.writableSelectors.delete(key)
|
|
30
30
|
familyToken = {
|
|
31
31
|
key: selector.family.key,
|
|
32
|
-
type: `
|
|
32
|
+
type: `writable_held_selector_family`,
|
|
33
33
|
}
|
|
34
34
|
const family = withdraw(store, familyToken)
|
|
35
35
|
family.subject.next({
|
|
@@ -39,12 +39,42 @@ export function disposeSelector(
|
|
|
39
39
|
})
|
|
40
40
|
}
|
|
41
41
|
break
|
|
42
|
-
case `
|
|
42
|
+
case `writable_pure_selector`:
|
|
43
|
+
{
|
|
44
|
+
target.writableSelectors.delete(key)
|
|
45
|
+
familyToken = {
|
|
46
|
+
key: selector.family.key,
|
|
47
|
+
type: `writable_pure_selector_family`,
|
|
48
|
+
}
|
|
49
|
+
const family = withdraw(store, familyToken)
|
|
50
|
+
family.subject.next({
|
|
51
|
+
type: `state_disposal`,
|
|
52
|
+
subType: `selector`,
|
|
53
|
+
token: selectorToken,
|
|
54
|
+
})
|
|
55
|
+
}
|
|
56
|
+
break
|
|
57
|
+
case `readonly_held_selector`:
|
|
58
|
+
{
|
|
59
|
+
target.readonlySelectors.delete(key)
|
|
60
|
+
familyToken = {
|
|
61
|
+
key: selector.family.key,
|
|
62
|
+
type: `readonly_held_selector_family`,
|
|
63
|
+
}
|
|
64
|
+
const family = withdraw(store, familyToken)
|
|
65
|
+
family.subject.next({
|
|
66
|
+
type: `state_disposal`,
|
|
67
|
+
subType: `selector`,
|
|
68
|
+
token: selectorToken,
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
break
|
|
72
|
+
case `readonly_pure_selector`:
|
|
43
73
|
{
|
|
44
74
|
target.readonlySelectors.delete(key)
|
|
45
75
|
familyToken = {
|
|
46
76
|
key: selector.family.key,
|
|
47
|
-
type: `
|
|
77
|
+
type: `readonly_pure_selector_family`,
|
|
48
78
|
}
|
|
49
79
|
const family = withdraw(store, familyToken)
|
|
50
80
|
family.subject.next({
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
export * from "./create-readonly-selector"
|
|
1
|
+
export * from "./create-readonly-held-selector"
|
|
2
|
+
export * from "./create-readonly-pure-selector"
|
|
2
3
|
export * from "./create-standalone-selector"
|
|
3
|
-
export * from "./create-writable-selector"
|
|
4
|
+
export * from "./create-writable-held-selector"
|
|
5
|
+
export * from "./create-writable-pure-selector"
|
|
4
6
|
export * from "./dispose-selector"
|
|
5
7
|
export * from "./get-selector-dependency-keys"
|
|
6
8
|
export * from "./register-selector"
|
|
@@ -19,9 +19,14 @@ import { withdraw } from "../store"
|
|
|
19
19
|
import { updateSelectorAtoms } from "./update-selector-atoms"
|
|
20
20
|
|
|
21
21
|
export const registerSelector = (
|
|
22
|
+
store: Store,
|
|
23
|
+
selectorType:
|
|
24
|
+
| `readonly_held_selector`
|
|
25
|
+
| `readonly_pure_selector`
|
|
26
|
+
| `writable_held_selector`
|
|
27
|
+
| `writable_pure_selector`,
|
|
22
28
|
selectorKey: string,
|
|
23
29
|
covered: Set<string>,
|
|
24
|
-
store: Store,
|
|
25
30
|
): SetterToolkit => ({
|
|
26
31
|
get: (
|
|
27
32
|
...params:
|
|
@@ -40,26 +45,33 @@ export const registerSelector = (
|
|
|
40
45
|
|
|
41
46
|
const dependencyState = withdraw(store, dependency)
|
|
42
47
|
const dependencyValue = readOrComputeValue(store, dependencyState)
|
|
48
|
+
const dependencyKey = dependency.key
|
|
43
49
|
|
|
44
50
|
store.logger.info(
|
|
45
51
|
`🔌`,
|
|
46
|
-
|
|
52
|
+
selectorType,
|
|
47
53
|
selectorKey,
|
|
48
|
-
`registers dependency ( "${
|
|
54
|
+
`registers dependency ( "${dependencyKey}" =`,
|
|
49
55
|
dependencyValue,
|
|
50
56
|
`)`,
|
|
51
57
|
)
|
|
52
58
|
|
|
53
59
|
target.selectorGraph.set(
|
|
54
60
|
{
|
|
55
|
-
upstreamSelectorKey:
|
|
61
|
+
upstreamSelectorKey: dependencyKey,
|
|
56
62
|
downstreamSelectorKey: selectorKey,
|
|
57
63
|
},
|
|
58
64
|
{
|
|
59
65
|
source: dependency.key,
|
|
60
66
|
},
|
|
61
67
|
)
|
|
62
|
-
updateSelectorAtoms(
|
|
68
|
+
updateSelectorAtoms(
|
|
69
|
+
store,
|
|
70
|
+
selectorType,
|
|
71
|
+
selectorKey,
|
|
72
|
+
dependency as any,
|
|
73
|
+
covered,
|
|
74
|
+
)
|
|
63
75
|
return dependencyValue
|
|
64
76
|
},
|
|
65
77
|
set: (<T, New extends T>(
|
|
@@ -4,15 +4,15 @@ import { isAtomKey } from "../keys"
|
|
|
4
4
|
import { getSelectorDependencyKeys } from "./get-selector-dependency-keys"
|
|
5
5
|
|
|
6
6
|
export const traceSelectorAtoms = (
|
|
7
|
+
store: Store,
|
|
7
8
|
directDependencyKey: StateKey<unknown>,
|
|
8
9
|
covered: Set<string>,
|
|
9
|
-
store: Store,
|
|
10
10
|
): AtomKey<unknown>[] => {
|
|
11
11
|
const rootKeys: AtomKey<unknown>[] = []
|
|
12
12
|
|
|
13
13
|
const indirectDependencyKeys = getSelectorDependencyKeys(
|
|
14
|
-
directDependencyKey,
|
|
15
14
|
store,
|
|
15
|
+
directDependencyKey,
|
|
16
16
|
)
|
|
17
17
|
while (indirectDependencyKeys.length > 0) {
|
|
18
18
|
// biome-ignore lint/style/noNonNullAssertion: just checked length ^^^
|
|
@@ -24,7 +24,7 @@ export const traceSelectorAtoms = (
|
|
|
24
24
|
|
|
25
25
|
if (!isAtomKey(store, indirectDependencyKey)) {
|
|
26
26
|
indirectDependencyKeys.push(
|
|
27
|
-
...getSelectorDependencyKeys(
|
|
27
|
+
...getSelectorDependencyKeys(store, indirectDependencyKey),
|
|
28
28
|
)
|
|
29
29
|
} else if (!rootKeys.includes(indirectDependencyKey)) {
|
|
30
30
|
rootKeys.push(indirectDependencyKey)
|
|
@@ -39,11 +39,11 @@ export const traceAllSelectorAtoms = (
|
|
|
39
39
|
store: Store,
|
|
40
40
|
): AtomKey<unknown>[] => {
|
|
41
41
|
const selectorKey = selector.key
|
|
42
|
-
const directDependencyKeys = getSelectorDependencyKeys(
|
|
42
|
+
const directDependencyKeys = getSelectorDependencyKeys(store, selectorKey)
|
|
43
43
|
const covered = new Set<string>()
|
|
44
44
|
return directDependencyKeys.flatMap((depKey) =>
|
|
45
45
|
isAtomKey(store, depKey)
|
|
46
46
|
? depKey
|
|
47
|
-
: traceSelectorAtoms(depKey, covered
|
|
47
|
+
: traceSelectorAtoms(store, depKey, covered),
|
|
48
48
|
)
|
|
49
49
|
}
|
|
@@ -1,32 +1,38 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ReadonlyPureSelectorToken, WritableToken } from "atom.io"
|
|
2
2
|
|
|
3
3
|
import { newest } from "../lineage"
|
|
4
4
|
import type { Store } from "../store"
|
|
5
5
|
import { traceSelectorAtoms } from "./trace-selector-atoms"
|
|
6
6
|
|
|
7
7
|
export const updateSelectorAtoms = (
|
|
8
|
+
store: Store,
|
|
9
|
+
selectorType:
|
|
10
|
+
| `readonly_held_selector`
|
|
11
|
+
| `readonly_pure_selector`
|
|
12
|
+
| `writable_held_selector`
|
|
13
|
+
| `writable_pure_selector`,
|
|
8
14
|
selectorKey: string,
|
|
9
|
-
dependency:
|
|
15
|
+
dependency: ReadonlyPureSelectorToken<unknown> | WritableToken<unknown>,
|
|
10
16
|
covered: Set<string>,
|
|
11
|
-
store: Store,
|
|
12
17
|
): void => {
|
|
13
18
|
const target = newest(store)
|
|
14
|
-
|
|
19
|
+
const { type: dependencyType, key: dependencyKey } = dependency
|
|
20
|
+
if (dependencyType === `atom` || dependencyType === `mutable_atom`) {
|
|
15
21
|
target.selectorAtoms.set({
|
|
16
22
|
selectorKey,
|
|
17
|
-
atomKey:
|
|
23
|
+
atomKey: dependencyKey,
|
|
18
24
|
})
|
|
19
25
|
store.logger.info(
|
|
20
26
|
`🔍`,
|
|
21
|
-
|
|
27
|
+
selectorType,
|
|
22
28
|
selectorKey,
|
|
23
|
-
`discovers root atom "${
|
|
29
|
+
`discovers root atom "${dependencyKey}"`,
|
|
24
30
|
)
|
|
25
31
|
} else {
|
|
26
|
-
const rootKeys = traceSelectorAtoms(
|
|
32
|
+
const rootKeys = traceSelectorAtoms(store, dependencyKey, covered)
|
|
27
33
|
store.logger.info(
|
|
28
34
|
`🔍`,
|
|
29
|
-
|
|
35
|
+
selectorType,
|
|
30
36
|
selectorKey,
|
|
31
37
|
`discovers root atoms: [ ${rootKeys
|
|
32
38
|
.map((key) => `"${key}"`)
|
|
@@ -39,5 +45,5 @@ export const updateSelectorAtoms = (
|
|
|
39
45
|
})
|
|
40
46
|
}
|
|
41
47
|
}
|
|
42
|
-
covered.add(
|
|
48
|
+
covered.add(dependencyKey)
|
|
43
49
|
}
|
|
@@ -20,8 +20,10 @@ export const emitUpdate = <T>(
|
|
|
20
20
|
)
|
|
21
21
|
break
|
|
22
22
|
case `atom`:
|
|
23
|
-
case `
|
|
24
|
-
case `
|
|
23
|
+
case `writable_pure_selector`:
|
|
24
|
+
case `readonly_pure_selector`:
|
|
25
|
+
case `writable_held_selector`:
|
|
26
|
+
case `readonly_held_selector`:
|
|
25
27
|
store.logger.info(
|
|
26
28
|
`📢`,
|
|
27
29
|
state.type,
|
|
@@ -5,15 +5,15 @@ import type {
|
|
|
5
5
|
MutableAtomToken,
|
|
6
6
|
ReadableFamilyToken,
|
|
7
7
|
ReadableToken,
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
ReadonlyPureSelectorFamilyToken,
|
|
9
|
+
ReadonlyPureSelectorToken,
|
|
10
10
|
RegularAtomFamilyToken,
|
|
11
11
|
RegularAtomToken,
|
|
12
12
|
SelectorFamilyToken,
|
|
13
13
|
SelectorToken,
|
|
14
14
|
WritableFamilyToken,
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
WritablePureSelectorFamilyToken,
|
|
16
|
+
WritablePureSelectorToken,
|
|
17
17
|
WritableToken,
|
|
18
18
|
} from "atom.io"
|
|
19
19
|
import type { Canonical, Json } from "atom.io/json"
|
|
@@ -23,10 +23,12 @@ import type { Transceiver } from "../mutable"
|
|
|
23
23
|
|
|
24
24
|
export const FAMILY_MEMBER_TOKEN_TYPES = {
|
|
25
25
|
atom_family: `atom`,
|
|
26
|
-
mutable_atom_family: `mutable_atom`,
|
|
27
|
-
selector_family: `selector`,
|
|
28
|
-
readonly_selector_family: `readonly_selector`,
|
|
29
26
|
molecule_family: `molecule`,
|
|
27
|
+
mutable_atom_family: `mutable_atom`,
|
|
28
|
+
readonly_held_selector_family: `readonly_held_selector`,
|
|
29
|
+
readonly_pure_selector_family: `readonly_pure_selector`,
|
|
30
|
+
writable_held_selector_family: `writable_held_selector`,
|
|
31
|
+
writable_pure_selector_family: `writable_pure_selector`,
|
|
30
32
|
} as const
|
|
31
33
|
|
|
32
34
|
export function counterfeit<
|
|
@@ -47,14 +49,14 @@ export function counterfeit<T, K extends Canonical, Key extends K>(
|
|
|
47
49
|
): AtomToken<T>
|
|
48
50
|
|
|
49
51
|
export function counterfeit<T, K extends Canonical, Key extends K>(
|
|
50
|
-
token:
|
|
52
|
+
token: WritablePureSelectorFamilyToken<T, K>,
|
|
51
53
|
key: Key,
|
|
52
|
-
):
|
|
54
|
+
): WritablePureSelectorToken<T>
|
|
53
55
|
|
|
54
56
|
export function counterfeit<T, K extends Canonical, Key extends K>(
|
|
55
|
-
token:
|
|
57
|
+
token: ReadonlyPureSelectorFamilyToken<T, K>,
|
|
56
58
|
key: Key,
|
|
57
|
-
):
|
|
59
|
+
): ReadonlyPureSelectorToken<T>
|
|
58
60
|
|
|
59
61
|
export function counterfeit<T, K extends Canonical, Key extends K>(
|
|
60
62
|
token: SelectorFamilyToken<T, K>,
|
|
@@ -6,8 +6,8 @@ import type {
|
|
|
6
6
|
MutableAtomToken,
|
|
7
7
|
ReadableFamilyToken,
|
|
8
8
|
ReadableToken,
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
ReadonlyPureSelectorFamilyToken,
|
|
10
|
+
ReadonlyPureSelectorToken,
|
|
11
11
|
RegularAtomFamilyToken,
|
|
12
12
|
RegularAtomToken,
|
|
13
13
|
SelectorFamilyToken,
|
|
@@ -16,8 +16,8 @@ import type {
|
|
|
16
16
|
TimelineToken,
|
|
17
17
|
TransactionToken,
|
|
18
18
|
WritableFamilyToken,
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
WritablePureSelectorFamilyToken,
|
|
20
|
+
WritablePureSelectorToken,
|
|
21
21
|
WritableToken,
|
|
22
22
|
} from "atom.io"
|
|
23
23
|
import type { Canonical, Json } from "atom.io/json"
|
|
@@ -31,8 +31,8 @@ import type {
|
|
|
31
31
|
MutableAtomFamily,
|
|
32
32
|
ReadableFamily,
|
|
33
33
|
ReadableState,
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
ReadonlyPureSelector,
|
|
35
|
+
ReadonlyPureSelectorFamily,
|
|
36
36
|
RegularAtom,
|
|
37
37
|
RegularAtomFamily,
|
|
38
38
|
Selector,
|
|
@@ -40,8 +40,8 @@ import type {
|
|
|
40
40
|
Timeline,
|
|
41
41
|
Transceiver,
|
|
42
42
|
WritableFamily,
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
WritablePureSelector,
|
|
44
|
+
WritablePureSelectorFamily,
|
|
45
45
|
WritableState,
|
|
46
46
|
} from ".."
|
|
47
47
|
import type { Transaction } from "../transaction"
|
|
@@ -51,8 +51,12 @@ export function deposit<T extends Transceiver<any>>(
|
|
|
51
51
|
state: MutableAtom<T, any>,
|
|
52
52
|
): MutableAtomToken<T, any>
|
|
53
53
|
export function deposit<T>(state: Atom<T>): AtomToken<T>
|
|
54
|
-
export function deposit<T>(
|
|
55
|
-
|
|
54
|
+
export function deposit<T>(
|
|
55
|
+
state: WritablePureSelector<T>,
|
|
56
|
+
): WritablePureSelectorToken<T>
|
|
57
|
+
export function deposit<T>(
|
|
58
|
+
state: ReadonlyPureSelector<T>,
|
|
59
|
+
): ReadonlyPureSelectorToken<T>
|
|
56
60
|
export function deposit<T>(state: Selector<T>): SelectorToken<T>
|
|
57
61
|
export function deposit<T>(state: WritableState<T>): WritableToken<T>
|
|
58
62
|
export function deposit<T>(state: ReadableState<T>): ReadableToken<T>
|
|
@@ -67,11 +71,11 @@ export function deposit<
|
|
|
67
71
|
>(state: MutableAtomFamily<T, J, K>): MutableAtomFamilyToken<T, J, K>
|
|
68
72
|
export function deposit<T>(state: AtomFamily<T, any>): AtomFamilyToken<T, any>
|
|
69
73
|
export function deposit<T>(
|
|
70
|
-
state:
|
|
71
|
-
):
|
|
74
|
+
state: WritablePureSelectorFamily<T, any>,
|
|
75
|
+
): WritablePureSelectorFamilyToken<T, any>
|
|
72
76
|
export function deposit<T>(
|
|
73
|
-
state:
|
|
74
|
-
):
|
|
77
|
+
state: ReadonlyPureSelectorFamily<T, any>,
|
|
78
|
+
): ReadonlyPureSelectorFamilyToken<T, any>
|
|
75
79
|
export function deposit<T>(
|
|
76
80
|
state: SelectorFamily<T, any>,
|
|
77
81
|
): SelectorFamilyToken<T, any>
|
|
@@ -3,22 +3,21 @@ import type {
|
|
|
3
3
|
Logger,
|
|
4
4
|
MoleculeCreation,
|
|
5
5
|
MoleculeDisposal,
|
|
6
|
-
|
|
6
|
+
SelectorToken,
|
|
7
7
|
TimelineToken,
|
|
8
8
|
TransactionToken,
|
|
9
|
-
WritableSelectorToken,
|
|
10
9
|
} from "atom.io"
|
|
11
10
|
import { AtomIOLogger } from "atom.io"
|
|
12
11
|
import type { Canonical, stringified } from "atom.io/json"
|
|
13
12
|
|
|
14
13
|
import type {
|
|
15
14
|
Atom,
|
|
15
|
+
HeldSelectorFamily,
|
|
16
16
|
MutableAtomFamily,
|
|
17
|
+
PureSelectorFamily,
|
|
17
18
|
ReadonlySelector,
|
|
18
|
-
ReadonlySelectorFamily,
|
|
19
19
|
RegularAtomFamily,
|
|
20
20
|
WritableSelector,
|
|
21
|
-
WritableSelectorFamily,
|
|
22
21
|
} from ".."
|
|
23
22
|
import { isReservedIntrospectionKey } from ".."
|
|
24
23
|
import type { Join } from "../join"
|
|
@@ -47,7 +46,7 @@ export class Store implements Lineage {
|
|
|
47
46
|
public defaults: Map<string, any> = new Map()
|
|
48
47
|
|
|
49
48
|
public atoms: Map<string, Atom<any>> = new Map()
|
|
50
|
-
public
|
|
49
|
+
public writableSelectors: Map<string, WritableSelector<any>> = new Map()
|
|
51
50
|
public readonlySelectors: Map<string, ReadonlySelector<any>> = new Map()
|
|
52
51
|
|
|
53
52
|
public atomsThatAreDefault: Set<string> = new Set()
|
|
@@ -74,10 +73,10 @@ export class Store implements Lineage {
|
|
|
74
73
|
public trackers: Map<string, Tracker<Transceiver<any>>> = new Map()
|
|
75
74
|
public families: Map<
|
|
76
75
|
string,
|
|
76
|
+
| HeldSelectorFamily<any, any>
|
|
77
77
|
| MutableAtomFamily<any, any, any>
|
|
78
|
-
|
|
|
78
|
+
| PureSelectorFamily<any, any>
|
|
79
79
|
| RegularAtomFamily<any, any>
|
|
80
|
-
| WritableSelectorFamily<any, any>
|
|
81
80
|
> = new Map()
|
|
82
81
|
public joins: Map<string, Join<any, any, any, any, any, any>> = new Map()
|
|
83
82
|
|
|
@@ -230,7 +229,7 @@ export class Store implements Lineage {
|
|
|
230
229
|
for (const [, selector] of store.readonlySelectors) {
|
|
231
230
|
selector.install(this)
|
|
232
231
|
}
|
|
233
|
-
for (const [, selector] of store.
|
|
232
|
+
for (const [, selector] of store.writableSelectors) {
|
|
234
233
|
if (mutableHelpers.has(selector.key)) {
|
|
235
234
|
continue
|
|
236
235
|
}
|
|
@@ -249,12 +248,8 @@ export class Store implements Lineage {
|
|
|
249
248
|
export type StoreEventCarrier = {
|
|
250
249
|
atomCreation: Subject<AtomToken<unknown>>
|
|
251
250
|
atomDisposal: Subject<AtomToken<unknown>>
|
|
252
|
-
selectorCreation: Subject<
|
|
253
|
-
|
|
254
|
-
>
|
|
255
|
-
selectorDisposal: Subject<
|
|
256
|
-
ReadonlySelectorToken<unknown> | WritableSelectorToken<unknown>
|
|
257
|
-
>
|
|
251
|
+
selectorCreation: Subject<SelectorToken<unknown>>
|
|
252
|
+
selectorDisposal: Subject<SelectorToken<unknown>>
|
|
258
253
|
timelineCreation: Subject<TimelineToken<unknown>>
|
|
259
254
|
transactionCreation: Subject<TransactionToken<Func>>
|
|
260
255
|
transactionApplying: StatefulSubject<TransactionProgress<Func> | null>
|