// RUN: %target-parse-verify-swift protocol Observer { associatedtype Value func onNext(item: Value) -> Void func onCompleted() -> Void func onError(error: String) -> Void } protocol Observable { associatedtype Value func subscribe(observer: O) -> Any } class Subject: Observer, Observable { typealias Value = T // Observer implementation var onNextFunc: ((T) -> Void)? = nil var onCompletedFunc: (() -> Void)? = nil var onErrorFunc: ((String) -> Void)? = nil func onNext(item: T) -> Void { onNextFunc?(item) } func onCompleted() -> Void { onCompletedFunc?() } func onError(error: String) -> Void { onErrorFunc?(error) } // Observable implementation func subscribe(observer: O) -> Any { self.onNextFunc = { (item: T) -> Void in observer.onNext(item) } self.onCompletedFunc = { observer.onCompleted() } self.onErrorFunc = { (error: String) -> Void in observer.onError(error) } return self } } struct X { mutating func replace(a: C) { for i in a.startIndex.. Void } struct IP : P { typealias A = T init(x:O) { _onNext = { (item: A) in x.onNext(item) } } func onNext(item: A) { _onNext(item) } var _onNext: (A) -> () }