Skip to content

Instantly share code, notes, and snippets.

@Revolucent
Created September 24, 2018 07:23
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 Revolucent/cea9545827ae88d4d39ed6f199f20228 to your computer and use it in GitHub Desktop.
Save Revolucent/cea9545827ae88d4d39ed6f199f20228 to your computer and use it in GitHub Desktop.
Observe ReSwift subscriptions using RxSwift
import Foundation
import ReSwift
import RxSwift
private class StoreObserver<SelectedState>: StoreSubscriber {
private let onNext: (SelectedState) -> Void
init(onNext: @escaping (SelectedState) -> Void) {
self.onNext = onNext
}
func newState(state: SelectedState) {
onNext(state)
}
}
extension Store {
/**
Observe a ReSwift subscription.
```
store.observe {
$0.select { $0.shoeSize }.skipRepeats()
}.subscribe(onNext: { shoeSize in
print(shoeSize)
})
```
*/
func observe<SelectedState>(_ transform: @escaping (Subscription<State>) -> Subscription<SelectedState>) -> Observable<SelectedState> {
return Observable.create { [weak self] observer in
let storeObserver = StoreObserver(onNext: observer.onNext)
self?.subscribe(storeObserver, transform: transform)
return Disposables.create { [weak self] in
self?.unsubscribe(storeObserver)
}
}
}
/**
Observe a `KeyPath` in the store's state.
```
store.observe(\.shoeSize).subscribe(onNext: { shoeSize in print(shoeSize) })
```
*/
func observe<SelectedState>(_ keyPath: KeyPath<State, SelectedState>) -> Observable<SelectedState> {
return observe{ $0.select{ $0[keyPath: keyPath] } }
}
/**
Observe a `KeyPath` in the store's state.
```
store.observe(\.shoeSize).subscribe(onNext: { shoeSize in print(shoeSize) })
```
*/
func observe<SelectedState: Equatable>(_ keyPath: KeyPath<State, SelectedState>) -> Observable<SelectedState> {
return observe{ $0.select{ $0[keyPath: keyPath] }.skipRepeats() }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment