atom.io 0.21.1 → 0.22.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 (92) hide show
  1. package/data/dist/index.cjs +136 -63
  2. package/data/dist/index.d.ts +6 -0
  3. package/data/dist/index.js +3 -3
  4. package/data/src/join.ts +135 -51
  5. package/data/src/struct-family.ts +2 -2
  6. package/dist/{chunk-RT43TVKP.js → chunk-GVHKIJ3G.js} +1 -1
  7. package/dist/{chunk-HITX3MO4.js → chunk-JA4V7TJY.js} +135 -62
  8. package/dist/index.cjs +2 -7
  9. package/dist/index.d.ts +29 -14
  10. package/dist/index.js +4 -8
  11. package/ephemeral/dist/index.cjs +11 -0
  12. package/ephemeral/dist/index.js +9 -0
  13. package/ephemeral/package.json +16 -0
  14. package/ephemeral/src/index.ts +1 -0
  15. package/eslint-plugin/dist/index.cjs +156 -1
  16. package/eslint-plugin/dist/index.js +156 -1
  17. package/eslint-plugin/src/rules/index.ts +1 -0
  18. package/eslint-plugin/src/rules/lifespan.ts +204 -0
  19. package/eslint-plugin/src/rules/synchronous-selector-dependencies.ts +1 -65
  20. package/eslint-plugin/src/walk.ts +73 -0
  21. package/immortal/dist/index.cjs +100 -0
  22. package/immortal/dist/index.js +97 -0
  23. package/immortal/package.json +16 -0
  24. package/immortal/src/index.ts +2 -0
  25. package/immortal/src/molecule.ts +134 -0
  26. package/immortal/src/seek-state.ts +60 -0
  27. package/internal/dist/index.cjs +186 -146
  28. package/internal/dist/index.d.ts +29 -13
  29. package/internal/dist/index.js +185 -146
  30. package/internal/src/atom/dispose-atom.ts +4 -1
  31. package/internal/src/families/create-readonly-selector-family.ts +9 -9
  32. package/internal/src/families/create-regular-atom-family.ts +15 -20
  33. package/internal/src/families/create-writable-selector-family.ts +6 -7
  34. package/internal/src/families/find-in-store.ts +11 -5
  35. package/internal/src/families/index.ts +2 -0
  36. package/internal/src/families/init-family-member.ts +91 -0
  37. package/internal/src/families/seek-in-store.ts +106 -0
  38. package/internal/src/get-state/get-from-store.ts +2 -2
  39. package/internal/src/mutable/create-mutable-atom-family.ts +17 -23
  40. package/internal/src/mutable/create-mutable-atom.ts +3 -1
  41. package/internal/src/mutable/get-json-family.ts +2 -2
  42. package/internal/src/mutable/get-json-token.ts +27 -12
  43. package/internal/src/mutable/tracker-family.ts +14 -12
  44. package/internal/src/not-found-error.ts +11 -3
  45. package/internal/src/selector/create-readonly-selector.ts +2 -2
  46. package/internal/src/selector/create-writable-selector.ts +2 -2
  47. package/internal/src/selector/dispose-selector.ts +40 -23
  48. package/internal/src/selector/register-selector.ts +8 -5
  49. package/internal/src/set-state/set-into-store.ts +2 -2
  50. package/internal/src/store/index.ts +0 -1
  51. package/internal/src/store/store.ts +18 -5
  52. package/internal/src/subscribe/subscribe-to-state.ts +2 -2
  53. package/internal/src/transaction/build-transaction.ts +7 -2
  54. package/introspection/dist/index.cjs +38 -52
  55. package/introspection/dist/index.js +38 -52
  56. package/introspection/src/attach-atom-index.ts +38 -48
  57. package/introspection/src/attach-selector-index.ts +45 -50
  58. package/json/dist/index.cjs +38 -4
  59. package/json/dist/index.js +40 -6
  60. package/json/src/select-json-family.ts +46 -7
  61. package/package.json +30 -10
  62. package/react/dist/index.cjs +1 -1
  63. package/react/dist/index.js +1 -1
  64. package/react/src/use-json.ts +1 -1
  65. package/react-devtools/dist/index.cjs +11 -10
  66. package/react-devtools/dist/index.js +2 -1
  67. package/react-devtools/src/StateIndex.tsx +2 -1
  68. package/react-devtools/src/TimelineIndex.tsx +2 -1
  69. package/react-devtools/src/TransactionIndex.tsx +7 -7
  70. package/realtime-client/dist/index.cjs +3 -3
  71. package/realtime-client/dist/index.js +3 -3
  72. package/realtime-client/src/pull-mutable-atom-family-member.ts +1 -1
  73. package/realtime-client/src/pull-mutable-atom.ts +1 -1
  74. package/realtime-client/src/sync-continuity.ts +1 -2
  75. package/realtime-react/dist/index.cjs +1 -1
  76. package/realtime-react/dist/index.js +1 -1
  77. package/realtime-server/dist/index.cjs +18 -17
  78. package/realtime-server/dist/index.js +7 -6
  79. package/realtime-server/src/realtime-continuity-synchronizer.ts +5 -3
  80. package/realtime-server/src/realtime-mutable-family-provider.ts +2 -1
  81. package/realtime-server/src/realtime-mutable-provider.ts +1 -1
  82. package/realtime-testing/dist/index.cjs +6 -2
  83. package/realtime-testing/dist/index.js +8 -5
  84. package/realtime-testing/src/setup-realtime-test.tsx +5 -2
  85. package/src/atom.ts +10 -4
  86. package/src/index.ts +1 -2
  87. package/src/selector.ts +10 -4
  88. package/src/silo.ts +3 -3
  89. package/src/transaction.ts +5 -2
  90. package/internal/src/store/withdraw-new-family-member.ts +0 -69
  91. /package/{src → ephemeral/src}/find-state.ts +0 -0
  92. /package/src/{dispose.ts → dispose-state.ts} +0 -0
@@ -1,11 +1,13 @@
1
- import type { findState, Transactors } from "atom.io"
1
+ import type { Transactors } from "atom.io"
2
+ import type { findState } from "atom.io/ephemeral"
3
+ import type { seekState } from "atom.io/immortal"
2
4
 
3
- import { findInStore } from "../families"
5
+ import { findInStore, seekInStore } from "../families"
4
6
  import { readOrComputeValue } from "../get-state/read-or-compute-value"
5
7
  import { newest } from "../lineage"
6
8
  import { setAtomOrSelector } from "../set-state"
7
9
  import type { Store } from "../store"
8
- import { withdrawOrCreate } from "../store"
10
+ import { withdraw } from "../store"
9
11
  import { updateSelectorAtoms } from "./update-selector-atoms"
10
12
 
11
13
  export const registerSelector = (
@@ -15,7 +17,7 @@ export const registerSelector = (
15
17
  get: (dependency) => {
16
18
  const target = newest(store)
17
19
 
18
- const dependencyState = withdrawOrCreate(dependency, store)
20
+ const dependencyState = withdraw(dependency, store)
19
21
  const dependencyValue = readOrComputeValue(dependencyState, store)
20
22
 
21
23
  store.logger.info(
@@ -40,8 +42,9 @@ export const registerSelector = (
40
42
  return dependencyValue
41
43
  },
42
44
  set: (WritableToken, newValue) => {
43
- const state = withdrawOrCreate(WritableToken, store)
45
+ const state = withdraw(WritableToken, store)
44
46
  setAtomOrSelector(state, newValue, store)
45
47
  },
46
48
  find: ((token, key) => findInStore(token, key, store)) as typeof findState,
49
+ seek: ((token, key) => seekInStore(token, key, store)) as typeof seekState,
47
50
  })
@@ -2,7 +2,7 @@ import type { WritableToken } from "atom.io"
2
2
 
3
3
  import { closeOperation, openOperation } from "../operation"
4
4
  import type { Store } from "../store"
5
- import { withdrawOrCreate } from "../store"
5
+ import { withdraw } from "../store"
6
6
  import { setAtomOrSelector } from "./set-atom-or-selector"
7
7
 
8
8
  export function setIntoStore<T, New extends T>(
@@ -27,7 +27,7 @@ export function setIntoStore<T, New extends T>(
27
27
  )
28
28
  return
29
29
  }
30
- const state = withdrawOrCreate(token, store)
30
+ const state = withdraw(token, store)
31
31
  setAtomOrSelector(state, value, store)
32
32
  closeOperation(store)
33
33
  }
@@ -1,4 +1,3 @@
1
1
  export * from "./deposit"
2
2
  export * from "./store"
3
3
  export * from "./withdraw"
4
- export * from "./withdraw-new-family-member"
@@ -12,6 +12,7 @@ import type {
12
12
  WritableSelectorToken,
13
13
  } from "atom.io"
14
14
  import { AtomIOLogger } from "atom.io"
15
+ import type { Molecule } from "atom.io/immortal"
15
16
 
16
17
  import { Junction } from "~/packages/rel8/junction/src"
17
18
 
@@ -80,6 +81,9 @@ export class Store implements Lineage {
80
81
  },
81
82
  )
