mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 22:55:00 +00:00
Refactoring
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
import SwiftSignalKit
|
||||
import Postbox
|
||||
|
||||
public protocol TelegramEngineDataItem {
|
||||
associatedtype Result
|
||||
}
|
||||
|
||||
protocol AnyPostboxViewDataItem {
|
||||
var key: PostboxViewKey { get }
|
||||
|
||||
func _extract(view: PostboxView) -> Any
|
||||
}
|
||||
|
||||
protocol PostboxViewDataItem: TelegramEngineDataItem, AnyPostboxViewDataItem {
|
||||
func extract(view: PostboxView) -> Result
|
||||
}
|
||||
|
||||
extension PostboxViewDataItem {
|
||||
func _extract(view: PostboxView) -> Any {
|
||||
return self.extract(view: view)
|
||||
}
|
||||
}
|
||||
|
||||
public extension TelegramEngine {
|
||||
final class EngineData {
|
||||
public struct Item {
|
||||
}
|
||||
|
||||
private let account: Account
|
||||
|
||||
init(account: Account) {
|
||||
self.account = account
|
||||
}
|
||||
|
||||
private func _subscribe(items: [AnyPostboxViewDataItem]) -> Signal<[Any], NoError> {
|
||||
return self.account.postbox.combinedView(keys: items.map(\.key))
|
||||
|> map { views -> [Any] in
|
||||
var results: [Any] = []
|
||||
|
||||
for item in items {
|
||||
guard let view = views.views[item.key] else {
|
||||
preconditionFailure()
|
||||
}
|
||||
results.append(item._extract(view: view))
|
||||
}
|
||||
|
||||
return results
|
||||
}
|
||||
}
|
||||
|
||||
public func subscribe<T0: TelegramEngineDataItem>(_ t0: T0) -> Signal<T0.Result, NoError> {
|
||||
return self._subscribe(items: [t0 as! AnyPostboxViewDataItem])
|
||||
|> map { results -> T0.Result in
|
||||
return results[0] as! T0.Result
|
||||
}
|
||||
}
|
||||
public func get<T0: TelegramEngineDataItem>(_ t0: T0) -> Signal<T0.Result, NoError> {
|
||||
return self.subscribe(t0)
|
||||
|> take(1)
|
||||
}
|
||||
|
||||
public func subscribe<
|
||||
T0: TelegramEngineDataItem,
|
||||
T1: TelegramEngineDataItem
|
||||
>(
|
||||
_ t0: T0,
|
||||
_ t1: T1
|
||||
) -> Signal<
|
||||
(
|
||||
T0.Result,
|
||||
T1.Result
|
||||
),
|
||||
NoError> {
|
||||
return self._subscribe(items: [t0 as! AnyPostboxViewDataItem])
|
||||
|> map { results -> (T0.Result, T1.Result) in
|
||||
return (
|
||||
results[0] as! T0.Result,
|
||||
results[1] as! T1.Result
|
||||
)
|
||||
}
|
||||
}
|
||||
public func get<
|
||||
T0: TelegramEngineDataItem,
|
||||
T1: TelegramEngineDataItem
|
||||
>(
|
||||
_ t0: T0,
|
||||
_ t1: T1
|
||||
) -> Signal<
|
||||
(
|
||||
T0.Result,
|
||||
T1.Result
|
||||
),
|
||||
NoError> {
|
||||
return self.subscribe(t0, t1) |> take(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user