Swiftgram/submodules/Postbox/Sources/ItemCollectionIdsView.swift

70 lines
2.4 KiB
Swift

import Foundation
final class MutableItemCollectionIdsView: MutablePostboxView {
let namespaces: [ItemCollectionId.Namespace]
var idsByNamespace: [ItemCollectionId.Namespace: Set<ItemCollectionId>]
init(postbox: PostboxImpl, namespaces: [ItemCollectionId.Namespace]) {
self.namespaces = namespaces
var idsByNamespace: [ItemCollectionId.Namespace: Set<ItemCollectionId>] = [:]
for namespace in namespaces {
let ids = postbox.itemCollectionInfoTable.getIds(namespace: namespace)
idsByNamespace[namespace] = Set(ids)
}
self.idsByNamespace = idsByNamespace
}
func replay(postbox: PostboxImpl, transaction: PostboxTransaction) -> Bool {
if transaction.currentItemCollectionInfosOperations.isEmpty {
return false
}
var updated = false
var reloadInfosNamespaces = Set<ItemCollectionId.Namespace>()
for operation in transaction.currentItemCollectionInfosOperations {
switch operation {
case let .replaceInfos(namespace):
reloadInfosNamespaces.insert(namespace)
}
}
if !reloadInfosNamespaces.isEmpty {
for namespace in self.namespaces {
if reloadInfosNamespaces.contains(namespace) {
updated = true
let ids = postbox.itemCollectionInfoTable.getIds(namespace: namespace)
self.idsByNamespace[namespace] = Set(ids)
}
}
}
return updated
}
func refreshDueToExternalTransaction(postbox: PostboxImpl) -> Bool {
var idsByNamespace: [ItemCollectionId.Namespace: Set<ItemCollectionId>] = [:]
for namespace in namespaces {
let ids = postbox.itemCollectionInfoTable.getIds(namespace: namespace)
idsByNamespace[namespace] = Set(ids)
}
if self.idsByNamespace != idsByNamespace {
self.idsByNamespace = idsByNamespace
return true
} else {
return false
}
}
func immutableView() -> PostboxView {
return ItemCollectionIdsView(self)
}
}
public final class ItemCollectionIdsView: PostboxView {
public let idsByNamespace: [ItemCollectionId.Namespace: Set<ItemCollectionId>]
init(_ view: MutableItemCollectionIdsView) {
self.idsByNamespace = view.idsByNamespace
}
}