// RUN: %target-typecheck-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 where O.Value == Value } class Subject: Observer, Observable { typealias Value = T // Observer implementation var onNextFunc: ((T) -> Void)? var onCompletedFunc: (() -> Void)? var onErrorFunc: ((String) -> Void)? 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 where O.Value == T { self.onNextFunc = { (item: T) -> Void in observer.onNext(item) } self.onCompletedFunc = { observer.onCompleted() } self.onErrorFunc = { (error: String) -> Void in observer.onError(error) } return self } } protocol P { associatedtype A func onNext(_ item: A) -> Void } struct IP : P { typealias A = T init(x:O) where O.A == IP.A { _onNext = { (item: A) in x.onNext(item) } } func onNext(_ item: A) { _onNext(item) } var _onNext: (A) -> () }