diff --git a/Documentation/API.md b/Documentation/API.md index 8fcbc7e8..c25d5dbc 100644 --- a/Documentation/API.md +++ b/Documentation/API.md @@ -102,13 +102,13 @@ Creating new operators is also pretty straightforward. ```swift -extension NSObject { +extension Reactive where Base: NSObject { public var deallocated: Observable {} #if !DISABLE_SWIZZLING - public var rx_deallocating: Observable {} + public var deallocating: Observable {} #endif @@ -118,9 +118,9 @@ extension NSObject { ```swift -extension NSObject { +extension Reactive where Base: NSObject { - public func rx_observe( + public func observe( type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = .New | .Initial, @@ -129,7 +129,7 @@ extension NSObject { #if !DISABLE_SWIZZLING - public func rx_observeWeakly( + public func observeWeakly( type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = .New | .Initial @@ -140,23 +140,23 @@ extension NSObject { ``` ```swift -extension NSURLSession { +extension Reactive where Base: NSURLSession { - public func rx_response(request: NSURLRequest) -> Observable<(NSData, NSURLResponse)> {} + public func response(request: NSURLRequest) -> Observable<(NSData, NSURLResponse)> {} - public func rx_data(request: NSURLRequest) -> Observable {} + public func data(request: NSURLRequest) -> Observable {} - public func rx_JSON(request: NSURLRequest) -> Observable {} + public func JSON(request: NSURLRequest) -> Observable {} - public func rx_JSON(URL: NSURL) -> Observable {} + public func JSON(URL: NSURL) -> Observable {} } ``` ```swift -extension NSNotificationCenter { +extension Reactive where Base: NSNotificationCenter { - public func rx_notification(name: String, object: AnyObject?) -> Observable {} + public func notification(name: String, object: AnyObject?) -> Observable {} } ``` @@ -170,39 +170,39 @@ class DelegateProxy { ``` ```swift -extension CLLocationManager { +extension Reactive where Base: CLLocationManager { - public var rx_delegate: DelegateProxy {} + public var delegate: DelegateProxy {} - public var rx_didUpdateLocations: Observable<[CLLocation]> {} + public var didUpdateLocations: Observable<[CLLocation]> {} - public var rx_didFailWithError: Observable {} + public var didFailWithError: Observable {} - public var rx_didFinishDeferredUpdatesWithError: Observable {} + public var didFinishDeferredUpdatesWithError: Observable {} - public var rx_didPauseLocationUpdates: Observable {} + public var didPauseLocationUpdates: Observable {} - public var rx_didResumeLocationUpdates: Observable {} + public var didResumeLocationUpdates: Observable {} - public var rx_didUpdateHeading: Observable {} + public var didUpdateHeading: Observable {} - public var rx_didEnterRegion: Observable {} + public var didEnterRegion: Observable {} - public var rx_didExitRegion: Observable {} + public var didExitRegion: Observable {} - public var rx_didDetermineStateForRegion: Observable<(state: CLRegionState, region: CLRegion)> {} + public var didDetermineStateForRegion: Observable<(state: CLRegionState, region: CLRegion)> {} - public var rx_monitoringDidFailForRegionWithError: Observable<(region: CLRegion?, error: NSError)> {} + public var monitoringDidFailForRegionWithError: Observable<(region: CLRegion?, error: NSError)> {} - public var rx_didStartMonitoringForRegion: Observable {} + public var didStartMonitoringForRegion: Observable {} - public var rx_didRangeBeaconsInRegion: Observable<(beacons: [CLBeacon], region: CLBeaconRegion)> {} + public var didRangeBeaconsInRegion: Observable<(beacons: [CLBeacon], region: CLBeaconRegion)> {} - public var rx_rangingBeaconsDidFailForRegionWithError: Observable<(region: CLBeaconRegion, error: NSError)> {} + public var rangingBeaconsDidFailForRegionWithError: Observable<(region: CLBeaconRegion, error: NSError)> {} - public var rx_didVisit: Observable {} + public var didVisit: Observable {} - public var rx_didChangeAuthorizationStatus: Observable {} + public var didChangeAuthorizationStatus: Observable {} } ``` @@ -211,281 +211,281 @@ extension CLLocationManager { ```swift -extension UIControl { +extension Reactive where Base: UIControl { - public func rx_controlEvent(controlEvents: UIControlEvents) -> ControlEvent {} + public func controlEvent(controlEvents: UIControlEvents) -> ControlEvent {} - public var rx_enabled: ObserverOf {} + public var enabled: ObserverOf {} } ``` ```swift -extension UIButton { +extension Reactive where Base: UIButton { - public var rx_tap: ControlEvent {} + public var tap: ControlEvent {} } ``` ```swift -extension UITextField { +extension Reactive where Base: UITextField { - public var rx_text: ControlProperty {} + public var text: ControlProperty {} } ``` ```swift -extension UITextView { +extension Reactive where Base: UITextView { - override func rx_createDelegateProxy() -> RxScrollViewDelegateProxy {} + override func createDelegateProxy() -> RxScrollViewDelegateProxy {} - public var rx_text: ControlProperty {} + public var text: ControlProperty {} } ``` ```swift -extension UISearchBar { +extension Reactive where Base: UISearchBar { - public var rx_delegate: DelegateProxy {} + public var delegate: DelegateProxy {} - public var rx_searchText: ControlProperty {} + public var searchText: ControlProperty {} } ``` ```swift -extension UILabel { +extension Reactive where Base: UILabel { - public var rx_text: ObserverOf {} + public var text: ObserverOf {} } ``` ```swift -extension UIDatePicker { +extension Reactive where Base: UIDatePicker { - public var rx_date: ControlProperty {} + public var date: ControlProperty {} } ``` ```swift -extension UIImageView { +extension Reactive where Base: UIImageView { - public var rx_image: ObserverOf {} + public var image: ObserverOf {} - public func rx_imageAnimated(transitionType: String?) -> AnyObserver + public func imageAnimated(transitionType: String?) -> AnyObserver } ``` ```swift -extension UIScrollView { +extension Reactive where Base: UIScrollView { - public var rx_delegate: DelegateProxy {} + public var delegate: DelegateProxy {} - public func rx_setDelegate(delegate: UIScrollViewDelegate) {} + public func setDelegate(delegate: UIScrollViewDelegate) {} - public var rx_contentOffset: ControlProperty {} + public var contentOffset: ControlProperty {} } ``` ```swift -extension UIBarButtonItem { +extension Reactive where Base: UIBarButtonItem { - public var rx_tap: ControlEvent {} + public var tap: ControlEvent {} } ``` ```swift -extension UISlider { +extension Reactive where Base: UISlider { - public var rx_value: ControlProperty {} + public var value: ControlProperty {} } ``` ```swift -extension UITableView { +extension Reactive where Base: UITableView { - public var rx_dataSource: DelegateProxy {} + public var dataSource: DelegateProxy {} - public func rx_setDataSource(dataSource: UITableViewDataSource) -> Disposable {} + public func setDataSource(dataSource: UITableViewDataSource) -> Disposable {} - public func rx_itemsWithCellFactory(source: O)(cellFactory: (UITableView, Int, S.Iterator.Element) -> UITableViewCell) -> Disposable {} + public func itemsWithCellFactory(source: O)(cellFactory: (UITableView, Int, S.Iterator.Element) -> UITableViewCell) -> Disposable {} - public func rx_itemsWithCellIdentifier(cellIdentifier: String, cellType: Cell.Type = Cell.self)(source: O)(configureCell: (Int, S.Iterator.Element, Cell) -> Void) -> Disposable {} + public func itemsWithCellIdentifier(cellIdentifier: String, cellType: Cell.Type = Cell.self)(source: O)(configureCell: (Int, S.Iterator.Element, Cell) -> Void) -> Disposable {} - public func rx_itemsWithDataSource(dataSource: DataSource)(source: O) -> Disposable {} + public func itemsWithDataSource(dataSource: DataSource)(source: O) -> Disposable {} - public var rx_itemSelected: ControlEvent {} + public var itemSelected: ControlEvent {} - public var rx_itemDeselected: ControlEvent {} + public var itemDeselected: ControlEvent {} - public var rx_itemInserted: ControlEvent {} + public var itemInserted: ControlEvent {} - public var rx_itemDeleted: ControlEvent {} + public var itemDeleted: ControlEvent {} - public var rx_itemMoved: ControlEvent {} + public var itemMoved: ControlEvent {} - // This method only works in case one of the `rx_itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType` - public func rx_modelSelected(modelType: T.Type) -> ControlEvent {} + // This method only works in case one of the `rx.itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType` + public func modelSelected(modelType: T.Type) -> ControlEvent {} - // This method only works in case one of the `rx_itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType` - public func rx_modelDeselected(modelType: T.Type) -> ControlEvent {} + // This method only works in case one of the `rx.itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType` + public func modelDeselected(modelType: T.Type) -> ControlEvent {} } ``` ```swift -extension UICollectionView { +extension Reactive where Base: UICollectionView { - public var rx_dataSource: DelegateProxy {} + public var dataSource: DelegateProxy {} - public func rx_setDataSource(dataSource: UICollectionViewDataSource) -> Disposable {} + public func setDataSource(dataSource: UICollectionViewDataSource) -> Disposable {} - public func rx_itemsWithCellFactory(source: O)(cellFactory: (UICollectionView, Int, S.Iterator.Element) -> UICollectionViewCell) -> Disposable {} + public func itemsWithCellFactory(source: O)(cellFactory: (UICollectionView, Int, S.Iterator.Element) -> UICollectionViewCell) -> Disposable {} - public func rx_itemsWithCellIdentifier(cellIdentifier: String, cellType: Cell.Type = Cell.self)(source: O)(configureCell: (Int, S.Iterator.Element, Cell) -> Void) -> Disposable {} + public func itemsWithCellIdentifier(cellIdentifier: String, cellType: Cell.Type = Cell.self)(source: O)(configureCell: (Int, S.Iterator.Element, Cell) -> Void) -> Disposable {} - public func rx_itemsWithDataSource(dataSource: DataSource)(source: O) -> Disposable {} + public func itemsWithDataSource(dataSource: DataSource)(source: O) -> Disposable {} - public var rx_itemSelected: ControlEvent {} + public var itemSelected: ControlEvent {} - public var rx_itemDeselected: ControlEvent {} + public var itemDeselected: ControlEvent {} - // This method only works in case one of the `rx_itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType` - public func rx_modelSelected(modelType: T.Type) -> ControlEvent {} + // This method only works in case one of the `rx.itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType` + public func modelSelected(modelType: T.Type) -> ControlEvent {} - // This method only works in case one of the `rx_itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType` - public func rx_modelSelected(modelType: T.Type) -> ControlEvent {} + // This method only works in case one of the `rx.itemsWith*` methods was used, or data source implements `SectionedViewDataSourceType` + public func modelSelected(modelType: T.Type) -> ControlEvent {} } ``` ```swift -extension UIGestureRecognizer { +extension Reactive where Base: UIGestureRecognizer { - public var rx_event: ControlEvent {} + public var event: ControlEvent {} } ``` ```swift -extension UIImagePickerController { +extension Reactive where Base: UIImagePickerController { - public var rx_didFinishPickingMediaWithInfo: Observable<[String : AnyObject]> {} + public var didFinishPickingMediaWithInfo: Observable<[String : AnyObject]> {} - public var rx_didCancel: Observable<()> {} + public var didCancel: Observable<()> {} } ``` ```swift -extension UISegmentedControl { +extension Reactive where Base: UISegmentedControl { - public var rx_value: ControlProperty {} + public var value: ControlProperty {} } ``` ```swift -extension UISwitch { +extension Reactive where Base: UISwitch { - public var rx_value: ControlProperty {} + public var value: ControlProperty {} } ``` ```swift -extension UIActivityIndicatorView { +extension Reactive where Base: UIActivityIndicatorView { - public var rx_animating: AnyObserver {} + public var animating: AnyObserver {} } ``` ```swift -extension UINavigationItem { +extension Reactive where Base: UINavigationItem { - public var rx_title: AnyObserver {} + public var title: AnyObserver {} } ``` **OSX** ```swift -extension NSControl { +extension Reactive where Base: NSControl { - public var rx_controlEvent: ControlEvent<()> {} + public var controlEvent: ControlEvent<()> {} - public var rx_enabled: AnyObserver {} + public var enabled: AnyObserver {} } ``` ```swift -extension NSSlider { +extension Reactive where Base: NSSlider { - public var rx_value: ControlProperty {} + public var value: ControlProperty {} } ``` ```swift -extension NSButton { +extension Reactive where Base: NSButton { - public var rx_tap: ControlEvent {} + public var tap: ControlEvent {} - public var rx_state: ControlProperty {} + public var state: ControlProperty {} } ``` ```swift -extension NSImageView { +extension Reactive where Base: NSImageView { - public var rx_image: ObserverOf {} + public var image: ObserverOf {} - public func rx_imageAnimated(transitionType: String?) -> AnyObserver + public func imageAnimated(transitionType: String?) -> AnyObserver } ``` ```swift -extension NSTextField { +extension Reactive where Base: NSTextField { - public var rx_delegate: DelegateProxy {} + public var delegate: DelegateProxy {} - public var rx_text: ControlProperty {} + public var text: ControlProperty {} } ``` ```swift -extension UITabBarItem { +extension Reactive where Base: UITabBarItem { - public var rx_badgeValue: AnyObserver {} + public var badgeValue: AnyObserver {} } ``` ```swift -extension UITabBar { +extension Reactive where Base: UITabBar { - public var rx_didSelectItem: ControlEvent {} + public var didSelectItem: ControlEvent {} - public var rx_willBeginCustomizing: ControlEvent<[UITabBarItem]> {} + public var willBeginCustomizing: ControlEvent<[UITabBarItem]> {} - public var rx_didBeginCustomizing: ControlEvent<[UITabBarItem]> {} + public var didBeginCustomizing: ControlEvent<[UITabBarItem]> {} - public var rx_willEndCustomizing: ControlEvent<(items: [UITabBarItem], changed: Bool)> {} + public var willEndCustomizing: ControlEvent<(items: [UITabBarItem], changed: Bool)> {} - public var rx_didEndCustomizing: ControlEvent<(items: [UITabBarItem], changed: Bool)> {} + public var didEndCustomizing: ControlEvent<(items: [UITabBarItem], changed: Bool)> {} } ``` diff --git a/Documentation/Examples.md b/Documentation/Examples.md index 0c4e09c8..d3cb73a0 100644 --- a/Documentation/Examples.md +++ b/Documentation/Examples.md @@ -72,17 +72,17 @@ b.value = -8 // doesn't print anything ## Simple UI bindings -* Instead of binding to variables, let's bind to `UITextField` values using the `rx_text` property +* Instead of binding to variables, let's bind to `UITextField` values using the `rx.text` property * Next, `map` the `String` into an `Int` and determine if the number is prime using an async API * If the text is changed before the async call completes, a new async call will replace it via `concat` * Bind the results to a `UILabel` ```swift -let subscription/*: Disposable */ = primeTextField.rx_text // type is Observable +let subscription/*: Disposable */ = primeTextField.rx.text // type is Observable .map { WolframAlphaIsPrime(Int($0) ?? 0) } // type is Observable> .concat() // type is Observable .map { "number \($0.n) is prime? \($0.isPrime)" } // type is Observable - .bindTo(resultLabel.rx_text) // return Disposable that can be used to unbind everything + .bindTo(resultLabel.rx.text) // return Disposable that can be used to unbind everything // This will set `resultLabel.text` to "number 43 is prime? true" after // server call completes. @@ -108,7 +108,7 @@ Let's give it a shot. ```swift // bind UI control values directly // use username from `usernameOutlet` as username values source -self.usernameOutlet.rx_text +self.usernameOutlet.rx.text .map { username in // synchronous validation, nothing special here diff --git a/Documentation/GettingStarted.md b/Documentation/GettingStarted.md index 7663d9b5..3f3630de 100644 --- a/Documentation/GettingStarted.md +++ b/Documentation/GettingStarted.md @@ -208,7 +208,7 @@ Additional way to automatically dispose subscription on dealloc is to use `takeU ```swift sequence - .takeUntil(self.deallocated) + .takeUntil(self.rx.deallocated) .subscribe { print($0) } @@ -554,8 +554,8 @@ Behavior for URL observables is equivalent. This is how HTTP requests are wrapped in Rx. It's pretty much the same pattern like the `interval` operator. ```swift -extension NSURLSession { - public func rx_response(request: NSURLRequest) -> Observable<(NSData, NSURLResponse)> { +extension Reactive where Base: NSURLSession { + public func response(request: NSURLRequest) -> Observable<(NSData, NSURLResponse)> { return Observable.create { observer in let task = self.dataTaskWithRequest(request) { (data, response, error) in guard let response = response, data = data else { @@ -933,14 +933,14 @@ There are two built in ways this library supports KVO. ```swift // KVO -extension NSObject { - public func rx_observe(type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions, retainSelf: Bool = true) -> Observable {} +extension Reactive where Base: NSObject { + public func observe(type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions, retainSelf: Bool = true) -> Observable {} } #if !DISABLE_SWIZZLING // KVO -extension NSObject { - public func rx_observeWeakly(type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions) -> Observable {} +extension Reactive where Base: NSObject { + public func observeWeakly(type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions) -> Observable {} } #endif ``` @@ -951,7 +951,7 @@ Example how to observe frame of `UIView`. ```swift view - .rx_observe(CGRect.self, "frame") + .rx.observe(CGRect.self, "frame") .subscribe(onNext: { frame in ... }) @@ -961,15 +961,15 @@ or ```swift view - .rx_observeWeakly(CGRect.self, "frame") + .rx.observeWeakly(CGRect.self, "frame") .subscribe(onNext: { frame in ... }) ``` -### `rx_observe` +### `rx.observe` -`rx_observe` is more performant because it's just a simple wrapper around KVO mechanism, but it has more limited usage scenarios +`rx.observe` is more performant because it's just a simple wrapper around KVO mechanism, but it has more limited usage scenarios * it can be used to observe paths starting from `self` or from ancestors in ownership graph (`retainSelf = false`) * it can be used to observe paths starting from descendants in ownership graph (`retainSelf = true`) @@ -978,14 +978,14 @@ view E.g. ```swift -self.rx_observe(CGRect.self, "view.frame", retainSelf: false) +self.rx.observe(CGRect.self, "view.frame", retainSelf: false) ``` -### `rx_observeWeakly` +### `rx.observeWeakly` -`rx_observeWeakly` has somewhat slower than `rx_observe` because it has to handle object deallocation in case of weak references. +`rx.observeWeakly` has somewhat slower than `rx.observe` because it has to handle object deallocation in case of weak references. -It can be used in all cases where `rx_observe` can be used and additionally +It can be used in all cases where `rx.observe` can be used and additionally * because it won't retain observed target, it can be used to observe arbitrary object graph whose ownership relation is unknown * it can be used to observe `weak` properties @@ -993,7 +993,7 @@ It can be used in all cases where `rx_observe` can be used and additionally E.g. ```swift -someSuspiciousViewController.rx_observeWeakly(Bool.self, "behavingOk") +someSuspiciousViewController.rx.observeWeakly(Bool.self, "behavingOk") ``` ### Observing structs @@ -1004,7 +1004,7 @@ KVO is an Objective-C mechanism so it relies heavily on `NSValue`. When observing some other structures it is necessary to extract those structures from `NSValue` manually. -[Here](../RxCocoa/Common/KVORepresentable+CoreGraphics.swift) are examples how to extend KVO observing mechanism and `rx_observe*` methods for other structs by implementing `KVORepresentable` protocol. +[Here](../RxCocoa/Common/KVORepresentable+CoreGraphics.swift) are examples how to extend KVO observing mechanism and `rx.observe*` methods for other structs by implementing `KVORepresentable` protocol. ## UI layer tips @@ -1070,7 +1070,7 @@ let request = NSURLRequest(URL: NSURL(string: "http://en.wikipedia.org/w/api.php If you want to just execute that request outside of composition with other observables, this is what needs to be done. ```swift -let responseJSON = NSURLSession.sharedSession().rx_JSON(request) +let responseJSON = NSURLSession.sharedSession().rx.JSON(request) // no requests will be performed up to this point // `responseJSON` is just a description how to fetch the response @@ -1093,7 +1093,7 @@ cancelRequest.dispose() In case you want a more low level access to response, you can use: ```swift -NSURLSession.sharedSession().rx_response(myNSURLRequest) +NSURLSession.sharedSession().rx.response(myNSURLRequest) .debug("my request") // this will print out information to console .flatMap { (data: NSData!, response: NSURLResponse!) -> Observable in if let response = response as? NSHTTPURLResponse { diff --git a/Documentation/Units.md b/Documentation/Units.md index c1d2a11f..5f347da5 100644 --- a/Documentation/Units.md +++ b/Documentation/Units.md @@ -164,7 +164,7 @@ E.g. This is a typical beginner example. ```swift -let results = query.rx_text +let results = query.rx.text .throttle(0.3, scheduler: MainScheduler.instance) .flatMapLatest { query in fetchAutoCompleteItems(query) @@ -172,11 +172,11 @@ let results = query.rx_text results .map { "\($0.count)" } - .bindTo(resultCount.rx_text) + .bindTo(resultCount.rx.text) .addDisposableTo(disposeBag) results - .bindTo(resultsTableView.rx_itemsWithCellIdentifier("Cell")) { (_, result, cell) in + .bindTo(resultsTableView.rx.itemsWithCellIdentifier("Cell")) { (_, result, cell) in cell.textLabel?.text = "\(result)" } .addDisposableTo(disposeBag) @@ -195,7 +195,7 @@ So, what are the problems with this code?: A more appropriate version of the code would look like this: ```swift -let results = query.rx_text +let results = query.rx.text .throttle(0.3, scheduler: MainScheduler.instance) .flatMapLatest { query in fetchAutoCompleteItems(query) @@ -207,11 +207,11 @@ let results = query.rx_text results .map { "\($0.count)" } - .bindTo(resultCount.rx_text) + .bindTo(resultCount.rx.text) .addDisposableTo(disposeBag) results - .bindTo(resultTableView.rx_itemsWithCellIdentifier("Cell")) { (_, result, cell) in + .bindTo(resultTableView.rx.itemsWithCellIdentifier("Cell")) { (_, result, cell) in cell.textLabel?.text = "\(result)" } .addDisposableTo(disposeBag) @@ -222,7 +222,7 @@ Making sure all of these requirements are properly handled in large systems can The following code looks almost the same: ```swift -let results = query.rx_text.asDriver() // This converts a normal sequence into a `Driver` sequence. +let results = query.rx.text.asDriver() // This converts a normal sequence into a `Driver` sequence. .throttle(0.3, scheduler: MainScheduler.instance) .flatMapLatest { query in fetchAutoCompleteItems(query) @@ -231,11 +231,11 @@ let results = query.rx_text.asDriver() // This converts a normal sequence results .map { "\($0.count)" } - .drive(resultCount.rx_text) // If there is a `drive` method available instead of `bindTo`, + .drive(resultCount.rx.text) // If there is a `drive` method available instead of `bindTo`, .addDisposableTo(disposeBag) // that means that the compiler has proven that all properties // are satisfied. results - .drive(resultTableView.rx_itemsWithCellIdentifier("Cell")) { (_, result, cell) in + .drive(resultTableView.rx.itemsWithCellIdentifier("Cell")) { (_, result, cell) in cell.textLabel?.text = "\(result)" } .addDisposableTo(disposeBag) @@ -246,7 +246,7 @@ So what is happening here? This first `asDriver` method converts the `ControlProperty` unit to a `Driver` unit. ```swift -query.rx_text.asDriver() +query.rx.text.asDriver() ``` Notice that there wasn't anything special that needed to be done. `Driver` has all of the properties of the `ControlProperty` unit, plus some more. The underlying observable sequence is just wrapped as a `Driver` unit, and that's it. diff --git a/README.md b/README.md index b65cb038..989d15cf 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ KVO observing, async operations and streams are all unified under [abstraction o
-let searchResults = searchBar.rx_text
+let searchResults = searchBar.rx.text
     .throttle(0.3, scheduler: MainScheduler.instance)
     .distinctUntilChanged()
     .flatMapLatest { query -> Observable<[Repository]> in
@@ -96,7 +96,7 @@ let searchResults = searchBar.rx_text
   
     
 searchResults
-    .bindTo(tableView.rx_itemsWithCellIdentifier("Cell")) {
+    .bindTo(tableView.rx.itemsWithCellIdentifier("Cell")) {
         (index, repository: Repository, cell) in
         cell.textLabel?.text = repository.name
         cell.detailTextLabel?.text = repository.url