Created
January 31, 2022 17:15
-
-
Save iamchiwon/0bbd8a412f005d9f58c4234a4ed575e8 to your computer and use it in GitHub Desktop.
RxSwift 클론하기
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // | |
| // MyObservable.swift | |
| // RxJavaExample | |
| // | |
| // Created by Chiwon Song | |
| // | |
| import Foundation | |
| class MyObservable<T> { | |
| private var valueMaker: ((@escaping (T) -> Void) -> Void)? | |
| private init(valueMaker: @escaping (_ receiver: @escaping (T) -> Void) -> Void) { | |
| self.valueMaker = valueMaker | |
| } | |
| static func create(_ maker: @escaping (_ receiver: @escaping (T) -> Void) -> Void) -> MyObservable<T> { | |
| return MyObservable(valueMaker: maker) | |
| } | |
| func subscribe(_ receiver: @escaping (T) -> Void) { | |
| guard let valueMaker = valueMaker else { | |
| fatalError("valueMaker is nil") | |
| } | |
| valueMaker(receiver) | |
| } | |
| } | |
| extension MyObservable { | |
| static func just(_ value: T) -> MyObservable<T> { | |
| return MyObservable<T> { receiver in | |
| DispatchQueue.global().async { | |
| receiver(value) | |
| } | |
| } | |
| } | |
| } | |
| extension MyObservable { | |
| static func from(_ value: [T]) -> MyObservable<T> { | |
| return MyObservable<T> { receiver in | |
| value.forEach { t in | |
| DispatchQueue.global().async { | |
| receiver(t) | |
| } | |
| } | |
| } | |
| } | |
| } | |
| extension MyObservable { | |
| func filter(_ filter: @escaping (T) -> Bool) -> MyObservable<T> { | |
| return MyObservable<T> { receiver in | |
| self.subscribe { t in | |
| if filter(t) { | |
| DispatchQueue.global().async { | |
| receiver(t) | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| extension MyObservable { | |
| func map<U>(_ mapper: @escaping (T) -> U) -> MyObservable<U> { | |
| return MyObservable<U> { receiver in | |
| self.subscribe { t in | |
| DispatchQueue.global().async { | |
| receiver(mapper(t)) | |
| } | |
| } | |
| } | |
| } | |
| } | |
| extension MyObservable { | |
| func flatMap<U>(_ mapper: @escaping (T) -> MyObservable<U>) -> MyObservable<U> { | |
| return MyObservable<U> { receiver in | |
| self.subscribe { t in | |
| mapper(t).subscribe { u in | |
| DispatchQueue.global().async { | |
| receiver(u) | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| extension MyObservable { | |
| func filterNil<U>() -> MyObservable<U> where T == U? { | |
| return filter { $0 != nil }.map { $0! } | |
| } | |
| } | |
| extension MyObservable { | |
| func main() -> MyObservable<T> { | |
| return MyObservable<T> { receiver in | |
| self.subscribe { t in | |
| DispatchQueue.main.async { | |
| receiver(t) | |
| } | |
| } | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment