atom.io 0.6.2 → 0.6.3

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.
Files changed (110) hide show
  1. package/dist/index.d.mts +2 -2
  2. package/dist/index.d.ts +2 -2
  3. package/dist/index.js +7 -2
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.mjs +7 -2
  6. package/dist/index.mjs.map +1 -1
  7. package/json/dist/index.d.mts +18 -0
  8. package/json/dist/index.d.ts +18 -0
  9. package/json/dist/index.js +51 -0
  10. package/json/dist/index.js.map +1 -0
  11. package/json/dist/index.mjs +15 -0
  12. package/json/dist/index.mjs.map +1 -0
  13. package/package.json +13 -3
  14. package/react/dist/index.d.mts +24 -0
  15. package/react/dist/index.d.ts +24 -0
  16. package/react/dist/index.js +83 -0
  17. package/react/dist/index.js.map +1 -0
  18. package/react/dist/index.mjs +41 -0
  19. package/react/dist/index.mjs.map +1 -0
  20. package/react-devtools/dist/index.css +26 -0
  21. package/react-devtools/dist/index.css.map +1 -0
  22. package/react-devtools/dist/index.d.mts +15 -0
  23. package/react-devtools/dist/index.d.ts +15 -0
  24. package/react-devtools/dist/index.js +1596 -0
  25. package/react-devtools/dist/index.js.map +1 -0
  26. package/react-devtools/dist/index.mjs +1568 -0
  27. package/react-devtools/dist/index.mjs.map +1 -0
  28. package/realtime/dist/index.d.mts +27 -0
  29. package/realtime/dist/index.d.ts +27 -0
  30. package/realtime/dist/index.js +191 -0
  31. package/realtime/dist/index.js.map +1 -0
  32. package/realtime/dist/index.mjs +152 -0
  33. package/realtime/dist/index.mjs.map +1 -0
  34. package/realtime-react/dist/index.d.mts +45 -0
  35. package/realtime-react/dist/index.d.ts +45 -0
  36. package/realtime-react/dist/index.js +213 -0
  37. package/realtime-react/dist/index.js.map +1 -0
  38. package/realtime-react/dist/index.mjs +168 -0
  39. package/realtime-react/dist/index.mjs.map +1 -0
  40. package/realtime-testing/dist/index.d.mts +49 -0
  41. package/realtime-testing/dist/index.d.ts +49 -0
  42. package/realtime-testing/dist/index.js +153 -0
  43. package/realtime-testing/dist/index.js.map +1 -0
  44. package/realtime-testing/dist/index.mjs +117 -0
  45. package/realtime-testing/dist/index.mjs.map +1 -0
  46. package/realtime-testing/package.json +15 -0
  47. package/src/atom.ts +15 -15
  48. package/src/index.ts +59 -59
  49. package/src/internal/atom-internal.ts +36 -36
  50. package/src/internal/families-internal.ts +114 -114
  51. package/src/internal/get.ts +83 -83
  52. package/src/internal/is-default.ts +17 -17
  53. package/src/internal/meta/attach-meta.ts +7 -7
  54. package/src/internal/meta/meta-state.ts +115 -115
  55. package/src/internal/operation.ts +93 -93
  56. package/src/internal/selector/create-read-write-selector.ts +46 -46
  57. package/src/internal/selector/create-readonly-selector.ts +37 -37
  58. package/src/internal/selector/lookup-selector-sources.ts +9 -9
  59. package/src/internal/selector/register-selector.ts +44 -44
  60. package/src/internal/selector/trace-selector-atoms.ts +30 -30
  61. package/src/internal/selector/update-selector-atoms.ts +25 -25
  62. package/src/internal/selector-internal.ts +37 -37
  63. package/src/internal/set.ts +78 -78
  64. package/src/internal/store.ts +118 -118
  65. package/src/internal/subscribe-internal.ts +62 -62
  66. package/src/internal/time-travel-internal.ts +76 -76
  67. package/src/internal/timeline/add-atom-to-timeline.ts +158 -153
  68. package/src/internal/timeline-internal.ts +80 -80
  69. package/src/internal/transaction/abort-transaction.ts +8 -8
  70. package/src/internal/transaction/apply-transaction.ts +41 -41
  71. package/src/internal/transaction/build-transaction.ts +28 -28
  72. package/src/internal/transaction/index.ts +7 -7
  73. package/src/internal/transaction/redo-transaction.ts +13 -13
  74. package/src/internal/transaction/undo-transaction.ts +13 -13
  75. package/src/internal/transaction-internal.ts +48 -48
  76. package/src/json/select-json.ts +12 -12
  77. package/src/logger.ts +30 -30
  78. package/src/react/store-context.tsx +4 -4
  79. package/src/react/store-hooks.ts +18 -18
  80. package/src/react-devtools/AtomIODevtools.tsx +83 -82
  81. package/src/react-devtools/StateEditor.tsx +53 -53
  82. package/src/react-devtools/TokenList.tsx +47 -42
  83. package/src/react-explorer/AtomIOExplorer.tsx +197 -185
  84. package/src/react-explorer/explorer-effects.ts +11 -11
  85. package/src/react-explorer/explorer-states.ts +186 -193
  86. package/src/react-explorer/index.ts +11 -11
  87. package/src/react-explorer/space-states.ts +48 -50
  88. package/src/react-explorer/view-states.ts +25 -25
  89. package/src/realtime/hook-composition/expose-family.ts +81 -81
  90. package/src/realtime/hook-composition/expose-single.ts +26 -26
  91. package/src/realtime/hook-composition/expose-timeline.ts +60 -0
  92. package/src/realtime/hook-composition/index.ts +2 -2
  93. package/src/realtime/hook-composition/receive-state.ts +18 -18
  94. package/src/realtime/hook-composition/receive-transaction.ts +8 -8
  95. package/src/realtime-react/realtime-context.tsx +17 -17
  96. package/src/realtime-react/realtime-hooks.ts +17 -17
  97. package/src/realtime-react/realtime-state.ts +4 -4
  98. package/src/realtime-react/use-pull-family-member.ts +15 -15
  99. package/src/realtime-react/use-pull-family.ts +13 -13
  100. package/src/realtime-react/use-pull.ts +12 -12
  101. package/src/realtime-react/use-push.ts +15 -15
  102. package/src/realtime-react/use-server-action.ts +21 -21
  103. package/src/realtime-testing/index.ts +1 -0
  104. package/src/realtime-testing/setup-realtime-test.tsx +160 -0
  105. package/src/selector.ts +25 -25
  106. package/src/silo.ts +38 -38
  107. package/src/subscribe.ts +68 -68
  108. package/src/timeline.ts +13 -13
  109. package/src/transaction.ts +28 -28
  110. package/src/web-effects/storage.ts +17 -17
@@ -3,50 +3,50 @@ import * as Rx from "rxjs"
3
3
 
4
4
  import { registerSelector } from "./register-selector"
5
5
  import type {
6
- FamilyMetadata,
7
- ReadonlySelectorOptions,
8
- ReadonlySelectorToken,
9
- Store,
6
+ FamilyMetadata,
7
+ ReadonlySelectorOptions,
8
+ ReadonlySelectorToken,
9
+ Store,
10
10
  } from "../.."
11
11
  import { cacheValue } from "../operation"
12
12
  import { selector__INTERNAL, type ReadonlySelector } from "../selector-internal"
13
13
  import type { StoreCore } from "../store"
14
14
 
15
15
  export const createReadonlySelector = <T>(
16
- options: ReadonlySelectorOptions<T>,
17
- family: FamilyMetadata | undefined,
18
- store: Store,
19
- core: StoreCore
16
+ options: ReadonlySelectorOptions<T>,
17
+ family: FamilyMetadata | undefined,
18
+ store: Store,
19
+ core: StoreCore,
20
20
  ): ReadonlySelectorToken<T> => {
21
- const subject = new Rx.Subject<{ newValue: T; oldValue: T }>()
21
+ const subject = new Rx.Subject<{ newValue: T; oldValue: T }>()
22
22
 
23
- const { get } = registerSelector(options.key, store)
24
- const getSelf = () => {
25
- const value = options.get({ get })
26
- cacheValue(options.key, value, store)
27
- return value
28
- }
23
+ const { get } = registerSelector(options.key, store)
24
+ const getSelf = () => {
25
+ const value = options.get({ get })
26
+ cacheValue(options.key, value, store)
27
+ return value
28
+ }
29
29
 
30
- const readonlySelector: ReadonlySelector<T> = {
31
- ...options,
32
- subject,
33
- install: (s: Store) => selector__INTERNAL(options, family, s),
34
- get: getSelf,
35
- type: `readonly_selector`,
36
- ...(family && { family }),
37
- }
38
- core.readonlySelectors = HAMT.set(
39
- options.key,
40
- readonlySelector,
41
- core.readonlySelectors
42
- )
43
- const initialValue = getSelf()
44
- store.config.logger?.info(` ✨ "${options.key}" =`, initialValue)
45
- const token: ReadonlySelectorToken<T> = {
46
- key: options.key,
47
- type: `readonly_selector`,
48
- family,
49
- }
50
- store.subject.selectorCreation.next(token)
51
- return token
30
+ const readonlySelector: ReadonlySelector<T> = {
31
+ ...options,
32
+ subject,
33
+ install: (s: Store) => selector__INTERNAL(options, family, s),
34
+ get: getSelf,
35
+ type: `readonly_selector`,
36
+ ...(family && { family }),
37
+ }
38
+ core.readonlySelectors = HAMT.set(
39
+ options.key,
40
+ readonlySelector,
41
+ core.readonlySelectors,
42
+ )
43
+ const initialValue = getSelf()
44
+ store.config.logger?.info(` ✨ "${options.key}" =`, initialValue)
45
+ const token: ReadonlySelectorToken<T> = {
46
+ key: options.key,
47
+ type: `readonly_selector`,
48
+ family,
49
+ }
50
+ store.subject.selectorCreation.next(token)
51
+ return token
52
52
  }
@@ -3,14 +3,14 @@ import { target, lookup } from ".."
3
3
  import type { AtomToken, ReadonlySelectorToken, SelectorToken } from "../.."
4
4
 
5
5
  export const lookupSelectorSources = (
6
- key: string,
7
- store: Store
6
+ key: string,
7
+ store: Store,
8
8
  ): (
9
- | AtomToken<unknown>
10
- | ReadonlySelectorToken<unknown>
11
- | SelectorToken<unknown>
9
+ | AtomToken<unknown>
10
+ | ReadonlySelectorToken<unknown>
11
+ | SelectorToken<unknown>
12
12
  )[] =>
13
- target(store)
14
- .selectorGraph.getRelations(key)
15
- .filter(({ source }) => source !== key)
16
- .map(({ source }) => lookup(source, store))
13
+ target(store)
14
+ .selectorGraph.getRelations(key)
15
+ .filter(({ source }) => source !== key)
16
+ .map(({ source }) => lookup(source, store))
@@ -7,51 +7,51 @@ import { IMPLICIT } from "../store"
7
7
  import { target } from "../transaction-internal"
8
8
 
9
9
  export const registerSelector = (
10
- selectorKey: string,
11
- store: Store = IMPLICIT.STORE
10
+ selectorKey: string,
11
+ store: Store = IMPLICIT.STORE,
12
12
  ): Transactors => ({
13
- get: (dependency) => {
14
- const core = target(store)
15
- const alreadyRegistered = core.selectorGraph
16
- .getRelations(selectorKey)
17
- .some(({ source }) => source === dependency.key)
13
+ get: (dependency) => {
14
+ const core = target(store)
15
+ const alreadyRegistered = core.selectorGraph
16
+ .getRelations(selectorKey)
17
+ .some(({ source }) => source === dependency.key)
18
18
 
19
- const dependencyState = withdraw(dependency, store)
20
- if (dependencyState === null) {
21
- throw new Error(
22
- `State "${dependency.key}" not found in this store. Did you forget to initialize with the "atom" or "selector" function?`
23
- )
24
- }
25
- const dependencyValue = getState__INTERNAL(dependencyState, store)
19
+ const dependencyState = withdraw(dependency, store)
20
+ if (dependencyState === null) {
21
+ throw new Error(
22
+ `State "${dependency.key}" not found in this store. Did you forget to initialize with the "atom" or "selector" function?`,
23
+ )
24
+ }
25
+ const dependencyValue = getState__INTERNAL(dependencyState, store)
26
26
 
27
- if (alreadyRegistered) {
28
- store.config.logger?.info(
29
- ` || ${selectorKey} <- ${dependency.key} =`,
30
- dependencyValue
31
- )
32
- } else {
33
- store.config.logger?.info(
34
- `🔌 registerSelector "${selectorKey}" <- ( "${dependency.key}" =`,
35
- dependencyValue,
36
- `)`
37
- )
38
- core.selectorGraph = core.selectorGraph.set(
39
- { from: dependency.key, to: selectorKey },
40
- {
41
- source: dependency.key,
42
- }
43
- )
44
- }
45
- updateSelectorAtoms(selectorKey, dependency, store)
46
- return dependencyValue
47
- },
48
- set: (stateToken, newValue) => {
49
- const state = withdraw(stateToken, store)
50
- if (state === null) {
51
- throw new Error(
52
- `State "${stateToken.key}" not found in this store. Did you forget to initialize with the "atom" or "selector" function?`
53
- )
54
- }
55
- setState__INTERNAL(state, newValue, store)
56
- },
27
+ if (alreadyRegistered) {
28
+ store.config.logger?.info(
29
+ ` || ${selectorKey} <- ${dependency.key} =`,
30
+ dependencyValue,
31
+ )
32
+ } else {
33
+ store.config.logger?.info(
34
+ `🔌 registerSelector "${selectorKey}" <- ( "${dependency.key}" =`,
35
+ dependencyValue,
36
+ `)`,
37
+ )
38
+ core.selectorGraph = core.selectorGraph.set(
39
+ { from: dependency.key, to: selectorKey },
40
+ {
41
+ source: dependency.key,
42
+ },
43
+ )
44
+ }
45
+ updateSelectorAtoms(selectorKey, dependency, store)
46
+ return dependencyValue
47
+ },
48
+ set: (stateToken, newValue) => {
49
+ const state = withdraw(stateToken, store)
50
+ if (state === null) {
51
+ throw new Error(
52
+ `State "${stateToken.key}" not found in this store. Did you forget to initialize with the "atom" or "selector" function?`,
53
+ )
54
+ }
55
+ setState__INTERNAL(state, newValue, store)
56
+ },
57
57
  })
@@ -2,42 +2,42 @@ import { lookupSelectorSources } from "./lookup-selector-sources"
2
2
  import type { Store, AtomToken, ReadonlySelectorToken, StateToken } from "../.."
3
3
 
4
4
  export const traceSelectorAtoms = (
5
- selectorKey: string,
6
- dependency: ReadonlySelectorToken<unknown> | StateToken<unknown>,
7
- store: Store
5
+ selectorKey: string,
6
+ dependency: ReadonlySelectorToken<unknown> | StateToken<unknown>,
7
+ store: Store,
8
8
  ): AtomToken<unknown>[] => {
9
- const roots: AtomToken<unknown>[] = []
9
+ const roots: AtomToken<unknown>[] = []
10
10
 
11
- const sources = lookupSelectorSources(dependency.key, store)
12
- let depth = 0
13
- while (sources.length > 0) {
14
- /* eslint-disable-next-line @typescript-eslint/no-non-null-assertion */
15
- const source = sources.shift()!
16
- ++depth
17
- if (depth > 999) {
18
- throw new Error(
19
- `Maximum selector dependency depth exceeded in selector "${selectorKey}".`
20
- )
21
- }
11
+ const sources = lookupSelectorSources(dependency.key, store)
12
+ let depth = 0
13
+ while (sources.length > 0) {
14
+ // rome-ignore lint/style/noNonNullAssertion: just checked length ^^^
15
+ const source = sources.shift()!
16
+ ++depth
17
+ if (depth > 999) {
18
+ throw new Error(
19
+ `Maximum selector dependency depth exceeded in selector "${selectorKey}".`,
20
+ )
21
+ }
22
22
 
23
- if (source.type !== `atom`) {
24
- sources.push(...lookupSelectorSources(source.key, store))
25
- } else {
26
- roots.push(source)
27
- }
28
- }
23
+ if (source.type !== `atom`) {
24
+ sources.push(...lookupSelectorSources(source.key, store))
25
+ } else {
26
+ roots.push(source)
27
+ }
28
+ }
29
29
 
30
- return roots
30
+ return roots
31
31
  }
32
32
 
33
33
  export const traceAllSelectorAtoms = (
34
- selectorKey: string,
35
- store: Store
34
+ selectorKey: string,
35
+ store: Store,
36
36
  ): AtomToken<unknown>[] => {
37
- const sources = lookupSelectorSources(selectorKey, store)
38
- return sources.flatMap((source) =>
39
- source.type === `atom`
40
- ? source
41
- : traceSelectorAtoms(selectorKey, source, store)
42
- )
37
+ const sources = lookupSelectorSources(selectorKey, store)
38
+ return sources.flatMap((source) =>
39
+ source.type === `atom`
40
+ ? source
41
+ : traceSelectorAtoms(selectorKey, source, store),
42
+ )
43
43
  }
@@ -4,30 +4,30 @@ import { target } from ".."
4
4
  import type { ReadonlySelectorToken, StateToken } from "../.."
5
5
 
6
6
  export const updateSelectorAtoms = (
7
- selectorKey: string,
8
- dependency: ReadonlySelectorToken<unknown> | StateToken<unknown>,
9
- store: Store
7
+ selectorKey: string,
8
+ dependency: ReadonlySelectorToken<unknown> | StateToken<unknown>,
9
+ store: Store,
10
10
  ): void => {
11
- const core = target(store)
12
- if (dependency.type === `atom`) {
13
- core.selectorAtoms = core.selectorAtoms.set({
14
- selectorKey,
15
- atomKey: dependency.key,
16
- })
17
- store.config.logger?.info(
18
- ` || adding root for "${selectorKey}": ${dependency.key}`
19
- )
20
- return
21
- }
22
- const roots = traceSelectorAtoms(selectorKey, dependency, store)
23
- store.config.logger?.info(
24
- ` || adding roots for "${selectorKey}":`,
25
- roots.map((r) => r.key)
26
- )
27
- for (const root of roots) {
28
- core.selectorAtoms = core.selectorAtoms.set({
29
- selectorKey,
30
- atomKey: root.key,
31
- })
32
- }
11
+ const core = target(store)
12
+ if (dependency.type === `atom`) {
13
+ core.selectorAtoms = core.selectorAtoms.set({
14
+ selectorKey,
15
+ atomKey: dependency.key,
16
+ })
17
+ store.config.logger?.info(
18
+ ` || adding root for "${selectorKey}": ${dependency.key}`,
19
+ )
20
+ return
21
+ }
22
+ const roots = traceSelectorAtoms(selectorKey, dependency, store)
23
+ store.config.logger?.info(
24
+ ` || adding roots for "${selectorKey}":`,
25
+ roots.map((r) => r.key),
26
+ )
27
+ for (const root of roots) {
28
+ core.selectorAtoms = core.selectorAtoms.set({
29
+ selectorKey,
30
+ atomKey: root.key,
31
+ })
32
+ }
33
33
  }
@@ -6,56 +6,56 @@ import { target, IMPLICIT } from "."
6
6
  import { createReadWriteSelector } from "./selector/create-read-write-selector"
7
7
  import { createReadonlySelector } from "./selector/create-readonly-selector"
8
8
  import type {
9
- FamilyMetadata,
10
- ReadonlySelectorOptions,
11
- ReadonlySelectorToken,
12
- SelectorOptions,
13
- SelectorToken,
9
+ FamilyMetadata,
10
+ ReadonlySelectorOptions,
11
+ ReadonlySelectorToken,
12
+ SelectorOptions,
13
+ SelectorToken,
14
14
  } from ".."
15
15
 
16
16
  export type Selector<T> = {
17
- key: string
18
- type: `selector`
19
- family?: FamilyMetadata
20
- install: (store: Store) => void
21
- subject: Rx.Subject<{ newValue: T; oldValue: T }>
22
- get: () => T
23
- set: (newValue: T | ((oldValue: T) => T)) => void
17
+ key: string
18
+ type: `selector`
19
+ family?: FamilyMetadata
20
+ install: (store: Store) => void
21
+ subject: Rx.Subject<{ newValue: T; oldValue: T }>
22
+ get: () => T
23
+ set: (newValue: T | ((oldValue: T) => T)) => void
24
24
  }
25
25
  export type ReadonlySelector<T> = {
26
- key: string
27
- type: `readonly_selector`
28
- family?: FamilyMetadata
29
- install: (store: Store) => void
30
- subject: Rx.Subject<{ newValue: T; oldValue: T }>
31
- get: () => T
26
+ key: string
27
+ type: `readonly_selector`
28
+ family?: FamilyMetadata
29
+ install: (store: Store) => void
30
+ subject: Rx.Subject<{ newValue: T; oldValue: T }>
31
+ get: () => T
32
32
  }
33
33
 
34
34
  export function selector__INTERNAL<T>(
35
- options: SelectorOptions<T>,
36
- family?: FamilyMetadata,
37
- store?: Store
35
+ options: SelectorOptions<T>,
36
+ family?: FamilyMetadata,
37
+ store?: Store,
38
38
  ): SelectorToken<T>
39
39
  export function selector__INTERNAL<T>(
40
- options: ReadonlySelectorOptions<T>,
41
- family?: FamilyMetadata,
42
- store?: Store
40
+ options: ReadonlySelectorOptions<T>,
41
+ family?: FamilyMetadata,
42
+ store?: Store,
43
43
  ): ReadonlySelectorToken<T>
44
44
  export function selector__INTERNAL<T>(
45
- options: ReadonlySelectorOptions<T> | SelectorOptions<T>,
46
- family?: FamilyMetadata,
47
- store: Store = IMPLICIT.STORE
45
+ options: ReadonlySelectorOptions<T> | SelectorOptions<T>,
46
+ family?: FamilyMetadata,
47
+ store: Store = IMPLICIT.STORE,
48
48
  ): ReadonlySelectorToken<T> | SelectorToken<T> {
49
- const core = target(store)
49
+ const core = target(store)
50
50
 
51
- if (HAMT.has(options.key, core.selectors)) {
52
- store.config.logger?.error(
53
- `Key "${options.key}" already exists in the store.`
54
- )
55
- }
51
+ if (HAMT.has(options.key, core.selectors)) {
52
+ store.config.logger?.error(
53
+ `Key "${options.key}" already exists in the store.`,
54
+ )
55
+ }
56
56
 
57
- if (!(`set` in options)) {
58
- return createReadonlySelector(options, family, store, core)
59
- }
60
- return createReadWriteSelector(options, family, store, core)
57
+ if (!(`set` in options)) {
58
+ return createReadonlySelector(options, family, store, core)
59
+ }
60
+ return createReadWriteSelector(options, family, store, core)
61
61
  }
@@ -4,99 +4,99 @@ import { become } from "~/packages/anvl/src/function"
4
4
 
5
5
  import type { Atom, Selector, Store } from "."
6
6
  import {
7
- IMPLICIT,
8
- cacheValue,
9
- emitUpdate,
10
- evictCachedValue,
11
- getState__INTERNAL,
12
- isAtomDefault,
13
- isDone,
14
- markAtomAsNotDefault,
15
- markDone,
16
- stowUpdate,
17
- target,
7
+ IMPLICIT,
8
+ cacheValue,
9
+ emitUpdate,
10
+ evictCachedValue,
11
+ getState__INTERNAL,
12
+ isAtomDefault,
13
+ isDone,
14
+ markAtomAsNotDefault,
15
+ markDone,
16
+ stowUpdate,
17
+ target,
18
18
  } from "."
19
19
 
20
20
  export const evictDownStream = <T>(
21
- state: Atom<T>,
22
- store: Store = IMPLICIT.STORE
21
+ state: Atom<T>,
22
+ store: Store = IMPLICIT.STORE,
23
23
  ): void => {
24
- const core = target(store)
25
- const downstream = core.selectorAtoms.getRelations(state.key)
26
- const downstreamKeys = downstream.map(({ id }) => id)
27
- store.config.logger?.info(
28
- ` || ${downstreamKeys.length} downstream:`,
29
- downstreamKeys
30
- )
31
- if (core.operation.open) {
32
- store.config.logger?.info(` ||`, [...core.operation.done], `already done`)
33
- }
34
- downstream.forEach(({ id: stateKey }) => {
35
- if (isDone(stateKey, store)) {
36
- store.config.logger?.info(` || ${stateKey} already done`)
37
- return
38
- }
39
- const state =
40
- HAMT.get(stateKey, core.selectors) ??
41
- HAMT.get(stateKey, core.readonlySelectors)
42
- if (!state) {
43
- store.config.logger?.info(
44
- ` || ${stateKey} is an atom, and can't be downstream`
45
- )
46
- return
47
- }
48
- evictCachedValue(stateKey, store)
49
- store.config.logger?.info(` xx evicted "${stateKey}"`)
24
+ const core = target(store)
25
+ const downstream = core.selectorAtoms.getRelations(state.key)
26
+ const downstreamKeys = downstream.map(({ id }) => id)
27
+ store.config.logger?.info(
28
+ ` || ${downstreamKeys.length} downstream:`,
29
+ downstreamKeys,
30
+ )
31
+ if (core.operation.open) {
32
+ store.config.logger?.info(` ||`, [...core.operation.done], `already done`)
33
+ }
34
+ downstream.forEach(({ id: stateKey }) => {
35
+ if (isDone(stateKey, store)) {
36
+ store.config.logger?.info(` || ${stateKey} already done`)
37
+ return
38
+ }
39
+ const state =
40
+ HAMT.get(stateKey, core.selectors) ??
41
+ HAMT.get(stateKey, core.readonlySelectors)
42
+ if (!state) {
43
+ store.config.logger?.info(
44
+ ` || ${stateKey} is an atom, and can't be downstream`,
45
+ )
46
+ return
47
+ }
48
+ evictCachedValue(stateKey, store)
49
+ store.config.logger?.info(` xx evicted "${stateKey}"`)
50
50
 
51
- markDone(stateKey, store)
52
- })
51
+ markDone(stateKey, store)
52
+ })
53
53
  }