82
83
 
84
+ public molecules = new Map<string, Molecule<any>>()
85
+ public miscResources = new Map<string, Disposable>()
86
+
83
87
  public on = {
84
88
  atomCreation: new Subject<AtomToken<unknown>>(),
85
89
  atomDisposal: new Subject<AtomToken<unknown>>(),
@@ -107,8 +111,10 @@ export class Store implements Lineage {
107
111
 
108
112
  public config: {
109
113
  name: string
114
+ lifespan: `ephemeral` | `immortal`
110
115
  } = {
111
116
  name: `IMPLICIT_STORE`,
117
+ lifespan: `ephemeral`,
112
118
  }
113
119
 
114
120
  public loggers: AtomIOLogger[] = [
@@ -126,7 +132,7 @@ export class Store implements Lineage {
126
132
  },
127
133
  }
128
134
 
129
- public constructor(name: string, store: Store | null = null) {
135
+ public constructor(config: Store[`config`], store: Store | null = null) {
130
136
  if (store !== null) {
131
137
  this.valueMap = new Map(store?.valueMap)
132
138
  this.operation = { ...store?.operation }
@@ -141,7 +147,7 @@ export class Store implements Lineage {
141
147
 
142
148
  this.config = {
143
149
  ...store?.config,
144
- name,
150
+ ...config,
145
151
  }
146
152
  for (const [, family] of store.families) {
147
153
  family.install(this)
@@ -153,7 +159,7 @@ export class Store implements Lineage {
153
159
  }
154
160
  atom.install(this)
155
161
  if (atom.type === `mutable_atom`) {
156
- const originalJsonToken = getJsonToken(atom)
162
+ const originalJsonToken = getJsonToken(atom, store)
157
163
  const originalUpdateToken = getUpdateToken(atom)
158
164
  mutableHelpers.add(originalJsonToken.key)
159
165
  mutableHelpers.add(originalUpdateToken.key)
@@ -182,13 +188,20 @@ export const IMPLICIT = {
182
188
  STORE_INTERNAL: undefined as Store | undefined,
183
189
  get STORE(): Store {
184
190
  return (
185
- this.STORE_INTERNAL ?? (this.STORE_INTERNAL = new Store(`IMPLICIT_STORE`))
191
+ this.STORE_INTERNAL ??
192
+ (this.STORE_INTERNAL = new Store({
193
+ name: `IMPLICIT_STORE`,
194
+ lifespan: `ephemeral`,
195
+ }))
186
196
  )
187
197
  },
188
198
  }
189
199
 
190
200
  export const clearStore = (store: Store): void => {
191
201
  const { config } = store
192
- Object.assign(store, new Store(config.name))
202
+ for (const disposable of store.miscResources.values()) {
203
+ disposable[Symbol.dispose]()
204
+ }
205
+ Object.assign(store, new Store(config))
193
206
  store.config = config
194
207
  }
@@ -1,7 +1,7 @@
1
1
  import type { ReadableToken, StateUpdate, UpdateHandler } from "atom.io"
2
2
 
3
3
  import type { Store } from "../store"
4
- import { withdrawOrCreate } from "../store"
4
+ import { withdraw } from "../store"
5
5
  import { subscribeToRootAtoms } from "./subscribe-to-root-atoms"
6
6
 
7
7
  export function subscribeToState<T>(
@@ -23,7 +23,7 @@ export function subscribeToState<T>(
23
23
  handleUpdate(update)
24
24
  }
25
25
  }
26
- const state = withdrawOrCreate(token, store)
26
+ const state = withdraw(token, store)
27
27
  store.logger.info(`👀`, state.type, state.key, `Adding subscription "${key}"`)
28
28
  const isSelector =
29
29
  state.type === `selector` || state.type === `readonly_selector`
@@ -1,9 +1,11 @@
1
- import type { findState, Func } from "atom.io"
1
+ import type { Func } from "atom.io"
2
+ import type { findState } from "atom.io/ephemeral"
3
+ import type { seekState } from "atom.io/immortal"
2
4
 
3
5
  import { Junction } from "~/packages/rel8/junction/src"
4
6
 
5
7
  import { arbitrary } from "../arbitrary"
6
- import { findInStore } from "../families"
8
+ import { findInStore, seekInStore } from "../families"
7
9
  import { getEnvironmentData } from "../get-environment-data"
8
10
  import { getFromStore } from "../get-state"
9
11
  import { LazyMap } from "../lazy-map"
@@ -43,6 +45,8 @@ export const buildTransaction = (
43
45
  }),
44
46
  selectors: new LazyMap(parent.selectors),
45
47
  valueMap: new LazyMap(parent.valueMap),
48
+ molecules: new LazyMap(parent.molecules),
49
+ miscResources: new LazyMap(parent.miscResources),
46
50
  }
47
51
  const epoch = getEpochNumberOfAction(key, store)
48
52
  const transactionMeta: TransactionProgress<Func> = {
@@ -63,6 +67,7 @@ export const buildTransaction = (
63
67
  run: (token, identifier = arbitrary()) =>
64
68
  actUponStore(token, identifier, child),
65
69
  find: ((token, k) => findInStore(token, k, child)) as typeof findState,
70
+ seek: ((token, k) => seekInStore(token, k, child)) as typeof seekState,
66
71
  env: () => getEnvironmentData(child),
67
72
  },
68
73
  }
@@ -66,55 +66,45 @@ var attachAtomIndex = (store = Internal2.IMPLICIT.STORE) => {
66
66
  },
67
67
  effects: [
68
68
  ({ setSelf }) => {
69
- const unsubscribeFromAtomCreation = store.on.atomCreation.subscribe(
70
- `introspection`,
71
- (atomToken) => {
72
- if (atomToken.key.includes(`\u{1F441}\u200D\u{1F5E8}`)) {
73
- return;
74
- }
75
- setSelf((self) => {
76
- if (atomToken.family) {
77
- const { key: familyKey, subKey } = atomToken.family;
78
- let familyNode = self.get(familyKey);
79
- if (familyNode === void 0 || !(`familyMembers` in familyNode)) {
80
- familyNode = {
81
- key: familyKey,
82
- familyMembers: /* @__PURE__ */ new Map()
83
- };
84
- self.set(familyKey, familyNode);
85
- }
86
- familyNode.familyMembers.set(subKey, atomToken);
87
- } else {
88
- self.set(atomToken.key, atomToken);
89
- }
90
- return self;
91
- });
69
+ store.on.atomCreation.subscribe(`introspection`, (atomToken) => {
70
+ if (atomToken.key.includes(`\u{1F441}\u200D\u{1F5E8}`)) {
71
+ return;
92
72
  }
93
- );
94
- const unsubscribeFromAtomDisposal = store.on.atomDisposal.subscribe(
95
- `introspection`,
96
- (atomToken) => {
97
- setSelf((self) => {
98
- if (atomToken.family) {
99
- const { key: familyKey, subKey } = atomToken.family;
100
- const familyNode = self.get(familyKey);
101
- if (familyNode && `familyMembers` in familyNode) {
102
- familyNode.familyMembers.delete(subKey);
103
- if (familyNode.familyMembers.size === 0) {
104
- self.delete(familyKey);
105
- }
73
+ setSelf((self) => {
74
+ if (atomToken.family) {
75
+ const { key: familyKey, subKey } = atomToken.family;
76
+ let familyNode = self.get(familyKey);
77
+ if (familyNode === void 0 || !(`familyMembers` in familyNode)) {
78
+ familyNode = {
79
+ key: familyKey,
80
+ familyMembers: /* @__PURE__ */ new Map()
81
+ };
82
+ self.set(familyKey, familyNode);
83
+ }
84
+ familyNode.familyMembers.set(subKey, atomToken);
85
+ } else {
86
+ self.set(atomToken.key, atomToken);
87
+ }
88
+ return self;
89
+ });
90
+ });
91
+ store.on.atomDisposal.subscribe(`introspection`, (atomToken) => {
92
+ setSelf((self) => {
93
+ if (atomToken.family) {
94
+ const { key: familyKey, subKey } = atomToken.family;
95
+ const familyNode = self.get(familyKey);
96
+ if (familyNode && `familyMembers` in familyNode) {
97
+ familyNode.familyMembers.delete(subKey);
98
+ if (familyNode.familyMembers.size === 0) {
99
+ self.delete(familyKey);
106
100
  }
107
- } else {
108
- self.delete(atomToken.key);
109
101
  }
110
- return self;
111
- });
112
- }
113
- );
114
- return () => {
115
- unsubscribeFromAtomCreation();
116
- unsubscribeFromAtomDisposal();
117
- };
102
+ } else {
103
+ self.delete(atomToken.key);
104
+ }
105
+ return self;
106
+ });
107
+ });
118
108
  }
119
109
  ]
120
110
  },
@@ -159,7 +149,7 @@ var attachSelectorIndex = (store = Internal2.IMPLICIT.STORE) => {
159
149
  },
160
150
  effects: [
161
151
  ({ setSelf }) => {
162
- const unsubscribeFromSelectorCreation = store.on.selectorCreation.subscribe(
152
+ store.on.selectorCreation.subscribe(
163
153
  `introspection`,
164
154
  (selectorToken) => {
165
155
  if (selectorToken.key.includes(`\u{1F441}\u200D\u{1F5E8}`)) {
@@ -184,7 +174,7 @@ var attachSelectorIndex = (store = Internal2.IMPLICIT.STORE) => {
184
174
  });
185
175
  }
186
176
  );
187
- const unsubscribeFromSelectorDisposal = store.on.selectorDisposal.subscribe(
177
+ store.on.selectorDisposal.subscribe(
188
178
  `introspection`,
189
179
  (selectorToken) => {
190
180
  setSelf((self) => {
@@ -204,10 +194,6 @@ var attachSelectorIndex = (store = Internal2.IMPLICIT.STORE) => {
204
194
  });
205
195
  }
206
196
  );
207
- return () => {
208
- unsubscribeFromSelectorCreation();
209
- unsubscribeFromSelectorDisposal();
210
- };
211
197
  }
212
198
  ]
213
199
  },
@@ -31,55 +31,45 @@ var attachAtomIndex = (store = IMPLICIT.STORE) => {
31
31
  },
32
32
  effects: [
33
33
  ({ setSelf }) => {
34
- const unsubscribeFromAtomCreation = store.on.atomCreation.subscribe(
35
- `introspection`,
36
- (atomToken) => {
37
- if (atomToken.key.includes(`\u{1F441}\u200D\u{1F5E8}`)) {
38
- return;
39
- }
40
- setSelf((self) => {
41
- if (atomToken.family) {
42
- const { key: familyKey, subKey } = atomToken.family;
43
- let familyNode = self.get(familyKey);
44
- if (familyNode === void 0 || !(`familyMembers` in familyNode)) {
45
- familyNode = {
46
- key: familyKey,
47
- familyMembers: /* @__PURE__ */ new Map()
48
- };
49
- self.set(familyKey, familyNode);
50
- }
51
- familyNode.familyMembers.set(subKey, atomToken);
52
- } else {
53
- self.set(atomToken.key, atomToken);
54
- }
55
- return self;
56
- });
34
+ store.on.atomCreation.subscribe(`introspection`, (atomToken) => {
35
+ if (atomToken.key.includes(`\u{1F441}\u200D\u{1F5E8}`)) {
36
+ return;
57
37
  }
58
- );
59
- const unsubscribeFromAtomDisposal = store.on.atomDisposal.subscribe(
60
- `introspection`,
61
- (atomToken) => {
62
- setSelf((self) => {
63
- if (atomToken.family) {
64
- const { key: familyKey, subKey } = atomToken.family;
65
- const familyNode = self.get(familyKey);
66
- if (familyNode && `familyMembers` in familyNode) {
67
- familyNode.familyMembers.delete(subKey);
68
- if (familyNode.familyMembers.size === 0) {
69
- self.delete(familyKey);
70
- }
38
+ setSelf((self) => {
39
+ if (atomToken.family) {
40
+ const { key: familyKey, subKey } = atomToken.family;
41
+ let familyNode = self.get(familyKey);
42
+ if (familyNode === void 0 || !(`familyMembers` in familyNode)) {
43
+ familyNode = {
44
+ key: familyKey,
45
+ familyMembers: /* @__PURE__ */ new Map()
46
+ };
47
+ self.set(familyKey, familyNode);
48
+ }
49
+ familyNode.familyMembers.set(subKey, atomToken);
50
+ } else {
51
+ self.set(atomToken.key, atomToken);
52
+ }
53
+ return self;
54
+ });
55
+ });
56
+ store.on.atomDisposal.subscribe(`introspection`, (atomToken) => {
57
+ setSelf((self) => {
58
+ if (atomToken.family) {
59
+ const { key: familyKey, subKey } = atomToken.family;
60
+ const familyNode = self.get(familyKey);
61
+ if (familyNode && `familyMembers` in familyNode) {
62
+ familyNode.familyMembers.delete(subKey);
63
+ if (familyNode.familyMembers.size === 0) {
64
+ self.delete(familyKey);
71
65
  }
72
- } else {
73
- self.delete(atomToken.key);
74
66
  }
75
- return self;
76
- });
77
- }
78
- );
79
- return () => {
80
- unsubscribeFromAtomCreation();
81
- unsubscribeFromAtomDisposal();
82
- };
67
+ } else {
68
+ self.delete(atomToken.key);
69
+ }
70
+ return self;
71
+ });
72
+ });
83
73
  }
84
74
  ]
85
75
  },
@@ -124,7 +114,7 @@ var attachSelectorIndex = (store = IMPLICIT.STORE) => {
124
114
  },
125
115
  effects: [
126
116
  ({ setSelf }) => {
127
- const unsubscribeFromSelectorCreation = store.on.selectorCreation.subscribe(
117
+ store.on.selectorCreation.subscribe(
128
118
  `introspection`,
129
119
  (selectorToken) => {
130
120
  if (selectorToken.key.includes(`\u{1F441}\u200D\u{1F5E8}`)) {
@@ -149,7 +139,7 @@ var attachSelectorIndex = (store = IMPLICIT.STORE) => {
149
139
  });
150
140
  }
151
141
  );
152
- const unsubscribeFromSelectorDisposal = store.on.selectorDisposal.subscribe(
142
+ store.on.selectorDisposal.subscribe(
153
143
  `introspection`,
154
144
  (selectorToken) => {
155
145
  setSelf((self) => {
@@ -169,10 +159,6 @@ var attachSelectorIndex = (store = IMPLICIT.STORE) => {
169
159
  });
170
160
  }
171
161
  );
172
- return () => {
173
- unsubscribeFromSelectorCreation();
174
- unsubscribeFromSelectorDisposal();
175
- };
176
162
  }
177
163
  ]
178
164
  },
@@ -41,59 +41,49 @@ export const attachAtomIndex = (
41
41
  },
42
42
  effects: [
43
43
  ({ setSelf }) => {
44
- const unsubscribeFromAtomCreation = store.on.atomCreation.subscribe(
45
- `introspection`,
46
- (atomToken) => {
47
- if (atomToken.key.includes(`👁‍🗨`)) {
48
- return
49
- }
44
+ store.on.atomCreation.subscribe(`introspection`, (atomToken) => {
45
+ if (atomToken.key.includes(`👁‍🗨`)) {
46
+ return
47
+ }
50
48
 
51
- setSelf((self) => {
52
- if (atomToken.family) {
53
- const { key: familyKey, subKey } = atomToken.family
54
- let familyNode = self.get(familyKey)
55
- if (
56
- familyNode === undefined ||
57
- !(`familyMembers` in familyNode)
58
- ) {
59
- familyNode = {
60
- key: familyKey,
61
- familyMembers: new Map(),
62
- }
63
- self.set(familyKey, familyNode)
49
+ setSelf((self) => {
50
+ if (atomToken.family) {
51
+ const { key: familyKey, subKey } = atomToken.family
52
+ let familyNode = self.get(familyKey)
53
+ if (
54
+ familyNode === undefined ||
55
+ !(`familyMembers` in familyNode)
56
+ ) {
57
+ familyNode = {
58
+ key: familyKey,
59
+ familyMembers: new Map(),
64
60
  }
65
- familyNode.familyMembers.set(subKey, atomToken)
66
- } else {
67
- self.set(atomToken.key, atomToken)
61
+ self.set(familyKey, familyNode)
68
62
  }
69
- return self
70
- })
71
- },
72
- )
73
- const unsubscribeFromAtomDisposal = store.on.atomDisposal.subscribe(
74
- `introspection`,
75
- (atomToken) => {
76
- setSelf((self) => {
77
- if (atomToken.family) {
78
- const { key: familyKey, subKey } = atomToken.family
79
- const familyNode = self.get(familyKey)
80
- if (familyNode && `familyMembers` in familyNode) {
81
- familyNode.familyMembers.delete(subKey)
82
- if (familyNode.familyMembers.size === 0) {
83
- self.delete(familyKey)
84
- }
63
+ familyNode.familyMembers.set(subKey, atomToken)
64
+ } else {
65
+ self.set(atomToken.key, atomToken)
66
+ }
67
+ return self
68
+ })
69
+ })
70
+ store.on.atomDisposal.subscribe(`introspection`, (atomToken) => {
71
+ setSelf((self) => {
72
+ if (atomToken.family) {
73
+ const { key: familyKey, subKey } = atomToken.family
74
+ const familyNode = self.get(familyKey)
75
+ if (familyNode && `familyMembers` in familyNode) {
76
+ familyNode.familyMembers.delete(subKey)
77
+ if (familyNode.familyMembers.size === 0) {
78
+ self.delete(familyKey)
85
79
  }
86
- } else {
87
- self.delete(atomToken.key)
88
80
  }
89
- return self
90
- })
91
- },
92
- )
93
- return () => {
94
- unsubscribeFromAtomCreation()
95
- unsubscribeFromAtomDisposal()
96
- }
81
+ } else {
82
+ self.delete(atomToken.key)
83
+ }
84
+ return self
85
+ })
86
+ })
97
87
  },
98
88
  ],
99
89
  },
@@ -44,61 +44,56 @@ export const attachSelectorIndex = (
44
44
  },
45
45
  effects: [
46
46
  ({ setSelf }) => {
47
- const unsubscribeFromSelectorCreation =
48
- store.on.selectorCreation.subscribe(
49
- `introspection`,
50
- (selectorToken) => {
51
- if (selectorToken.key.includes(`👁‍🗨`)) {
52
- return
53
- }
47
+ store.on.selectorCreation.subscribe(
48
+ `introspection`,
49
+ (selectorToken) => {
50
+ if (selectorToken.key.includes(`👁‍🗨`)) {
51
+ return
52
+ }
54
53
 
55
- setSelf((self) => {
56
- if (selectorToken.family) {
57
- const { key: familyKey, subKey } = selectorToken.family
58
- let familyNode = self.get(familyKey)
59
- if (
60
- familyNode === undefined ||
61
- !(`familyMembers` in familyNode)
62
- ) {
63
- familyNode = {
64
- key: familyKey,
65
- familyMembers: new Map(),
66
- }
67
- self.set(familyKey, familyNode)
54
+ setSelf((self) => {
55
+ if (selectorToken.family) {
56
+ const { key: familyKey, subKey } = selectorToken.family
57
+ let familyNode = self.get(familyKey)
58
+ if (
59
+ familyNode === undefined ||
60
+ !(`familyMembers` in familyNode)
61
+ ) {
62
+ familyNode = {
63
+ key: familyKey,
64
+ familyMembers: new Map(),
68
65
  }
69
- familyNode.familyMembers.set(subKey, selectorToken)
70
- } else {
71
- self.set(selectorToken.key, selectorToken)
66
+ self.set(familyKey, familyNode)
72
67
  }
73
- return self
74
- })
75
- },
76
- )
77
- const unsubscribeFromSelectorDisposal =
78
- store.on.selectorDisposal.subscribe(
79
- `introspection`,
80
- (selectorToken) => {
81
- setSelf((self) => {
82
- if (selectorToken.family) {
83
- const { key: familyKey, subKey } = selectorToken.family
84
- const familyNode = self.get(familyKey)
85
- if (familyNode && `familyMembers` in familyNode) {
86
- familyNode.familyMembers.delete(subKey)
87
- if (familyNode.familyMembers.size === 0) {
88
- self.delete(familyKey)
89
- }
68
+ familyNode.familyMembers.set(subKey, selectorToken)
69
+ } else {
70
+ self.set(selectorToken.key, selectorToken)
71
+ }
72
+ return self
73
+ })
74
+ },
75
+ )
76
+
77
+ store.on.selectorDisposal.subscribe(
78
+ `introspection`,
79
+ (selectorToken) => {
80
+ setSelf((self) => {
81
+ if (selectorToken.family) {
82
+ const { key: familyKey, subKey } = selectorToken.family
83
+ const familyNode = self.get(familyKey)
84
+ if (familyNode && `familyMembers` in familyNode) {
85
+ familyNode.familyMembers.delete(subKey)
86
+ if (familyNode.familyMembers.size === 0) {
87
+ self.delete(familyKey)
90
88
  }
91
- } else {
92
- self.delete(selectorToken.key)
93
89
  }
94
- return self
95
- })
96
- },
97
- )
98
- return () => {
99
- unsubscribeFromSelectorCreation()
100
- unsubscribeFromSelectorDisposal()
101
- }
90
+ } else {
91
+ self.delete(selectorToken.key)
92
+ }
93
+ return self
94
+ })
95
+ },
96
+ )
102
97
  },
103
98
  ],
104
99
  },