Skip to content

Instantly share code, notes, and snippets.

@r0nn
Created March 6, 2017 07:33
Show Gist options
  • Save r0nn/be7f29b91674bf54b5307c2ccf6efd83 to your computer and use it in GitHub Desktop.
Save r0nn/be7f29b91674bf54b5307c2ccf6efd83 to your computer and use it in GitHub Desktop.
ReSwift-EpicMiddleware
import RxSwift
import ReSwift
public typealias Epic = (Observable<Action>, @escaping GetState) -> Observable<Action>
public func CombineEpics(epics: [Epic]) -> Epic {
return { (actions: Observable<Action>, getState: @escaping GetState) -> Observable<Action> in
return Observable.from(epics)
.map{ e in e(actions, getState) }
.merge()
}
}
class EpicMiddleware {
private let disposeBag = DisposeBag()
private var epic: Epic
init(epic: @escaping Epic) {
self.epic = epic
}
func createMiddleware() -> Middleware {
let middleware: Middleware = { dispatch, getState in
return { next in
let epicSubject = PublishSubject<Epic>()
let actionSubject = PublishSubject<Action>()
epicSubject
.map{ e in
return e(actionSubject, getState)
}
.flatMapLatest{ output in
return output
}
.subscribe(onNext: { action in
_ = dispatch?(action)
})
.addDisposableTo(self.disposeBag)
epicSubject.onNext(self.epic)
return { action in
let result = next(action)
actionSubject.onNext(action)
return result
}
}
}
return middleware
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment