Skip to content

Instantly share code, notes, and snippets.

@lingoer
Created March 4, 2021 05:04
Show Gist options
  • Save lingoer/339b161f0a2eeccf9f2bb7ec60738336 to your computer and use it in GitHub Desktop.
Save lingoer/339b161f0a2eeccf9f2bb7ec60738336 to your computer and use it in GitHub Desktop.
demo
import Combine
enum SDKError: Error{
case err0
}
typealias OnSuccessCallback<T> = (_ result: T) -> Void
typealias OnFailureCallback = (_ error: SDKError) -> Void
struct APIDemo{
func api1(param:String, onSuccess:OnSuccessCallback<Int>, onFailure: OnFailureCallback){
if param == "1" {
onSuccess(0)
}
onFailure(.err0)
}
func api2(param:Int, onSuccess:OnSuccessCallback<String>, onFailure: OnFailureCallback){
if param == 1 {
onSuccess("a")
}
onFailure(.err0)
}
}
APIDemo().api1(param: "1") { (result) in
print(result)
} onFailure: { (err) in
print(err)
}
typealias APIFunc<T,U> = (T,OnSuccessCallback<U>,OnFailureCallback) -> Void
typealias APIRxFunc<T,U> = (T) -> AnyPublisher<U, SDKError>
func rx<T,U>(_ f: @escaping APIFunc<T,U>)->APIRxFunc<T,U> {
return { (param:T) -> AnyPublisher<U,SDKError> in
return Future(){ promise in
f(param, {result in
promise(.success(result))
},{error in
promise(.failure(error))
})
}.eraseToAnyPublisher()
}
}
var bag:[AnyCancellable] = []
rx(APIDemo().api1)("")
.map { (val) -> Int in
val + 1
}
.flatMap(rx(APIDemo().api2))
.sink { (comp) in
print(comp)
} receiveValue: { (val) in
print(val)
}.store(in: &bag)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment