@@ -5,19 +5,22 @@ import Foundation
55internal struct StoreContext {
66 private weak var weakStore : AtomStore ?
77 private let scopeKey : ScopeKey
8+ private let inheritedScopeKeys : [ ScopeID : ScopeKey ]
89 private let observers : [ Observer ]
910 private let overrides : [ OverrideKey : any AtomOverrideProtocol ]
1011 private let enablesAssertion : Bool
1112
1213 nonisolated init (
1314 _ store: AtomStore ? ,
1415 scopeKey: ScopeKey ,
16+ inheritedScopeKeys: [ ScopeID : ScopeKey ] ,
1517 observers: [ Observer ] ,
1618 overrides: [ OverrideKey : any AtomOverrideProtocol ] ,
1719 enablesAssertion: Bool = false
1820 ) {
1921 self . weakStore = store
2022 self . scopeKey = scopeKey
23+ self . inheritedScopeKeys = inheritedScopeKeys
2124 self . observers = observers
2225 self . overrides = overrides
2326 self . enablesAssertion = enablesAssertion
@@ -30,6 +33,7 @@ internal struct StoreContext {
3033 StoreContext (
3134 weakStore,
3235 scopeKey: scopeKey,
36+ inheritedScopeKeys: inheritedScopeKeys,
3337 observers: self . observers + observers,
3438 overrides: self . overrides. merging ( overrides) { $1 } ,
3539 enablesAssertion: enablesAssertion
@@ -38,12 +42,14 @@ internal struct StoreContext {
3842
3943 func scoped(
4044 scopeKey: ScopeKey ,
45+ scopeID: ScopeID ,
4146 observers: [ Observer ] ,
4247 overrides: [ OverrideKey : any AtomOverrideProtocol ]
4348 ) -> StoreContext {
4449 StoreContext (
4550 weakStore,
4651 scopeKey: scopeKey,
52+ inheritedScopeKeys: mutating ( inheritedScopeKeys) { $0 [ scopeID] = scopeKey } ,
4753 observers: self . observers + observers,
4854 overrides: overrides,
4955 enablesAssertion: enablesAssertion
@@ -53,7 +59,7 @@ internal struct StoreContext {
5359 @usableFromInline
5460 func read< Node: Atom > ( _ atom: Node ) -> Node . Loader . Value {
5561 let override = lookupOverride ( of: atom)
56- let scopeKey = override != nil ? scopeKey : nil
62+ let scopeKey = lookupScopeKey ( of : atom , isOverridden : override != nil )
5763 let key = AtomKey ( atom, scopeKey: scopeKey)
5864
5965 if let cache = lookupCache ( of: atom, for: key) {
@@ -74,7 +80,7 @@ internal struct StoreContext {
7480 @usableFromInline
7581 func set< Node: StateAtom > ( _ value: Node . Loader . Value , for atom: Node ) {
7682 let override = lookupOverride ( of: atom)
77- let scopeKey = override != nil ? scopeKey : nil
83+ let scopeKey = lookupScopeKey ( of : atom , isOverridden : override != nil )
7884 let key = AtomKey ( atom, scopeKey: scopeKey)
7985
8086 if let cache = lookupCache ( of: atom, for: key) {
@@ -85,7 +91,7 @@ internal struct StoreContext {
8591 @usableFromInline
8692 func modify< Node: StateAtom > ( _ atom: Node , body: ( inout Node . Loader . Value ) -> Void ) {
8793 let override = lookupOverride ( of: atom)
88- let scopeKey = override != nil ? scopeKey : nil
94+ let scopeKey = lookupScopeKey ( of : atom , isOverridden : override != nil )
8995 let key = AtomKey ( atom, scopeKey: scopeKey)
9096
9197 if let cache = lookupCache ( of: atom, for: key) {
@@ -103,7 +109,7 @@ internal struct StoreContext {
103109
104110 let store = getStore ( )
105111 let override = lookupOverride ( of: atom)
106- let scopeKey = override != nil ? scopeKey : nil
112+ let scopeKey = lookupScopeKey ( of : atom , isOverridden : override != nil )
107113 let key = AtomKey ( atom, scopeKey: scopeKey)
108114 let newCache = lookupCache ( of: atom, for: key) ?? makeNewCache ( of: atom, for: key, override: override)
109115
@@ -123,7 +129,7 @@ internal struct StoreContext {
123129 ) -> Node . Loader . Value {
124130 let store = getStore ( )
125131 let override = lookupOverride ( of: atom)
126- let scopeKey = override != nil ? scopeKey : nil
132+ let scopeKey = lookupScopeKey ( of : atom , isOverridden : override != nil )
127133 let key = AtomKey ( atom, scopeKey: scopeKey)
128134 let newCache = lookupCache ( of: atom, for: key) ?? makeNewCache ( of: atom, for: key, override: override)
129135 let subscription = Subscription (
@@ -149,7 +155,7 @@ internal struct StoreContext {
149155 @_disfavoredOverload
150156 func refresh< Node: Atom > ( _ atom: Node ) async -> Node . Loader . Value where Node. Loader: RefreshableAtomLoader {
151157 let override = lookupOverride ( of: atom)
152- let scopeKey = override != nil ? scopeKey : nil
158+ let scopeKey = lookupScopeKey ( of : atom , isOverridden : override != nil )
153159 let key = AtomKey ( atom, scopeKey: scopeKey)
154160 let context = prepareForTransaction ( of: atom, for: key)
155161 let value : Node . Loader . Value
@@ -179,7 +185,7 @@ internal struct StoreContext {
179185 @usableFromInline
180186 func refresh< Node: Refreshable > ( _ atom: Node ) async -> Node . Loader . Value {
181187 let override = lookupOverride ( of: atom)
182- let scopeKey = override != nil ? scopeKey : nil
188+ let scopeKey = lookupScopeKey ( of : atom , isOverridden : override != nil )
183189 let key = AtomKey ( atom, scopeKey: scopeKey)
184190 let state = getState ( of: atom, for: key)
185191 let value : Node . Loader . Value
@@ -592,6 +598,19 @@ private extension StoreContext {
592598 return override
593599 }
594600
601+ func lookupScopeKey< Node: Atom > ( of atom: Node , isOverridden: Bool ) -> ScopeKey ? {
602+ if isOverridden {
603+ return scopeKey
604+ }
605+ else if let atom = atom as? any Scoped {
606+ let scopeID = ScopeID ( atom. scopeID)
607+ return inheritedScopeKeys [ scopeID]
608+ }
609+ else {
610+ return nil
611+ }
612+ }
613+
595614 func notifyUpdateToObservers( ) {
596615 guard !observers. isEmpty else {
597616 return
0 commit comments