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.
Files changed (81) hide show
  1. package/dist/index.cjs.map +1 -1
  2. package/dist/index.d.cts +6 -3
  3. package/dist/index.d.ts +6 -3
  4. package/dist/index.js.map +1 -1
  5. package/dist/metafile-cjs.json +1 -1
  6. package/dist/metafile-esm.json +1 -1
  7. package/internal/dist/index.cjs +1561 -1512
  8. package/internal/dist/index.cjs.map +1 -1
  9. package/internal/dist/index.d.cts +24 -14
  10. package/internal/dist/index.d.ts +24 -14
  11. package/internal/dist/index.js +1560 -1513
  12. package/internal/dist/index.js.map +1 -1
  13. package/internal/dist/metafile-cjs.json +1 -1
  14. package/internal/dist/metafile-esm.json +1 -1
  15. package/internal/src/atom/create-atom.ts +4 -4
  16. package/internal/src/atom/delete-atom.ts +11 -11
  17. package/internal/src/atom/is-default.ts +5 -5
  18. package/internal/src/caching.ts +12 -10
  19. package/internal/src/families/create-atom-family.ts +3 -3
  20. package/internal/src/families/create-readonly-selector-family.ts +3 -3
  21. package/internal/src/families/create-selector-family.ts +4 -4
  22. package/internal/src/index.ts +1 -0
  23. package/internal/src/keys.ts +4 -4
  24. package/internal/src/lazy-map.ts +6 -2
  25. package/internal/src/lineage.ts +18 -0
  26. package/internal/src/mutable/create-mutable-atom.ts +5 -4
  27. package/internal/src/mutable/get-json-family.ts +3 -3
  28. package/internal/src/mutable/tracker.ts +13 -10
  29. package/internal/src/operation.ts +19 -19
  30. package/internal/src/selector/create-read-write-selector.ts +5 -4
  31. package/internal/src/selector/create-readonly-selector.ts +4 -3
  32. package/internal/src/selector/create-selector.ts +6 -6
  33. package/internal/src/selector/delete-selector.ts +10 -10
  34. package/internal/src/selector/get-selector-dependency-keys.ts +2 -2
  35. package/internal/src/selector/register-selector.ts +4 -4
  36. package/internal/src/selector/update-selector-atoms.ts +2 -2
  37. package/internal/src/set-state/copy-mutable-if-needed.ts +4 -3
  38. package/internal/src/set-state/copy-mutable-in-transaction.ts +10 -16
  39. package/internal/src/set-state/copy-mutable-into-new-store.ts +1 -1
  40. package/internal/src/set-state/evict-downstream.ts +5 -5
  41. package/internal/src/set-state/set-atom.ts +6 -1
  42. package/internal/src/set-state/stow-update.ts +7 -2
  43. package/internal/src/store/store.ts +31 -24
  44. package/internal/src/store/withdraw-new-family-member.ts +3 -4
  45. package/internal/src/store/withdraw.ts +58 -59
  46. package/internal/src/subject.ts +14 -0
  47. package/internal/src/subscribe/recall-state.ts +5 -5
  48. package/internal/src/timeline/add-atom-to-timeline.ts +37 -27
  49. package/internal/src/timeline/create-timeline.ts +6 -8
  50. package/internal/src/timeline/time-travel.ts +22 -4
  51. package/internal/src/transaction/abort-transaction.ts +5 -3
  52. package/internal/src/transaction/apply-transaction.ts +80 -58
  53. package/internal/src/transaction/build-transaction.ts +33 -23
  54. package/internal/src/transaction/create-transaction.ts +6 -9
  55. package/internal/src/transaction/index.ts +2 -10
  56. package/internal/src/transaction/redo-transaction.ts +15 -10
  57. package/internal/src/transaction/undo-transaction.ts +15 -16
  58. package/introspection/dist/index.cjs +2 -2
  59. package/introspection/dist/index.cjs.map +1 -1
  60. package/introspection/dist/index.js +3 -3
  61. package/introspection/dist/index.js.map +1 -1
  62. package/introspection/src/attach-atom-index.ts +2 -2
  63. package/introspection/src/attach-selector-index.ts +2 -2
  64. package/package.json +3 -3
  65. package/react-devtools/dist/index.cjs +22 -8
  66. package/react-devtools/dist/index.cjs.map +1 -1
  67. package/react-devtools/dist/index.d.cts +17 -9
  68. package/react-devtools/dist/index.d.ts +17 -9
  69. package/react-devtools/dist/index.js +22 -8
  70. package/react-devtools/dist/index.js.map +1 -1
  71. package/react-devtools/dist/metafile-cjs.json +1 -1
  72. package/react-devtools/dist/metafile-esm.json +1 -1
  73. package/react-devtools/src/Updates.tsx +22 -10
  74. package/src/transaction.ts +7 -2
  75. package/transceivers/set-rtx/dist/index.cjs.map +1 -1
  76. package/transceivers/set-rtx/dist/index.d.cts +2 -2
  77. package/transceivers/set-rtx/dist/index.d.ts +2 -2
  78. package/transceivers/set-rtx/dist/index.js.map +1 -1
  79. package/transceivers/set-rtx/dist/metafile-cjs.json +1 -1
  80. package/transceivers/set-rtx/dist/metafile-esm.json +1 -1
  81. 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 core = target(store)
58
- core.families.set(options.key, atomFamily)
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 = core.readonlySelectors.get(fullKey)
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 core = target(store)
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 = core.selectors.get(fullKey)
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
- core.families.set(options.key, selectorFamily)
65
+ target.families.set(options.key, selectorFamily)
66
66
  return selectorFamily
67
67
  }
@@ -1,5 +1,6 @@
1
1
  export * from "./atom"
2
2
  export * from "./caching"
3
+ export * from "./lineage"
3
4
  export * from "./families"
4
5
  export * from "./future"
5
6
  export * from "./keys"
@@ -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
- target(store).atoms.has(key)
12
+ newest(store).atoms.has(key)
13
13
  export const isSelectorKey = (
14
14
  key: string,
15
15
  store: Store,
16
- ): key is SelectorKey<unknown> => target(store).selectors.has(key)
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
- target(store).readonlySelectors.has(key)
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 = (
@@ -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 _has(key: K): boolean {
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 = target(store).trackers.has(coreState.key)
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
- store.transactionStatus.phase === `idle`
38
+ target.transactionMeta === null
38
39
  ? `main`
39
- : store.transactionStatus.key
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 core = target(store)
16
+ const target = newest(store)
17
17
  const key = `${mutableAtomFamily.key}:JSON`
18
- const jsonFamily: SelectorFamily<SerializableCore, Key> = core.families.get(
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
- store.transactionStatus.phase === `idle`
54
+ target.transactionMeta === null
54
55
  ? `main`
55
- : store.transactionStatus.key
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
- store.transactionStatus.phase === `idle`
76
+ target.transactionMeta === null
75
77
  ? `main`
76
- : store.transactionStatus.key
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
- this.latestUpdateState = this.initializeState(mutableState, store)
162
- this.observeCore(mutableState, this.latestUpdateState, store)
163
- this.updateCore(mutableState, this.latestUpdateState, store)
164
- const core = target(store)
165
- core.trackers.set(mutableState.key, this)
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 core = target(store)
23
- if (core.operation.open) {
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 "${core.operation.token.key}"`,
28
+ `failed to setState during a setState for "${target.operation.token.key}"`,
29
29
  )
30
30
  return `rejection`
31
31
  }
32
- core.operation = {
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
- store.transactionStatus.phase === `idle`
44
+ target.transactionMeta === null
45
45
  ? ``
46
- : ` ${store.transactionStatus.phase} "${store.transactionStatus.key}"`
46
+ : ` ${target.transactionMeta.phase} "${target.transactionMeta.update.key}"`
47
47
  }`,
48
48
  )
49
49
  }
50
50
  export const closeOperation = (store: Store): void => {
51
- const core = target(store)
52
- if (core.operation.open) {
51
+ const target = newest(store)
52
+ if (target.operation.open) {
53
53
  store.logger.info(
54
54
  `🔴`,
55
- core.operation.token.type,
56
- core.operation.token.key,
55
+ target.operation.token.type,
56
+ target.operation.token.key,
57
57
  `operation done in store "${store.config.name}"`,
58
58
  )
59
59
  }
60
- core.operation = { open: false }
61
- store.subject.operationStatus.next(core.operation)
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 core = target(store)
66
- if (!core.operation.open) {
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 core.operation.done.has(key)
75
+ return target.operation.done.has(key)
76
76
  }
77
77
  export const markDone = (key: string, store: Store): void => {
78
- const core = target(store)
79
- if (!core.operation.open) {
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
- core.operation.done.add(key)
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, StoreCore } from "../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 (store.transactionStatus.phase === `idle`) {
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
- core.selectors.set(options.key, mySelector)
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 type { Store, StoreCore } from "../store"
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
- core.readonlySelectors.set(options.key, readonlySelector)
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 core = target(store)
49
- const existingWritable = core.selectors.get(options.key)
50
- const existingReadonly = core.readonlySelectors.get(options.key)
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, core)
62
+ return createReadWriteSelector(options, family, store)
63
63
  }
64
- return createReadonlySelector(options, family, store, core)
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 core = target(store)
10
+ const target = newest(store)
11
11
  const { key } = selectorToken
12
12
  switch (selectorToken.type) {
13
13
  case `selector`:
14
- core.selectors.delete(key)
14
+ target.selectors.delete(key)
15
15
  break
16
16
  case `readonly_selector`:
17
- core.readonlySelectors.delete(key)
17
+ target.readonlySelectors.delete(key)
18
18
  break
19
19
  }
20
- core.valueMap.delete(key)
21
- core.selectorAtoms.delete(key)
22
- const downstreamTokens = core.selectorGraph
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
- core.selectors.get(downstreamSelectorKey) ??
28
- core.readonlySelectors.get(downstreamSelectorKey),
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
- core.selectorGraph.delete(key)
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 = target(store)
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 core = target(store)
16
- const alreadyRegistered = core.selectorGraph
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
- core.selectorGraph = core.selectorGraph.set(
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 = target(store)
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, StoreCore } from "../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: StoreCore,
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 copiedValue = transform.fromJson(transform.toJson(originValue))
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