mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
57 lines
1.3 KiB
Swift
57 lines
1.3 KiB
Swift
// RUN: %target-swift-frontend -emit-ir %s
|
|
|
|
// https://github.com/apple/swift/issues/54913
|
|
|
|
protocol Dismissable {
|
|
func dismiss(completion: @escaping () -> Void)
|
|
}
|
|
|
|
typealias Completion = (Dismissable?) -> Void
|
|
|
|
protocol Cancelable: AnyObject {
|
|
func cancel()
|
|
}
|
|
|
|
protocol Controller {
|
|
func asyncThing(completion: @escaping ((_ error: Error) -> Void)) -> Cancelable
|
|
}
|
|
|
|
public struct Message: Equatable {
|
|
public static let `default` = Message()
|
|
|
|
public init() {
|
|
}
|
|
|
|
public init(error: Error) {
|
|
self = .default
|
|
}
|
|
}
|
|
|
|
struct PresentAlert {
|
|
let message: Message
|
|
}
|
|
|
|
class Manager {
|
|
private let controller: Controller
|
|
|
|
init(controller: Controller) {
|
|
self.controller = controller
|
|
}
|
|
|
|
func present() {
|
|
let _: Completion = { (dismissable: Dismissable?) in
|
|
dismissable?.dismiss { [weak self] in
|
|
guard let sself = self else { return }
|
|
|
|
sself.controller.asyncThing { error in
|
|
let backupMessage = Message()
|
|
let mainMessage = Message(error: error)
|
|
let finalMessage = mainMessage != Message.default ? mainMessage : backupMessage
|
|
|
|
_ = PresentAlert(message: finalMessage)
|
|
}.cancel()
|
|
}
|
|
}
|
|
}
|
|
}
|