| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 | import Foundationimport RxSwift#if !COCOAPODSimport Moya#endifextension MoyaProvider: ReactiveCompatible {}public extension Reactive where Base: MoyaProviderType {    /// Designated request-making method.    ///    /// - Parameters:    ///   - token: Entity, which provides specifications necessary for a `MoyaProvider`.    ///   - callbackQueue: Callback queue. If nil - queue from provider initializer will be used.    /// - Returns: Single response object.    func request(_ token: Base.Target, callbackQueue: DispatchQueue? = nil) -> Single<Response> {        return Single.create { [weak base] single in            let cancellableToken = base?.request(token, callbackQueue: callbackQueue, progress: nil) { result in                switch result {                case let .success(response):                    single(.success(response))                case let .failure(error):                    single(.error(error))                }            }            return Disposables.create {                cancellableToken?.cancel()            }        }    }    /// Designated request-making method with progress.    func requestWithProgress(_ token: Base.Target, callbackQueue: DispatchQueue? = nil) -> Observable<ProgressResponse> {        let progressBlock: (AnyObserver) -> (ProgressResponse) -> Void = { observer in            return { progress in                observer.onNext(progress)            }        }        let response: Observable<ProgressResponse> = Observable.create { [weak base] observer in            let cancellableToken = base?.request(token, callbackQueue: callbackQueue, progress: progressBlock(observer)) { result in                switch result {                case .success:                    observer.onCompleted()                case let .failure(error):                    observer.onError(error)                }            }            return Disposables.create {                cancellableToken?.cancel()            }        }        // Accumulate all progress and combine them when the result comes        return response.scan(ProgressResponse()) { last, progress in            let progressObject = progress.progressObject ?? last.progressObject            let response = progress.response ?? last.response            return ProgressResponse(progress: progressObject, response: response)        }    }}
 |