Swiftgram/submodules/TelegramCore/TelegramCore/ManagedMessageHistoryHoles.swift
Peter 5c1613d104 Add 'submodules/TelegramCore/' from commit '9561227540acef69894e6546395ab223a6233600'
git-subtree-dir: submodules/TelegramCore
git-subtree-mainline: 971273e8f8f49a47f14b251d2f35e3445a61fc3f
git-subtree-split: 9561227540acef69894e6546395ab223a6233600
2019-06-11 18:59:08 +01:00

73 lines
2.5 KiB
Swift

import Foundation
#if os(macOS)
import PostboxMac
import SwiftSignalKitMac
#else
import Postbox
import SwiftSignalKit
#endif
private final class ManagedMessageHistoryHolesState {
private var holeDisposables: [MessageHistoryHolesViewEntry: Disposable] = [:]
func clearDisposables() -> [Disposable] {
let disposables = Array(self.holeDisposables.values)
self.holeDisposables.removeAll()
return disposables
}
func update(entries: Set<MessageHistoryHolesViewEntry>) -> (removed: [Disposable], added: [MessageHistoryHolesViewEntry: MetaDisposable]) {
var removed: [Disposable] = []
var added: [MessageHistoryHolesViewEntry: MetaDisposable] = [:]
for (entry, disposable) in self.holeDisposables {
if !entries.contains(entry) {
removed.append(disposable)
self.holeDisposables.removeValue(forKey: entry)
}
}
for entry in entries {
if self.holeDisposables[entry] == nil {
let disposable = MetaDisposable()
self.holeDisposables[entry] = disposable
added[entry] = disposable
}
}
return (removed, added)
}
}
func managedMessageHistoryHoles(accountPeerId: PeerId, network: Network, postbox: Postbox) -> Signal<Void, NoError> {
return Signal { _ in
let state = Atomic(value: ManagedMessageHistoryHolesState())
let disposable = postbox.messageHistoryHolesView().start(next: { view in
let (removed, added) = state.with { state -> (removed: [Disposable], added: [MessageHistoryHolesViewEntry: MetaDisposable]) in
return state.update(entries: view.entries)
}
for disposable in removed {
disposable.dispose()
}
for (entry, disposable) in added {
switch entry.hole {
case let .peer(hole):
disposable.set(fetchMessageHistoryHole(accountPeerId: accountPeerId, source: .network(network), postbox: postbox, peerId: hole.peerId, namespace: hole.namespace, direction: entry.direction, space: entry.space).start())
}
}
})
return ActionDisposable {
disposable.dispose()
for disposable in state.with({ state -> [Disposable] in
state.clearDisposables()
}) {
disposable.dispose()
}
}
}
}