Skip to content

Instantly share code, notes, and snippets.

@jeremiegirault
Created May 31, 2017 14:17
Show Gist options
  • Save jeremiegirault/feccf53707ffa7f1838568201825a29a to your computer and use it in GitHub Desktop.
Save jeremiegirault/feccf53707ffa7f1838568201825a29a to your computer and use it in GitHub Desktop.
Rx Custom transformations
protocol CustomTransform {
associatedtype Result
func apply(_ sink: (Result) -> Void)
}
enum FilterMap<Result>: CustomTransform {
case filter
case map(Result)
func apply(_ sink: (Result) -> Void) {
switch self {
case .filter: return
case .map(let value): sink(value)
}
}
}
extension ObservableType {
func customTransform<T: CustomTransform>(_ transform: @escaping (E) -> T) -> Observable<T.Result> {
return Observable.create { observer in
return self.subscribe { event in
switch event {
case .next(let element): transform(element).apply { observer.onNext($0) }
case .completed: observer.onCompleted()
case .error(let error): observer.onError(error)
}
}
}
}
func filterMap<T>(_ transform: @escaping (E) -> FilterMap<T>) -> Observable<T> {
return customTransform(transform)
}
}
// Usage:
Observable.of(1,2,3).filterMap {
if $0 % 2 == 0 { return .filter }
return .map(2*$0)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment