mirror of
https://github.com/pointfreeco/swift-composable-architecture.git
synced 2025-12-24 12:14:25 +01:00
Child store caching improvements (#2627)
* Use `ScopeID` for all cached child stores * wip * wip * wip * wip * wip * wip
This commit is contained in:
@@ -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 }
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user