Skip to content

Instantly share code, notes, and snippets.

@PasiHeikkinen
Created March 29, 2018 11:30
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PasiHeikkinen/11fb1d70a46bcb9368d329c175ab52f2 to your computer and use it in GitHub Desktop.
Save PasiHeikkinen/11fb1d70a46bcb9368d329c175ab52f2 to your computer and use it in GitHub Desktop.
func lift<A1, A2, R>(_ f: @escaping (A1, A2) -> R) -> ((Observable<A1>, Observable<A2>) -> Observable<R>) {
return { (a1: Observable<A1>, a2: Observable<A2>) -> Observable<R> in
return Observable.combineLatest(a1, a2).map(f)
}
}
func lift<A, R>(_ f: @escaping (A) -> Observable<R>) -> ((Observable<A>) -> Observable<R>) {
return { (a: Observable<A>) -> Observable<R> in
a.flatMap(f)
}
}
func lift <A1, A2, R>(_ f: @escaping (A1, A2) -> Observable<R>) -> ((Observable<A1>, Observable<A2>) -> Observable<R>) {
return { (a1: Observable<A1>, a2:Observable<A2>) -> Observable<R> in
Observable.combineLatest(a1, a2).flatMap(f)
}
}
struct Credentials {
let username: String
let password: String
}
let loginSignal = PublishSubject<Void>()
let usernameSubject = BehaviorSubject<String>(value: "")
let passwordSubject = BehaviorSubject<String>(value: "")
enum LoginResult {
case success, failure
}
func login(credentials: Credentials) -> Observable<LoginResult> {
if credentials.username == "pasi" && credentials.password == "password1" {
return Observable.just(.success)
} else {
return Observable.just(.failure)
}
}
let createCredentials = lift(Credentials.init)
let login_ = lift(login)
login_(loginSignal.withLatestFrom(createCredentials(usernameSubject, passwordSubject))).debug("login").subscribe()
usernameSubject.onNext("pasi")
passwordSubject.onNext("pasword")
loginSignal.onNext(())
// login -> Event next(failure)
passwordSubject.onNext("password1")
loginSignal.onNext(())
// login -> Event next(success)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment