Child store caching improvements (#2627)

* Use `ScopeID` for all cached child stores

* wip

* wip

* wip

* wip

* wip

* wip
This commit is contained in:
Stephen Celis
2023-12-07 12:39:37 -08:00
committed by GitHub
parent 41f79c0c65
commit c2a27dcaad
9 changed files with 147 additions and 123 deletions

View File

@@ -113,15 +113,11 @@ public struct ForEachStore<
removeDuplicates: { areOrderedSetsDuplicates($0.ids, $1.ids) }
) { viewStore in
ForEach(viewStore.state, id: viewStore.state.id) { element in
var element = element
let id = element[keyPath: viewStore.state.id]
content(
store.scope(
state: {
element = $0[id: id] ?? element
return element
},
id: { _ in id },
state: { $0[id: id]! },
id: store.id(state: \.[id: id]!, action: \.[id: id]),
action: { .element(id: id, action: $0) },
isInvalid: { !$0.ids.contains(id) },
removeDuplicates: nil
@@ -173,15 +169,11 @@ public struct ForEachStore<
removeDuplicates: { areOrderedSetsDuplicates($0.ids, $1.ids) }
) { viewStore in
ForEach(viewStore.state, id: viewStore.state.id) { element in
var element = element
let id = element[keyPath: viewStore.state.id]
content(
store.scope(
state: {
element = $0[id: id] ?? element
return element
},
id: { _ in id },
state: { $0[id: id]! },
id: store.id(state: \.[id: id]!, action: \.[id: id]),
action: { (id, $0) },
isInvalid: { !$0.ids.contains(id) },
removeDuplicates: nil
@@ -195,3 +187,13 @@ public struct ForEachStore<
self.content
}
}
extension Case {
fileprivate subscript<ID: Hashable, Action>(id id: ID) -> Case<Action>
where Value == (id: ID, action: Action) {
Case<Action>(
embed: { (id: id, action: $0) },
extract: { $0.id == id ? $0.action : nil }
)
}
}