54
54
 
55
55
  export const setAtomState = <T>(
56
- atom: Atom<T>,
57
- next: T | ((oldValue: T) => T),
58
- store: Store = IMPLICIT.STORE
56
+ atom: Atom<T>,
57
+ next: T | ((oldValue: T) => T),
58
+ store: Store = IMPLICIT.STORE,
59
59
  ): void => {
60
- const oldValue = getState__INTERNAL(atom, store)
61
- const newValue = become(next)(oldValue)
62
- store.config.logger?.info(`<< setting atom "${atom.key}" to`, newValue)
63
- cacheValue(atom.key, newValue, store)
64
- if (isAtomDefault(atom.key, store)) {
65
- markAtomAsNotDefault(atom.key, store)
66
- }
67
- markDone(atom.key, store)
68
- store.config.logger?.info(
69
- ` || evicting caches downstream from "${atom.key}"`
70
- )
71
- evictDownStream(atom, store)
72
- const update = { oldValue, newValue }
73
- if (store.transactionStatus.phase !== `building`) {
74
- emitUpdate(atom, update, store)
75
- } else {
76
- stowUpdate(atom, update, store)
77
- }
60
+ const oldValue = getState__INTERNAL(atom, store)
61
+ const newValue = become(next)(oldValue)
62
+ store.config.logger?.info(`<< setting atom "${atom.key}" to`, newValue)
63
+ cacheValue(atom.key, newValue, store)
64
+ if (isAtomDefault(atom.key, store)) {
65
+ markAtomAsNotDefault(atom.key, store)
66
+ }
67
+ markDone(atom.key, store)
68
+ store.config.logger?.info(
69
+ ` || evicting caches downstream from "${atom.key}"`,
70
+ )
71
+ evictDownStream(atom, store)
72
+ const update = { oldValue, newValue }
73
+ if (store.transactionStatus.phase !== `building`) {
74
+ emitUpdate(atom, update, store)
75
+ } else {
76
+ stowUpdate(atom, update, store)
77
+ }
78
78
  }
79
79
  export const setSelectorState = <T>(
80
- selector: Selector<T>,
81
- next: T | ((oldValue: T) => T),
82
- store: Store = IMPLICIT.STORE
80
+ selector: Selector<T>,
81
+ next: T | ((oldValue: T) => T),
82
+ store: Store = IMPLICIT.STORE,
83
83
  ): void => {
84
- const oldValue = getState__INTERNAL(selector, store)
85
- const newValue = become(next)(oldValue)
84
+ const oldValue = getState__INTERNAL(selector, store)
85
+ const newValue = become(next)(oldValue)
86
86
 
87
- store.config.logger?.info(`<< setting selector "${selector.key}" to`, newValue)
88
- store.config.logger?.info(` || propagating change made to "${selector.key}"`)
87
+ store.config.logger?.info(`<< setting selector "${selector.key}" to`, newValue)
88
+ store.config.logger?.info(` || propagating change made to "${selector.key}"`)
89
89
 
90
- selector.set(newValue)
90
+ selector.set(newValue)
91
91
  }
92
92
  export const setState__INTERNAL = <T>(
93
- state: Atom<T> | Selector<T>,
94
- value: T | ((oldValue: T) => T),
95
- store: Store = IMPLICIT.STORE
93
+ state: Atom<T> | Selector<T>,
94
+ value: T | ((oldValue: T) => T),
95
+ store: Store = IMPLICIT.STORE,
96
96
  ): void => {
97
- if (`set` in state) {
98
- setSelectorState(state, value, store)
99
- } else {
100
- setAtomState(state, value, store)
101
- }
97
+ if (`set` in state) {
98
+ setSelectorState(state, value, store)
99
+ } else {
100
+ setAtomState(state, value, store)
101
+ }
102
102
  }