@@ -71,12 +71,7 @@ internal struct StoreContext {
7171 }
7272 else {
7373 let cache = makeCache ( of: atom, for: key, override: override)
74- notifyUpdateToObservers ( )
75-
76- if checkAndRelease ( for: key) {
77- notifyUpdateToObservers ( )
78- }
79-
74+ checkAndRelease ( for: key)
8075 return cache. value
8176 }
8277 }
@@ -152,8 +147,7 @@ internal struct StoreContext {
152147 let override = lookupOverride ( of: atom)
153148 let scopeKey = lookupScopeKey ( of: atom, isScopedOverriden: override? . isScoped ?? false )
154149 let key = AtomKey ( atom, scopeKey: scopeKey)
155- let state = lookupState ( of: atom, for: key) ?? makeEphemeralState ( of: atom)
156- let context = prepareForTransaction ( of: atom, for: key, state: state)
150+ let context = prepareForTransaction ( of: atom, for: key)
157151 let value : Node . Loader . Value
158152
159153 if let override {
@@ -164,6 +158,7 @@ internal struct StoreContext {
164158 }
165159
166160 guard let cache = lookupCache ( of: atom, for: key) else {
161+ checkAndRelease ( for: key)
167162 return value
168163 }
169164
@@ -180,11 +175,12 @@ internal struct StoreContext {
180175 let override = lookupOverride ( of: atom)
181176 let scopeKey = lookupScopeKey ( of: atom, isScopedOverriden: override? . isScoped ?? false )
182177 let key = AtomKey ( atom, scopeKey: scopeKey)
183- let state = lookupState ( of: atom, for: key) ?? makeEphemeralState ( of : atom )
178+ let state = getState ( of: atom, for: key)
184179 let context = AtomCurrentContext ( store: self , coordinator: state. coordinator)
185180 let value = await atom. refresh ( context: context)
186181
187182 guard let transaction = state. transaction, let cache = lookupCache ( of: atom, for: key) else {
183+ checkAndRelease ( for: key)
188184 return value
189185 }
190186
@@ -214,10 +210,11 @@ internal struct StoreContext {
214210 let override = lookupOverride ( of: atom)
215211 let scopeKey = lookupScopeKey ( of: atom, isScopedOverriden: override? . isScoped ?? false )
216212 let key = AtomKey ( atom, scopeKey: scopeKey)
217- let state = lookupState ( of: atom, for: key) ?? makeEphemeralState ( of: atom)
218- let context = AtomCurrentContext ( store: self , coordinator: state. coordinator)
219213
220- atom. reset ( context: context)
214+ if let state = lookupState ( of: atom, for: key) {
215+ let context = AtomCurrentContext ( store: self , coordinator: state. coordinator)
216+ atom. reset ( context: context)
217+ }
221218 }
222219
223220 @usableFromInline
@@ -292,9 +289,10 @@ internal struct StoreContext {
292289private extension StoreContext {
293290 func prepareForTransaction< Node: Atom > (
294291 of atom: Node ,
295- for key: AtomKey ,
296- state: AtomState < Node . Coordinator >
292+ for key: AtomKey
297293 ) -> AtomLoaderContext < Node . Loader . Value , Node . Loader . Coordinator > {
294+ let state = getState ( of: atom, for: key)
295+
298296 // Terminate the ongoing transaction first.
299297 state. transaction? . terminate ( )
300298
@@ -386,8 +384,7 @@ private extension StoreContext {
386384 notifyUpdateToObservers ( )
387385 }
388386
389- @discardableResult
390- func checkAndRelease( for key: AtomKey ) -> Bool {
387+ func checkAndRelease( for key: AtomKey ) {
391388 // The condition under which an atom may be released are as follows:
392389 // 1. It's not marked as `KeepAlive`, is marked as `Scoped`, or is scoped by override.
393390 // 2. It has no downstream atoms.
@@ -398,11 +395,10 @@ private extension StoreContext {
398395 lazy var shouldRelease = !shouldKeepAlive && isChildrenEmpty && isSubscriptionEmpty
399396
400397 guard shouldRelease else {
401- return false
398+ return
402399 }
403400
404401 release ( for: key)
405- return true
406402 }
407403
408404 func release( for key: AtomKey ) {
@@ -427,16 +423,12 @@ private extension StoreContext {
427423 return state
428424 }
429425
430- let state = makeEphemeralState ( of: atom)
426+ let coordinator = atom. makeCoordinator ( )
427+ let state = AtomState ( coordinator: coordinator)
431428 store. state. states [ key] = state
432429 return state
433430 }
434431
435- func makeEphemeralState< Node: Atom > ( of atom: Node ) -> AtomState < Node . Coordinator > {
436- let coordinator = atom. makeCoordinator ( )
437- return AtomState ( coordinator: coordinator)
438- }
439-
440432 func lookupState< Node: Atom > ( of atom: Node , for key: AtomKey ) -> AtomState < Node . Coordinator > ? {
441433 guard let baseState = store. state. states [ key] else {
442434 return nil
@@ -477,8 +469,7 @@ private extension StoreContext {
477469 for key: AtomKey ,
478470 override: AtomOverride < Node > ?
479471 ) -> AtomCache < Node > {
480- let state = getState ( of: atom, for: key)
481- let context = prepareForTransaction ( of: atom, for: key, state: state)
472+ let context = prepareForTransaction ( of: atom, for: key)
482473 let value : Node . Loader . Value
483474
484475 if let override {
0 commit comments