├── FunctionalReactiveAwesome.xcodeproj
├── project.pbxproj
└── project.xcworkspace
│ └── contents.xcworkspacedata
├── FunctionalReactiveAwesome.xcworkspace
└── contents.xcworkspacedata
├── FunctionalReactiveAwesome
├── API.swift
├── AppDelegate.swift
├── Base.lproj
│ ├── LaunchScreen.xib
│ └── Main.storyboard
├── EmailValidationDemoViewController.swift
├── Images.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── Info.plist
├── NetworkDemoViewController+Extensions.swift
├── NetworkDemoViewController.swift
├── Operators.swift
├── SignupDemoViewController+Extensions.swift
├── SignupDemoViewController.swift
├── UIControl+Rx.swift
├── UIViewController+Extensions.swift
└── Validation.swift
├── FunctionalReactiveAwesomeTests
├── FunctionalReactiveAwesomeTests.swift
└── Info.plist
├── LICENSE
├── Podfile.lock
├── Pods
├── Alamofire
│ ├── LICENSE
│ ├── README.md
│ └── Source
│ │ ├── Alamofire.swift
│ │ ├── Download.swift
│ │ ├── Manager.swift
│ │ ├── ParameterEncoding.swift
│ │ ├── Request.swift
│ │ ├── ResponseSerialization.swift
│ │ ├── Upload.swift
│ │ └── Validation.swift
├── Headers
│ ├── Private
│ │ └── SVProgressHUD
│ │ │ ├── SVIndefiniteAnimatedView.h
│ │ │ └── SVProgressHUD.h
│ └── Public
│ │ └── SVProgressHUD
│ │ ├── SVIndefiniteAnimatedView.h
│ │ └── SVProgressHUD.h
├── Manifest.lock
├── Moya
│ ├── Endpoint.swift
│ ├── LICENSE
│ ├── Moya+RxSwift.swift
│ ├── Moya.swift
│ ├── MoyaResponse.swift
│ └── README.md
├── Pods.xcodeproj
│ └── project.pbxproj
├── RxCocoa
│ ├── LICENSE.md
│ ├── README.md
│ └── RxCocoa
│ │ └── RxCocoa
│ │ ├── Common
│ │ ├── ControlTarget.swift
│ │ ├── KVOObservable.swift
│ │ ├── Logging.swift
│ │ ├── NSNotificationCenter+Rx.swift
│ │ ├── NSURLSession+Rx.swift
│ │ └── RxCocoa.swift
│ │ └── iOS
│ │ ├── UIBarButtonItem.swift
│ │ ├── UIButton+Rx.swift
│ │ ├── UICollectionView+Rx.swift
│ │ ├── UIControl+Rx.swift
│ │ ├── UIDatePicker.swift
│ │ ├── UIImageView+Rx.swift
│ │ ├── UILabel+Rx.swift
│ │ ├── UIScrollView+Rx.swift
│ │ ├── UISearchBar+Rx.swift
│ │ ├── UISlider+Rx.swift
│ │ ├── UITableView+Rx.swift
│ │ └── UITextField+Rx.swift
├── RxSwift
│ ├── LICENSE.md
│ ├── README.md
│ └── RxSwift
│ │ └── RxSwift
│ │ ├── AnyObject+Rx.swift
│ │ ├── Cancelable.swift
│ │ ├── Concurrency
│ │ ├── AsyncLock.swift
│ │ └── Lock.swift
│ │ ├── DataStructures
│ │ ├── Bag.swift
│ │ └── Queue.swift
│ │ ├── Disposable.swift
│ │ ├── Disposables
│ │ ├── AnonymousDisposable.swift
│ │ ├── CompositeDisposable.swift
│ │ ├── DefaultDisposable.swift
│ │ ├── DisposeBag.swift
│ │ ├── DisposeBase.swift
│ │ ├── ScopedDispose.swift
│ │ ├── SerialDisposable.swift
│ │ └── SingleAssignmentDisposable.swift
│ │ ├── Error.swift
│ │ ├── Event.swift
│ │ ├── Observable+Subscription.swift
│ │ ├── Observable.swift
│ │ ├── Observables
│ │ ├── Implementations
│ │ │ ├── Aggregate.swift
│ │ │ ├── AnonymousObservable.swift
│ │ │ ├── AsObservable.swift
│ │ │ ├── Catch.swift
│ │ │ ├── CombineLatest+arity.swift
│ │ │ ├── CombineLatest.swift
│ │ │ ├── Concat.swift
│ │ │ ├── ConcatSink.swift
│ │ │ ├── ConnectableObservable.swift
│ │ │ ├── Debug.swift
│ │ │ ├── Defer.swift
│ │ │ ├── DistinctUntilChanged.swift
│ │ │ ├── Do.swift
│ │ │ ├── Merge.swift
│ │ │ ├── Multicast.swift
│ │ │ ├── ObservableBase.swift
│ │ │ ├── ObserveSingleOn.swift
│ │ │ ├── Producer.swift
│ │ │ ├── RefCount.swift
│ │ │ ├── ReplaySubject.swift
│ │ │ ├── Sample.swift
│ │ │ ├── ScheduledObserver.swift
│ │ │ ├── Select.swift
│ │ │ ├── Sink.swift
│ │ │ ├── StartWith.swift
│ │ │ ├── Switch.swift
│ │ │ ├── TailRecursiveSink.swift
│ │ │ ├── Throttle.swift
│ │ │ ├── Where.swift
│ │ │ ├── Zip+arity.swift
│ │ │ └── Zip.swift
│ │ ├── Observable+Aggregate.swift
│ │ ├── Observable+Binding.swift
│ │ ├── Observable+Concurrency.swift
│ │ ├── Observable+Creation.swift
│ │ ├── Observable+Debug.swift
│ │ ├── Observable+Multiple.swift
│ │ ├── Observable+Single.swift
│ │ ├── Observable+StandardSequenceOperators.swift
│ │ └── Observable+Time.swift
│ │ ├── Observer.swift
│ │ ├── ObserverOf.swift
│ │ ├── ObserverType.swift
│ │ ├── Observers
│ │ ├── AnonymousObserver.swift
│ │ ├── AutoDetachObserver.swift
│ │ ├── DoneObserver.swift
│ │ ├── NopObserver.swift
│ │ └── ObserverBase.swift
│ │ ├── Rx.swift
│ │ ├── RxBox.swift
│ │ ├── RxResult.swift
│ │ ├── Scheduler.swift
│ │ ├── Scheduler
│ │ ├── DispatchQueueScheduler.swift
│ │ ├── ImmediateSchedulerOnCurrentThread.swift
│ │ ├── MainScheduler.swift
│ │ ├── OperationQueueScheduler.swift
│ │ └── SchedulerDefaults.swift
│ │ └── Subjects
│ │ ├── BehaviorSubject.swift
│ │ ├── ConnectableObservableType.swift
│ │ ├── Subject.swift
│ │ ├── SubjectType.swift
│ │ └── Variable.swift
├── SVProgressHUD
│ ├── LICENSE.txt
│ ├── README.md
│ └── SVProgressHUD
│ │ ├── SVIndefiniteAnimatedView.h
│ │ ├── SVIndefiniteAnimatedView.m
│ │ ├── SVProgressHUD.bundle
│ │ ├── angle-mask.png
│ │ ├── angle-mask@2x.png
│ │ ├── angle-mask@3x.png
│ │ ├── error.png
│ │ ├── error@2x.png
│ │ ├── error@3x.png
│ │ ├── info.png
│ │ ├── info@2x.png
│ │ ├── info@3x.png
│ │ ├── success.png
│ │ ├── success@2x.png
│ │ └── success@3x.png
│ │ ├── SVProgressHUD.h
│ │ └── SVProgressHUD.m
└── Target Support Files
│ ├── Pods-FunctionalReactiveAwesome-Alamofire
│ ├── Info.plist
│ ├── Pods-FunctionalReactiveAwesome-Alamofire-Private.xcconfig
│ ├── Pods-FunctionalReactiveAwesome-Alamofire-dummy.m
│ ├── Pods-FunctionalReactiveAwesome-Alamofire-prefix.pch
│ ├── Pods-FunctionalReactiveAwesome-Alamofire-umbrella.h
│ ├── Pods-FunctionalReactiveAwesome-Alamofire.modulemap
│ └── Pods-FunctionalReactiveAwesome-Alamofire.xcconfig
│ ├── Pods-FunctionalReactiveAwesome-Moya
│ ├── Info.plist
│ ├── Pods-FunctionalReactiveAwesome-Moya-Private.xcconfig
│ ├── Pods-FunctionalReactiveAwesome-Moya-dummy.m
│ ├── Pods-FunctionalReactiveAwesome-Moya-prefix.pch
│ ├── Pods-FunctionalReactiveAwesome-Moya-umbrella.h
│ ├── Pods-FunctionalReactiveAwesome-Moya.modulemap
│ └── Pods-FunctionalReactiveAwesome-Moya.xcconfig
│ ├── Pods-FunctionalReactiveAwesome-RxCocoa
│ ├── Info.plist
│ ├── Pods-FunctionalReactiveAwesome-RxCocoa-Private.xcconfig
│ ├── Pods-FunctionalReactiveAwesome-RxCocoa-dummy.m
│ ├── Pods-FunctionalReactiveAwesome-RxCocoa-prefix.pch
│ ├── Pods-FunctionalReactiveAwesome-RxCocoa-umbrella.h
│ ├── Pods-FunctionalReactiveAwesome-RxCocoa.modulemap
│ └── Pods-FunctionalReactiveAwesome-RxCocoa.xcconfig
│ ├── Pods-FunctionalReactiveAwesome-RxSwift
│ ├── Info.plist
│ ├── Pods-FunctionalReactiveAwesome-RxSwift-Private.xcconfig
│ ├── Pods-FunctionalReactiveAwesome-RxSwift-dummy.m
│ ├── Pods-FunctionalReactiveAwesome-RxSwift-prefix.pch
│ ├── Pods-FunctionalReactiveAwesome-RxSwift-umbrella.h
│ ├── Pods-FunctionalReactiveAwesome-RxSwift.modulemap
│ └── Pods-FunctionalReactiveAwesome-RxSwift.xcconfig
│ ├── Pods-FunctionalReactiveAwesome-SVProgressHUD
│ ├── Info.plist
│ ├── Pods-FunctionalReactiveAwesome-SVProgressHUD-Private.xcconfig
│ ├── Pods-FunctionalReactiveAwesome-SVProgressHUD-dummy.m
│ ├── Pods-FunctionalReactiveAwesome-SVProgressHUD-prefix.pch
│ ├── Pods-FunctionalReactiveAwesome-SVProgressHUD-umbrella.h
│ ├── Pods-FunctionalReactiveAwesome-SVProgressHUD.modulemap
│ └── Pods-FunctionalReactiveAwesome-SVProgressHUD.xcconfig
│ └── Pods-FunctionalReactiveAwesome
│ ├── Info.plist
│ ├── Pods-FunctionalReactiveAwesome-acknowledgements.markdown
│ ├── Pods-FunctionalReactiveAwesome-acknowledgements.plist
│ ├── Pods-FunctionalReactiveAwesome-dummy.m
│ ├── Pods-FunctionalReactiveAwesome-environment.h
│ ├── Pods-FunctionalReactiveAwesome-frameworks.sh
│ ├── Pods-FunctionalReactiveAwesome-resources.sh
│ ├── Pods-FunctionalReactiveAwesome-umbrella.h
│ ├── Pods-FunctionalReactiveAwesome.debug.xcconfig
│ ├── Pods-FunctionalReactiveAwesome.modulemap
│ └── Pods-FunctionalReactiveAwesome.release.xcconfig
├── README.md
├── podfile
└── web
└── screenshot.png
/FunctionalReactiveAwesome.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/FunctionalReactiveAwesome.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/FunctionalReactiveAwesome/API.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 | import Moya
3 | import RxSwift
4 |
5 | enum API {
6 | case Signup(email: String, password: String)
7 | case Friends
8 | }
9 |
10 | extension API: MoyaPath, MoyaTarget {
11 | var path: String {
12 | switch self {
13 | case .Signup(let email, let password):
14 | return "/signup"
15 | case .Friends:
16 | return "/friends"
17 | }
18 | }
19 |
20 | var baseURL: NSURL {
21 | return NSURL(string: "http://example.com")!
22 | }
23 |
24 | var method: Moya.Method {
25 | switch self {
26 | case .Signup(_, _):
27 | return .POST
28 | default:
29 | return .GET
30 | }
31 | }
32 |
33 | var parameters: [String: AnyObject] {
34 | return [:]
35 | }
36 |
37 | var sampleData: NSData {
38 | switch self{
39 | case .Signup(let email, _):
40 | return ("Welcome, \(email)!" as NSString).dataUsingEncoding(NSUTF8StringEncoding)!
41 | case .Friends:
42 | return friendsData
43 | }
44 | }
45 | }
46 |
47 | let stubbedBehavior: MoyaProvider.MoyaStubbedBehavior = { target -> Moya.StubbedBehavior in
48 | return .Delayed(seconds: 1)
49 | }
50 |
51 | let api = RxMoyaProvider(stubResponses: true, stubBehavior: stubbedBehavior)
52 |
53 | let friendsData = NSArray(array: ["Alloy", "Laura", "Orta", "Sarah"]).componentsJoinedByString(",").dataUsingEncoding(NSUTF8StringEncoding)!
54 |
--------------------------------------------------------------------------------
/FunctionalReactiveAwesome/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 |
3 | @UIApplicationMain
4 | class AppDelegate: UIResponder, UIApplicationDelegate {
5 |
6 | var window: UIWindow?
7 |
8 | }
9 |
10 |
--------------------------------------------------------------------------------
/FunctionalReactiveAwesome/Base.lproj/LaunchScreen.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
20 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/FunctionalReactiveAwesome/EmailValidationDemoViewController.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import RxSwift
3 | import RxCocoa
4 |
5 | class EmailValidationDemoViewController: UIViewController {
6 | @IBOutlet weak var emailTextField: UITextField!
7 | @IBOutlet weak var submitButton: UIButton!
8 |
9 | let disposeBag = DisposeBag()
10 |
11 | override func viewDidLoad() {
12 | super.viewDidLoad()
13 |
14 | emailTextField.rx_text
15 | >- map (isEmail)
16 | >- submitButton.rx_subscribeEnabledTo
17 | >- disposeBag.addDisposable
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/FunctionalReactiveAwesome/Images.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "29x29",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "29x29",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "40x40",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "40x40",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "60x60",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "60x60",
31 | "scale" : "3x"
32 | }
33 | ],
34 | "info" : {
35 | "version" : 1,
36 | "author" : "xcode"
37 | }
38 | }
--------------------------------------------------------------------------------
/FunctionalReactiveAwesome/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | net.artsy.$(PRODUCT_NAME:rfc1034identifier)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UIRequiredDeviceCapabilities
30 |
31 | armv7
32 |
33 | UIStatusBarTintParameters
34 |
35 | UINavigationBar
36 |
37 | Style
38 | UIBarStyleDefault
39 | Translucent
40 |
41 |
42 |
43 | UISupportedInterfaceOrientations
44 |
45 | UIInterfaceOrientationPortrait
46 | UIInterfaceOrientationLandscapeLeft
47 | UIInterfaceOrientationLandscapeRight
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/FunctionalReactiveAwesome/NetworkDemoViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import RxSwift
3 | import RxCocoa
4 | import Moya
5 |
6 | extension NetworkDemoViewController {
7 |
8 | func fetchFriends() -> Observable<[String]> {
9 | return defer {
10 | UIApplication.sharedApplication().networkActivityIndicatorVisible = true
11 | return api.request(.Friends)
12 | >- doOnNext { _ -> Void in
13 | UIApplication.sharedApplication().networkActivityIndicatorVisible = false
14 | }
15 | >- map { response -> [String] in
16 | let friends = NSString(data: response.data, encoding: NSUTF8StringEncoding)!.componentsSeparatedByString(",")
17 | return friends as! [String]
18 | }
19 | }
20 | }
21 |
22 | func subscribeFriendsTo(source: Observable<[String]>) -> Disposable {
23 | return source.subscribe(AnonymousObserver { event in
24 |
25 | switch event {
26 | case .Next(let boxedValue):
27 | self.friends = boxedValue.value
28 | self.tableView.reloadData()
29 | case .Error(let error):
30 | self.displayMessage("Could not retrieve friends.", title: "Network error")
31 | case .Completed:
32 | break
33 | }
34 | })
35 | }
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/FunctionalReactiveAwesome/NetworkDemoViewController.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import RxSwift
3 | import RxCocoa
4 | import Moya
5 |
6 | class NetworkDemoViewController: UITableViewController {
7 |
8 | var friends: [String] = []
9 | let disposeBag = DisposeBag()
10 |
11 | override func viewDidLoad() {
12 | super.viewDidLoad()
13 |
14 | fetchFriends()
15 | >- subscribeFriendsTo
16 | >- disposeBag.addDisposable
17 | }
18 | }
19 |
20 | extension NetworkDemoViewController: UITableViewDataSource {
21 |
22 | override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
23 | return count(friends)
24 | }
25 |
26 | override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
27 | let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! UITableViewCell
28 |
29 | cell.textLabel?.text = friends[indexPath.row]
30 |
31 | return cell
32 | }
33 |
34 | }
--------------------------------------------------------------------------------
/FunctionalReactiveAwesome/Operators.swift:
--------------------------------------------------------------------------------
1 | import RxSwift
2 |
3 | func and(observable: Observable<(Bool, Bool)>) -> Observable {
4 | return observable
5 | >- map { (thing) -> Bool in
6 | return thing.0 && thing.1
7 | }
8 | }
9 |
10 | func combineLatest(source1: Observable, source2: Observable) -> Observable<(Bool, Bool)> {
11 | return combineLatest(source1, source2) { (a: Bool, b: Bool) -> (Bool, Bool) in
12 | return (a, b)
13 | }
14 | }
15 |
16 |
17 |
--------------------------------------------------------------------------------
/FunctionalReactiveAwesome/SignupDemoViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import RxSwift
3 | import RxCocoa
4 | import Moya
5 | import SVProgressHUD
6 |
7 | extension SignupDemoViewController {
8 | var signup: Observable {
9 | return combineLatest(emailAddressTextField.rx_text, passwordTextField.rx_text) { (email, password) -> Observable in
10 | return api.request(.Signup(email: email, password: password))
11 | } >- switchLatest
12 | }
13 |
14 | func signup(input: Observable) -> Observable {
15 | return input
16 | >- doOnNext { _ -> Void in
17 | SVProgressHUD.showWithMaskType(.Black)
18 | UIApplication.sharedApplication().networkActivityIndicatorVisible = true
19 | }
20 | >- map { [weak self] _ -> Observable in
21 | return self?.signup ?? empty()
22 | }
23 | >- switchLatest
24 | >- `do`{ event -> Void in
25 | SVProgressHUD.dismiss()
26 | UIApplication.sharedApplication().networkActivityIndicatorVisible = false
27 | }
28 | >- map { response -> String in
29 | return NSString(data: response.data, encoding: NSUTF8StringEncoding) as! String
30 | }
31 | }
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/FunctionalReactiveAwesome/SignupDemoViewController.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import RxSwift
3 | import RxCocoa
4 | import Moya
5 |
6 | class SignupDemoViewController: UIViewController {
7 | @IBOutlet weak var emailAddressTextField: UITextField!
8 | @IBOutlet weak var passwordTextField: UITextField!
9 | @IBOutlet weak var signupButton: UIButton!
10 |
11 | let disposeBag = DisposeBag()
12 |
13 | override func viewDidLoad() {
14 | super.viewDidLoad()
15 |
16 | let emailIsValid = emailAddressTextField.rx_text >- map (isEmail)
17 | let passwordIsValid = passwordTextField.rx_text >- map (isPassword)
18 |
19 | combineLatest(emailIsValid, passwordIsValid)
20 | >- and
21 | >- signupButton.rx_subscribeEnabledTo
22 | >- disposeBag.addDisposable
23 |
24 | signupButton.rx_tap
25 | >- signup
26 | >- display
27 | >- disposeBag.addDisposable
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/FunctionalReactiveAwesome/UIControl+Rx.swift:
--------------------------------------------------------------------------------
1 | import RxSwift
2 | import UIKit
3 |
4 | extension UIControl {
5 | func rx_subscribeEnabledTo(source: Observable) -> Disposable {
6 | return source.subscribe(AnonymousObserver {[weak self] event in
7 | MainScheduler.ensureExecutingOnScheduler()
8 |
9 | switch event {
10 | case .Next(let boxedValue):
11 | let value = boxedValue.value
12 | self?.enabled = value
13 | case .Error(let error):
14 | #if DEBUG
15 | rxFatalError("Binding error to textbox: \(error)")
16 | #endif
17 | break
18 | case .Completed:
19 | break
20 | }
21 | })
22 | }
23 | }
--------------------------------------------------------------------------------
/FunctionalReactiveAwesome/UIViewController+Extensions.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import RxSwift
3 |
4 | extension UIViewController {
5 | func display(input: Observable) -> Disposable {
6 | return input
7 | >- subscribe { [weak self] (event) -> Void in
8 | self?.displayMessage(event.value, title: "Signed up!")
9 | }
10 | }
11 |
12 | func displayMessage(message: String?, title: String?) {
13 | let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert)
14 |
15 | let ok = UIAlertAction(title: "OK", style: .Default, handler: { [weak self] (_) -> Void in
16 | self?.navigationController?.popToRootViewControllerAnimated(true)
17 | })
18 |
19 | alert.addAction(ok)
20 |
21 | self.presentViewController(alert, animated: true, completion: nil)
22 | }
23 |
24 | }
--------------------------------------------------------------------------------
/FunctionalReactiveAwesome/Validation.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 |
3 | extension String {
4 | func contains(substring: String) -> Bool {
5 | return (self as NSString).containsString(substring)
6 | }
7 |
8 | func contains(substrings: [String]) -> Bool {
9 | return substrings.reduce(true) { (memo, substring) -> Bool in
10 | return memo && contains(substring)
11 | }
12 | }
13 | }
14 |
15 | func isEmail(text: String) -> Bool {
16 | return text.contains(["@", "."])
17 | }
18 |
19 | func isPassword(text: String) -> Bool {
20 | return count(text) > 6
21 | }
22 |
--------------------------------------------------------------------------------
/FunctionalReactiveAwesomeTests/FunctionalReactiveAwesomeTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // FunctionalReactiveAwesomeTests.swift
3 | // FunctionalReactiveAwesomeTests
4 | //
5 | // Created by Ash Furrow on 2015-06-11.
6 | // Copyright (c) 2015 Artsy. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import XCTest
11 |
12 | class FunctionalReactiveAwesomeTests: XCTestCase {
13 |
14 | override func setUp() {
15 | super.setUp()
16 | // Put setup code here. This method is called before the invocation of each test method in the class.
17 | }
18 |
19 | override func tearDown() {
20 | // Put teardown code here. This method is called after the invocation of each test method in the class.
21 | super.tearDown()
22 | }
23 |
24 | func testExample() {
25 | // This is an example of a functional test case.
26 | XCTAssert(true, "Pass")
27 | }
28 |
29 | func testPerformanceExample() {
30 | // This is an example of a performance test case.
31 | self.measureBlock() {
32 | // Put the code you want to measure the time of here.
33 | }
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/FunctionalReactiveAwesomeTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | net.artsy.$(PRODUCT_NAME:rfc1034identifier)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Ash Furrow
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - Alamofire (1.2.2)
3 | - Moya/Core (1.1.1):
4 | - Alamofire (~> 1.2.0)
5 | - Moya/ReactiveCore (1.1.1):
6 | - Moya/Core
7 | - Moya/RxSwift (1.1.1):
8 | - Moya/ReactiveCore
9 | - RxSwift (= 1.4)
10 | - RxCocoa (1.5):
11 | - RxSwift
12 | - RxSwift (1.4)
13 | - SVProgressHUD (1.1.3)
14 |
15 | DEPENDENCIES:
16 | - Moya/RxSwift
17 | - RxCocoa
18 | - RxSwift
19 | - SVProgressHUD
20 |
21 | SPEC CHECKSUMS:
22 | Alamofire: 11a6022f5089887d92ffb5a3014c97a0a915ab98
23 | Moya: ee0c8da3abb87f2a46bce384bd42ca13260e690e
24 | RxCocoa: b3589e7896da660463493c20e723196b1d2704b3
25 | RxSwift: db92214e17226bf61c3649180286c8c7baf3712b
26 | SVProgressHUD: 748080e4f36e603f6c02aec292664239df5279c1
27 |
28 | COCOAPODS: 0.37.2
29 |
--------------------------------------------------------------------------------
/Pods/Alamofire/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/)
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy
4 | of this software and associated documentation files (the "Software"), to deal
5 | in the Software without restriction, including without limitation the rights
6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | copies of the Software, and to permit persons to whom the Software is
8 | furnished to do so, subject to the following conditions:
9 |
10 | The above copyright notice and this permission notice shall be included in
11 | all copies or substantial portions of the Software.
12 |
13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 | THE SOFTWARE.
20 |
--------------------------------------------------------------------------------
/Pods/Headers/Private/SVProgressHUD/SVIndefiniteAnimatedView.h:
--------------------------------------------------------------------------------
1 | ../../../SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h
--------------------------------------------------------------------------------
/Pods/Headers/Private/SVProgressHUD/SVProgressHUD.h:
--------------------------------------------------------------------------------
1 | ../../../SVProgressHUD/SVProgressHUD/SVProgressHUD.h
--------------------------------------------------------------------------------
/Pods/Headers/Public/SVProgressHUD/SVIndefiniteAnimatedView.h:
--------------------------------------------------------------------------------
1 | ../../../SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h
--------------------------------------------------------------------------------
/Pods/Headers/Public/SVProgressHUD/SVProgressHUD.h:
--------------------------------------------------------------------------------
1 | ../../../SVProgressHUD/SVProgressHUD/SVProgressHUD.h
--------------------------------------------------------------------------------
/Pods/Manifest.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - Alamofire (1.2.2)
3 | - Moya/Core (1.1.1):
4 | - Alamofire (~> 1.2.0)
5 | - Moya/ReactiveCore (1.1.1):
6 | - Moya/Core
7 | - Moya/RxSwift (1.1.1):
8 | - Moya/ReactiveCore
9 | - RxSwift (= 1.4)
10 | - RxCocoa (1.5):
11 | - RxSwift
12 | - RxSwift (1.4)
13 | - SVProgressHUD (1.1.3)
14 |
15 | DEPENDENCIES:
16 | - Moya/RxSwift
17 | - RxCocoa
18 | - RxSwift
19 | - SVProgressHUD
20 |
21 | SPEC CHECKSUMS:
22 | Alamofire: 11a6022f5089887d92ffb5a3014c97a0a915ab98
23 | Moya: ee0c8da3abb87f2a46bce384bd42ca13260e690e
24 | RxCocoa: b3589e7896da660463493c20e723196b1d2704b3
25 | RxSwift: db92214e17226bf61c3649180286c8c7baf3712b
26 | SVProgressHUD: 748080e4f36e603f6c02aec292664239df5279c1
27 |
28 | COCOAPODS: 0.37.2
29 |
--------------------------------------------------------------------------------
/Pods/Moya/Endpoint.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Endpoint.swift
3 | // Moya
4 | //
5 | // Created by Ash Furrow on 2014-08-16.
6 | // Copyright (c) 2014 Ash Furrow. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import Alamofire
11 |
12 | /// Used for stubbing responses.
13 | public enum EndpointSampleResponse {
14 | case Success(Int, () -> NSData)
15 | case Error(Int?, NSError?, (() -> NSData)?)
16 | case Closure(() -> EndpointSampleResponse)
17 |
18 | func evaluate() -> EndpointSampleResponse {
19 | switch self {
20 | case Success, Error: return self
21 | case Closure(let closure):
22 | return closure().evaluate()
23 | }
24 | }
25 | }
26 |
27 |
28 | /// Class for reifying a target of the T enum unto a concrete Endpoint
29 | public class Endpoint {
30 | public let URL: String
31 | public let method: Moya.Method
32 | public let sampleResponse: EndpointSampleResponse
33 | public let parameters: [String: AnyObject]
34 | public let parameterEncoding: Moya.ParameterEncoding
35 | public let httpHeaderFields: [String: AnyObject]
36 |
37 | /// Main initializer for Endpoint.
38 | public init(URL: String, sampleResponse: EndpointSampleResponse, method: Moya.Method = Moya.Method.GET, parameters: [String: AnyObject] = [String: AnyObject](), parameterEncoding: Moya.ParameterEncoding = .URL, httpHeaderFields: [String: AnyObject] = [String: AnyObject]()) {
39 | self.URL = URL
40 | self.sampleResponse = sampleResponse
41 | self.method = method
42 | self.parameters = parameters
43 | self.parameterEncoding = parameterEncoding
44 | self.httpHeaderFields = httpHeaderFields
45 | }
46 |
47 | /// Convenience method for creating a new Endpoint with the same properties as the receiver, but with added parameters.
48 | public func endpointByAddingParameters(parameters: [String: AnyObject]) -> Endpoint {
49 | var newParameters = self.parameters ?? [String: AnyObject]()
50 | for (key, value) in parameters {
51 | newParameters[key] = value
52 | }
53 |
54 | return Endpoint(URL: URL, sampleResponse: sampleResponse, method: method, parameters: newParameters, parameterEncoding: parameterEncoding, httpHeaderFields: httpHeaderFields)
55 | }
56 |
57 | /// Convenience method for creating a new Endpoint with the same properties as the receiver, but with added HTTP header fields.
58 | public func endpointByAddingHTTPHeaderFields(httpHeaderFields: [String: AnyObject]) -> Endpoint {
59 | var newHTTPHeaderFields = self.httpHeaderFields ?? [String: AnyObject]()
60 | for (key, value) in httpHeaderFields {
61 | newHTTPHeaderFields[key] = value
62 | }
63 |
64 | return Endpoint(URL: URL, sampleResponse: sampleResponse, method: method, parameters: parameters, parameterEncoding: parameterEncoding, httpHeaderFields: newHTTPHeaderFields)
65 | }
66 | }
67 |
68 | /// Extension for converting an extension into an NSURLRequest.
69 | extension Endpoint {
70 | public var urlRequest: NSURLRequest {
71 | var request: NSMutableURLRequest = NSMutableURLRequest(URL: NSURL(string: URL)!)
72 | request.HTTPMethod = method.method().rawValue
73 | request.allHTTPHeaderFields = httpHeaderFields
74 | return parameterEncoding.parameterEncoding().encode(request, parameters: parameters).0
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/Pods/Moya/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2014 Artsy, Ash Furrow
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Pods/Moya/Moya+RxSwift.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Moya+RxSwift.swift
3 | // Moya
4 | //
5 | // Created by Andre Carvalho on 2015-06-05
6 | // Copyright (c) 2015 Ash Furrow. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RxSwift
11 |
12 | /// Subclass of MoyaProvider that returns Observable instances when requests are made. Much better than using completion closures.
13 | public class RxMoyaProvider: MoyaProvider {
14 | /// Current requests that have not completed or errored yet.
15 | /// Note: Do not access this directly. It is public only for unit-testing purposes (sigh).
16 | public var inflightRequests = Dictionary, Observable>()
17 |
18 | /// Initializes a reactive provider.
19 | override public init(endpointsClosure: MoyaEndpointsClosure = MoyaProvider.DefaultEndpointMapping(), endpointResolver: MoyaEndpointResolution = MoyaProvider.DefaultEnpointResolution(), stubResponses: Bool = false, stubBehavior: MoyaStubbedBehavior = MoyaProvider.DefaultStubBehavior, networkActivityClosure: Moya.NetworkActivityClosure? = nil) {
20 | super.init(endpointsClosure: endpointsClosure, endpointResolver: endpointResolver, stubResponses: stubResponses, stubBehavior: stubBehavior, networkActivityClosure: networkActivityClosure)
21 | }
22 |
23 | /// Designated request-making method.
24 | public func request(token: T) -> Observable {
25 | let endpoint = self.endpoint(token)
26 |
27 | return defer { [weak self] () -> Observable in
28 | if let existingObservable = self?.inflightRequests[endpoint] {
29 | return existingObservable
30 | }
31 |
32 | let observable: Observable = AnonymousObservable { observer in
33 | let cancellableToken = self?.request(token) { (data, statusCode, response, error) -> () in
34 | if let error = error {
35 | if let statusCode = statusCode {
36 | observer.on(.Error(NSError(domain: error.domain, code: statusCode, userInfo: error.userInfo)))
37 | } else {
38 | observer.on(.Error(error))
39 | }
40 | } else {
41 | if let data = data {
42 | observer.on(.Next(RxBox(MoyaResponse(statusCode: statusCode!, data: data, response: response))))
43 | }
44 | observer.on(.Completed)
45 | }
46 | }
47 |
48 | return AnonymousDisposable {
49 | if let weakSelf = self {
50 | objc_sync_enter(weakSelf)
51 | weakSelf.inflightRequests[endpoint] = nil
52 | cancellableToken?.cancel()
53 | objc_sync_exit(weakSelf)
54 | }
55 | }
56 | }
57 |
58 | if let weakSelf = self {
59 | objc_sync_enter(weakSelf)
60 | weakSelf.inflightRequests[endpoint] = observable
61 | objc_sync_exit(weakSelf)
62 | }
63 |
64 | return observable
65 | }
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/Pods/Moya/MoyaResponse.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MoyaResponse.swift
3 | // Moya
4 | //
5 | // Created by Andre Carvalho on 2015-06-06
6 | // Copyright (c) 2015 Ash Furrow. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public class MoyaResponse: NSObject, Printable, DebugPrintable {
12 | public let statusCode: Int
13 | public let data: NSData
14 | public let response: NSURLResponse?
15 |
16 | public init(statusCode: Int, data: NSData, response: NSURLResponse?) {
17 | self.statusCode = statusCode
18 | self.data = data
19 | self.response = response
20 | }
21 |
22 | override public var description: String {
23 | return "Status Code: \(statusCode), Data Length: \(data.length)"
24 | }
25 |
26 | override public var debugDescription: String {
27 | return description
28 | }
29 | }
30 |
31 | /// Required for making Endpoint conform to Equatable.
32 | public func ==(lhs: Endpoint, rhs: Endpoint) -> Bool {
33 | return lhs.urlRequest.isEqual(rhs.urlRequest)
34 | }
35 |
36 | /// Required for using Endpoint as a key type in a Dictionary.
37 | extension Endpoint: Equatable, Hashable {
38 | public var hashValue: Int {
39 | return urlRequest.hash
40 | }
41 | }
42 |
43 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/LICENSE.md:
--------------------------------------------------------------------------------
1 | **The MIT License**
2 | **Copyright (c) 2015 Krunoslav Zaher**
3 | **All rights reserved.**
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6 |
7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8 |
9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/RxCocoa/Common/ControlTarget.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ControlTarget.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 2/21/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RxSwift
11 |
12 | #if os(iOS)
13 | import UIKit
14 |
15 | typealias Control = UIKit.UIControl
16 | typealias ControlEvents = UIKit.UIControlEvents
17 | #elseif os(OSX)
18 | import Cocoa
19 |
20 | typealias Control = Cocoa.NSControl
21 | #endif
22 |
23 | // This should be only used from `MainScheduler`
24 | class ControlTarget: NSObject, Disposable {
25 | typealias Callback = (Control) -> Void
26 |
27 | let selector: Selector = "eventHandler:"
28 |
29 | let control: Control
30 | #if os(iOS)
31 | let controlEvents: UIControlEvents
32 | #endif
33 | var callback: Callback?
34 |
35 | #if os(iOS)
36 | init(control: Control, controlEvents: UIControlEvents, callback: Callback) {
37 | self.control = control
38 | self.controlEvents = controlEvents
39 | self.callback = callback
40 |
41 | super.init()
42 |
43 | control.addTarget(self, action: selector, forControlEvents: controlEvents)
44 |
45 | let method = self.methodForSelector(selector)
46 | if method == nil {
47 | rxFatalError("Can't find method")
48 | }
49 | }
50 | #elseif os(OSX)
51 | init(control: Control, callback: Callback) {
52 | self.control = control
53 | self.callback = callback
54 |
55 | super.init()
56 |
57 | control.target = self
58 | control.action = selector
59 |
60 | let method = self.methodForSelector(selector)
61 | if method == nil {
62 | rxFatalError("Can't find method")
63 | }
64 | }
65 | #endif
66 |
67 | func eventHandler(sender: Control!) {
68 | if let callback = self.callback {
69 | callback(self.control)
70 | }
71 | }
72 |
73 | func dispose() {
74 | MainScheduler.ensureExecutingOnScheduler()
75 |
76 | #if os(iOS)
77 | self.control.removeTarget(self, action: self.selector, forControlEvents: self.controlEvents)
78 | #elseif os(OSX)
79 | self.control.target = nil
80 | self.control.action = nil
81 | #endif
82 | self.callback = nil
83 | }
84 |
85 | deinit {
86 | dispose()
87 | }
88 | }
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/RxCocoa/Common/KVOObservable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // KVOObservable.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 2/21/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RxSwift
11 |
12 | protocol KVOObservableProtocol {
13 | var object: NSObject { get }
14 | var path: String { get }
15 | var options: NSKeyValueObservingOptions { get }
16 | }
17 |
18 | class KVOObserver : NSObject, Disposable {
19 | typealias Callback = (AnyObject?) -> Void
20 |
21 | let parent: KVOObservableProtocol
22 | let callback: Callback
23 |
24 | var retainSelf: KVOObserver? = nil
25 |
26 | var context: UInt8 = 0
27 |
28 | init(parent: KVOObservableProtocol, callback: Callback) {
29 | self.parent = parent
30 | self.callback = callback
31 |
32 | super.init()
33 |
34 | self.retainSelf = self
35 |
36 | self.parent.object.addObserver(self, forKeyPath: self.parent.path, options: self.parent.options, context: &context)
37 | #if TRACE_RESOURCES
38 | OSAtomicIncrement32(&resourceCount)
39 | #endif
40 | }
41 |
42 |
43 | override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer) {
44 | let newValue: AnyObject? = change[NSKeyValueChangeNewKey]
45 |
46 | if let newValue: AnyObject = newValue {
47 | self.callback(newValue)
48 | }
49 | }
50 |
51 | func dispose() {
52 | self.parent.object.removeObserver(self, forKeyPath: self.parent.path)
53 |
54 | self.retainSelf = nil
55 | }
56 |
57 | deinit {
58 | #if TRACE_RESOURCES
59 | OSAtomicDecrement32(&resourceCount)
60 | #endif
61 | }
62 | }
63 |
64 | class KVOObservable : Observable, KVOObservableProtocol {
65 | var object: NSObject
66 | var path: String
67 | var options: NSKeyValueObservingOptions
68 |
69 | convenience init(object: NSObject, path: String) {
70 | self.init(object: object, path: path, options: .Initial | .New)
71 | }
72 |
73 | init(object: NSObject, path: String, options: NSKeyValueObservingOptions) {
74 | self.object = object
75 | self.path = path
76 | self.options = options
77 | }
78 |
79 | override func subscribe(observer: O) -> Disposable {
80 | let observer = KVOObserver(parent: self) { (value) in
81 | sendNext(observer, value as? Element)
82 | }
83 |
84 | return AnonymousDisposable { () in
85 | observer.dispose()
86 | }
87 | }
88 | }
89 |
90 | extension NSObject {
91 | public func rx_observe(path: String) -> Observable {
92 | return KVOObservable(object: self, path: path)
93 | }
94 |
95 | public func rx_observe(path: String, options: NSKeyValueObservingOptions) -> Observable {
96 | return KVOObservable(object: self, path: path, options: options)
97 | }
98 | }
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/RxCocoa/Common/Logging.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Logging.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 4/3/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | // read your own configuration
12 | struct Logging {
13 | #if DEBUG
14 | static let URLRequests = true
15 | #else
16 | static let URLRequests = false
17 | #endif
18 | }
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/RxCocoa/Common/NSNotificationCenter+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NSNotificationCenter+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 5/2/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RxSwift
11 |
12 | extension NSNotificationCenter {
13 | public func rx_notification(name: String, object: AnyObject?) -> Observable {
14 | return AnonymousObservable { observer in
15 | let nsObserver = self.addObserverForName(name, object: object, queue: nil) { notification in
16 | sendNext(observer, notification)
17 | }
18 |
19 | return AnonymousDisposable {
20 | self.removeObserver(nsObserver)
21 | }
22 | }
23 | }
24 | }
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/RxCocoa/Common/RxCocoa.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxCocoa.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 2/21/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RxSwift
11 |
12 | public enum RxCocoaError : Int {
13 | case Unknown = 0
14 | case NetworkError = 1
15 | case InvalidOperation = 2
16 | }
17 |
18 | public let RxCocoaErrorDomain = "RxCocoaError"
19 |
20 | public let RxCocoaErrorHTTPResponseKey = "RxCocoaErrorHTTPResponseKey"
21 |
22 | func rxError(errorCode: RxCocoaError, message: String) -> NSError {
23 | return NSError(domain: RxCocoaErrorDomain, code: errorCode.rawValue, userInfo: [NSLocalizedDescriptionKey: message])
24 | }
25 |
26 | func rxError(errorCode: RxCocoaError, message: String, userInfo: NSDictionary) -> NSError {
27 | let mutableDictionary = NSMutableDictionary(dictionary: userInfo as! [NSObject : AnyObject])
28 | mutableDictionary[NSLocalizedDescriptionKey] = message
29 | // swift compiler :(
30 | let resultInfo: [NSObject: AnyObject] = (userInfo as NSObject) as! [NSObject: AnyObject]
31 | return NSError(domain: RxCocoaErrorDomain, code: Int(errorCode.rawValue), userInfo: resultInfo)
32 | }
33 |
34 | func removingObserverFailed() {
35 | rxFatalError("Removing observer for key failed")
36 | }
37 |
38 | func handleVoidObserverResult(result: RxResult) {
39 | handleObserverResult(result)
40 | }
41 |
42 | func rxFatalError(lastMessage: String) {
43 | // The temptation to comment this line is great, but please don't, it's for your own good. The choice is yours.
44 | fatalError(lastMessage)
45 | }
46 |
47 | func handleObserverResult(result: RxResult) {
48 | switch result {
49 | case .Failure(let error):
50 | print("Error happened \(error)")
51 | rxFatalError("Error '\(error)' happened while ");
52 | default: break
53 | }
54 | }
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/RxCocoa/iOS/UIBarButtonItem.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIBarButtonItem.swift
3 | // RxCocoa
4 | //
5 | // Created by Daniel Tartaglia on 5/31/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import UIKit
10 | import RxSwift
11 |
12 | extension UIBarButtonItem {
13 |
14 | public var rx_tap: Observable {
15 | return AnonymousObservable { observer in
16 | let target = BarButtonItemTarget(barButtonItem: self) {
17 | sendNext(observer, ())
18 | }
19 | return target
20 | }
21 | }
22 |
23 | }
24 |
25 |
26 | @objc
27 | class BarButtonItemTarget: Disposable {
28 | typealias Callback = () -> Void
29 |
30 | weak var barButtonItem: UIBarButtonItem?
31 | var callback: Callback!
32 |
33 | init(barButtonItem: UIBarButtonItem, callback: () -> Void) {
34 | self.barButtonItem = barButtonItem
35 | self.callback = callback
36 | barButtonItem.target = self
37 | barButtonItem.action = Selector("action:")
38 | }
39 |
40 | deinit {
41 | dispose()
42 | }
43 |
44 | func dispose() {
45 | MainScheduler.ensureExecutingOnScheduler()
46 |
47 | barButtonItem?.target = nil
48 | barButtonItem?.action = nil
49 |
50 | callback = nil
51 | }
52 |
53 | func action(sender: AnyObject) {
54 | callback()
55 | }
56 |
57 | }
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/RxCocoa/iOS/UIButton+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIButton+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 3/28/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RxSwift
11 | import UIKit
12 |
13 | extension UIButton {
14 | public var rx_tap: Observable {
15 | return rx_controlEvents(.TouchUpInside)
16 | }
17 | }
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/RxCocoa/iOS/UIControl+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIControl+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Daniel Tartaglia on 5/23/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RxSwift
11 | import UIKit
12 |
13 | extension UIControl {
14 | public func rx_controlEvents(controlEvents: UIControlEvents) -> Observable {
15 | return AnonymousObservable { observer in
16 | MainScheduler.ensureExecutingOnScheduler()
17 |
18 | let observer = ControlTarget(control: self, controlEvents: controlEvents) {
19 | control in
20 | sendNext(observer, ())
21 | }
22 |
23 | return observer
24 | }
25 | }
26 |
27 | func rx_value(getValue: () -> T) -> Observable {
28 | return AnonymousObservable { observer in
29 |
30 | sendNext(observer, getValue())
31 |
32 | let subscription = ControlTarget(control: self, controlEvents: UIControlEvents.EditingChanged) { control in
33 | sendNext(observer, getValue())
34 | }
35 |
36 | return subscription
37 |
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/RxCocoa/iOS/UIDatePicker.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIDatePicker.swift
3 | // RxCocoa
4 | //
5 | // Created by Daniel Tartaglia on 5/31/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | import Foundation
12 | import RxSwift
13 | import UIKit
14 |
15 | extension UIDatePicker {
16 |
17 | public var rx_date: Observable {
18 | return rx_value { [weak self] in self?.date ?? NSDate() }
19 | }
20 |
21 | }
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/RxCocoa/iOS/UIImageView+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIImageView+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 4/1/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RxSwift
11 | import UIKit
12 |
13 | extension UIImageView {
14 | public func rx_subscribeImageTo(source: Observable) -> Disposable {
15 | return rx_subscribeImageTo(false)(source: source)
16 | }
17 |
18 | public func rx_subscribeImageTo
19 | (animated: Bool)
20 | (source: Observable) -> Disposable {
21 | return source.subscribe(AnonymousObserver { event in
22 | MainScheduler.ensureExecutingOnScheduler()
23 |
24 | switch event {
25 | case .Next(let boxedValue):
26 | let value = boxedValue.value
27 | if animated && value != nil {
28 | let transition = CATransition()
29 | transition.duration = 0.25
30 | transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
31 | transition.type = kCATransitionFade
32 | self.layer.addAnimation(transition, forKey: kCATransition)
33 | }
34 | else {
35 | self.layer.removeAllAnimations()
36 | }
37 | self.image = value
38 | case .Error(let error):
39 | #if DEBUG
40 | rxFatalError("Binding error to textbox: \(error)")
41 | #endif
42 | break
43 | case .Completed:
44 | break
45 | }
46 | })
47 | }
48 | }
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/RxCocoa/iOS/UILabel+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UILabel+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 4/1/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RxSwift
11 | import UIKit
12 |
13 | extension UILabel {
14 | public func rx_subscribeTextTo(source: Observable) -> Disposable {
15 | return source.subscribe(AnonymousObserver { event in
16 | MainScheduler.ensureExecutingOnScheduler()
17 |
18 | switch event {
19 | case .Next(let boxedValue):
20 | let value = boxedValue.value
21 | self.text = value
22 | case .Error(let error):
23 | #if DEBUG
24 | rxFatalError("Binding error to textbox: \(error)")
25 | #endif
26 | break
27 | case .Completed:
28 | break
29 | }
30 | })
31 | }
32 | }
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/RxCocoa/iOS/UIScrollView+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIScrollView+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 4/3/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RxSwift
11 | import UIKit
12 |
13 | public class RxScrollViewDelegate: NSObject, UIScrollViewDelegate {
14 | public typealias ScrollViewObserver = ObserverOf
15 |
16 | public typealias ScrollViewDisposeKey = Bag.KeyType
17 |
18 | var scrollViewObsevers: Bag
19 |
20 | override public init() {
21 | scrollViewObsevers = Bag()
22 | }
23 |
24 | public func addScrollViewObserver(observer: ScrollViewObserver) -> ScrollViewDisposeKey {
25 | MainScheduler.ensureExecutingOnScheduler()
26 |
27 | return scrollViewObsevers.put(observer)
28 | }
29 |
30 | public func removeScrollViewObserver(key: ScrollViewDisposeKey) {
31 | MainScheduler.ensureExecutingOnScheduler()
32 |
33 | let element = scrollViewObsevers.removeKey(key)
34 | if element == nil {
35 | removingObserverFailed()
36 | }
37 | }
38 |
39 | public func scrollViewDidScroll(scrollView: UIScrollView) {
40 | dispatchNext(scrollView.contentOffset, scrollViewObsevers)
41 | }
42 |
43 | deinit {
44 | if scrollViewObsevers.count > 0 {
45 | handleVoidObserverResult(failure(rxError(RxCocoaError.InvalidOperation, "Something went wrong. Deallocating scroll delegate while there are still subscribed observers means that some subscription was left undisposed.")))
46 | }
47 | }
48 | }
49 |
50 | extension UIScrollView {
51 | func rx_createDelegate() -> RxScrollViewDelegate {
52 | return RxScrollViewDelegate()
53 | }
54 |
55 | public var rx_contentOffset: Observable {
56 | _ = rx_checkScrollViewDelegate()
57 |
58 | return AnonymousObservable { observer in
59 | MainScheduler.ensureExecutingOnScheduler()
60 |
61 | var maybeDelegate = self.rx_checkScrollViewDelegate()
62 |
63 | if maybeDelegate == nil {
64 | let delegate = self.rx_createDelegate() as RxScrollViewDelegate
65 | maybeDelegate = delegate
66 | self.delegate = maybeDelegate
67 | }
68 |
69 | let delegate = maybeDelegate!
70 |
71 | let key = delegate.addScrollViewObserver(observer)
72 |
73 | return AnonymousDisposable {
74 | _ = self.rx_checkScrollViewDelegate()
75 |
76 | delegate.removeScrollViewObserver(key)
77 |
78 | if delegate.scrollViewObsevers.count == 0 {
79 | self.delegate = nil
80 | }
81 | }
82 | }
83 | }
84 |
85 | // private
86 | private func rx_checkScrollViewDelegate() -> RxScrollViewDelegate? {
87 | MainScheduler.ensureExecutingOnScheduler()
88 |
89 | if self.delegate == nil {
90 | return nil
91 | }
92 |
93 | let maybeDelegate = self.delegate as? RxScrollViewDelegate
94 |
95 | if maybeDelegate == nil {
96 | rxFatalError("View already has incompatible delegate set. To use rx observable (for now) please remove earlier delegate registration.")
97 | }
98 |
99 | return maybeDelegate!
100 | }
101 | }
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/RxCocoa/iOS/UISearchBar+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UISearchBar+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 3/28/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RxSwift
11 | import UIKit
12 |
13 | class RxSearchBarDelegate: NSObject, UISearchBarDelegate {
14 | typealias Observer = ObserverOf
15 | typealias DisposeKey = Bag>.KeyType
16 |
17 | var observers: Bag = Bag()
18 |
19 | func addObserver(observer: Observer) -> DisposeKey {
20 | MainScheduler.ensureExecutingOnScheduler()
21 |
22 | return observers.put(observer)
23 | }
24 |
25 | func removeObserver(key: DisposeKey) {
26 | MainScheduler.ensureExecutingOnScheduler()
27 |
28 | let observer = observers.removeKey(key)
29 |
30 | if observer == nil {
31 | removingObserverFailed()
32 | }
33 | }
34 |
35 | func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
36 | dispatchNext(searchText, observers)
37 | }
38 | }
39 |
40 | extension UISearchBar {
41 |
42 | public var rx_searchText: Observable {
43 |
44 | rx_checkSearchBarDelegate()
45 |
46 | return AnonymousObservable { observer in
47 | MainScheduler.ensureExecutingOnScheduler()
48 |
49 | var maybeDelegate = self.rx_checkSearchBarDelegate()
50 |
51 | if maybeDelegate == nil {
52 | maybeDelegate = RxSearchBarDelegate()
53 | self.delegate = maybeDelegate
54 | }
55 |
56 | let delegate = maybeDelegate!
57 |
58 | let key = delegate.addObserver(observer)
59 |
60 | return AnonymousDisposable {
61 | delegate.removeObserver(key)
62 | }
63 | }
64 | }
65 |
66 | // private
67 |
68 | private func rx_checkSearchBarDelegate() -> RxSearchBarDelegate? {
69 | MainScheduler.ensureExecutingOnScheduler()
70 |
71 | if self.delegate == nil {
72 | return nil
73 | }
74 |
75 | let maybeDelegate = self.delegate as? RxSearchBarDelegate
76 |
77 | if maybeDelegate == nil {
78 | rxFatalError("Search bar already has incompatible delegate set. To use rx observable (for now) please remove earlier delegate registration.")
79 | }
80 |
81 | return maybeDelegate!
82 | }
83 | }
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/RxCocoa/iOS/UISlider+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UISlider+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Alexander van der Werff on 28/05/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RxSwift
11 | import UIKit
12 |
13 | extension UISlider {
14 | public var rx_value: Observable {
15 | return AnonymousObservable { observer in
16 | MainScheduler.ensureExecutingOnScheduler()
17 |
18 | sendNext(observer, self.value)
19 |
20 | let observer = ControlTarget(control: self, controlEvents: UIControlEvents.ValueChanged) { control in
21 | sendNext(observer, (control as! UISlider).value)
22 | }
23 |
24 | return observer
25 | }
26 | }
27 | }
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/RxCocoa/iOS/UITextField+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UITextField+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 2/21/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RxSwift
11 | import UIKit
12 |
13 | extension UITextField {
14 | public var rx_text: Observable {
15 | return rx_value { [weak self] in
16 | self?.text ?? ""
17 | }
18 | }
19 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/LICENSE.md:
--------------------------------------------------------------------------------
1 | **The MIT License**
2 | **Copyright (c) 2015 Krunoslav Zaher**
3 | **All rights reserved.**
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6 |
7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8 |
9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/AnyObject+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AnyObject+Rx.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 3/28/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public func castOrFail(result: AnyObject!) -> RxResult {
12 | if let typedResult = result as? T {
13 | return success(typedResult)
14 | }
15 | else {
16 | return failure(CastError)
17 | }
18 | }
19 |
20 | public func makeOptionalResult(result: T) -> RxResult {
21 | return success(result)
22 | }
23 |
24 | public func makeOptional(result: T) -> T? {
25 | return result
26 | }
27 |
28 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Cancelable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Cancelable.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 3/12/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public protocol Cancelable : Disposable {
12 | var disposed: Bool { get }
13 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Concurrency/AsyncLock.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AsyncLock.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 3/21/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class AsyncLock : Disposable {
12 | typealias Action = () -> Void
13 |
14 | private var lock = NSRecursiveLock()
15 |
16 | private var queue: Queue = Queue(capacity: 2)
17 | private var isAcquired: Bool = false
18 | private var hasFaulted: Bool = false
19 |
20 | init() {
21 |
22 | }
23 |
24 | func wait(action: Action) {
25 | let isOwner = lock.calculateLocked { () -> Bool in
26 | if self.hasFaulted {
27 | return false
28 | }
29 |
30 | self.queue.enqueue(action)
31 | let isOwner = !self.isAcquired
32 | self.isAcquired = true
33 |
34 | return isOwner
35 | }
36 |
37 | if !isOwner {
38 | return
39 | }
40 |
41 | while true {
42 | let nextAction = lock.calculateLocked { () -> Action? in
43 | if self.queue.count > 0 {
44 | return self.queue.dequeue()
45 | }
46 | else {
47 | self.isAcquired = false
48 | return nil
49 | }
50 | }
51 |
52 | if let nextAction = nextAction {
53 | nextAction()
54 | }
55 | else {
56 | return
57 | }
58 | }
59 | }
60 |
61 | func dispose() {
62 | lock.performLocked { oldState in
63 | self.queue = Queue(capacity: 2)
64 | self.hasFaulted = true
65 | }
66 | }
67 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Concurrency/Lock.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Lock.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 3/31/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | struct Lock {
12 | private var _lock = OS_SPINLOCK_INIT
13 |
14 | init() {
15 |
16 | }
17 |
18 | mutating func performLocked(@noescape action: () -> Void) {
19 | OSSpinLockLock(&_lock)
20 | action()
21 | OSSpinLockUnlock(&_lock)
22 | }
23 |
24 | mutating func calculateLocked(@noescape action: () -> T) -> T {
25 | OSSpinLockLock(&_lock)
26 | let result = action()
27 | OSSpinLockUnlock(&_lock)
28 | return result
29 | }
30 | }
31 |
32 | extension NSRecursiveLock {
33 | func performLocked(@noescape action: () -> Void) {
34 | self.lock()
35 | action()
36 | self.unlock()
37 | }
38 |
39 | func calculateLocked(@noescape action: () -> T) -> T {
40 | self.lock()
41 | let result = action()
42 | self.unlock()
43 | return result
44 | }
45 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/DataStructures/Bag.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Bag.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 2/28/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | private struct BagPrivate {
12 | static let maxElements = Bag.KeyType.max - 1 // this is guarding from theoretical endless loop
13 | }
14 |
15 | public struct Bag : SequenceType, Printable {
16 | typealias Generator = GeneratorOf
17 |
18 | public typealias KeyType = Int
19 |
20 | private var map: [KeyType: T] = Dictionary(minimumCapacity: 5)
21 | private var nextKey: KeyType = 0
22 |
23 | public init() {
24 | }
25 |
26 | public var description : String {
27 | get {
28 | return "\(map.count) elements \(self.map)"
29 | }
30 | }
31 |
32 | public var count: Int {
33 | get {
34 | return map.count
35 | }
36 | }
37 |
38 | public mutating func put(x: T) -> KeyType {
39 | if map.count >= BagPrivate.maxElements {
40 | rxFatalError("Too many elements")
41 | }
42 |
43 | while map[nextKey] != nil {
44 | nextKey = nextKey &+ 1
45 | }
46 |
47 | map[nextKey] = x
48 |
49 | return nextKey
50 | }
51 |
52 | public func generate() -> GeneratorOf {
53 | var dictionaryGenerator = map.generate()
54 |
55 | return GeneratorOf {
56 | let next = dictionaryGenerator.next()
57 | if let (key, value) = next {
58 | return value
59 | }
60 | else {
61 | return nil
62 | }
63 | }
64 | }
65 |
66 | public var all: [T]
67 | {
68 | get {
69 | return self.map.values.array
70 | }
71 | }
72 |
73 | public mutating func removeAll() {
74 | map.removeAll(keepCapacity: false)
75 | }
76 |
77 | public mutating func removeKey(key: KeyType) -> T? {
78 | return map.removeValueForKey(key)
79 | }
80 |
81 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/DataStructures/Queue.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Queue.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 3/21/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public struct Queue: SequenceType {
12 | typealias Generator = GeneratorOf
13 |
14 | let resizeFactor = 2
15 |
16 | private var storage: [T?]
17 | private var _count: Int
18 | private var pushNextIndex: Int
19 | private var initialCapacity: Int
20 | private var version: Int
21 |
22 | public init(capacity: Int) {
23 | initialCapacity = capacity
24 |
25 | version = 0
26 | storage = []
27 | _count = 0
28 | pushNextIndex = 0
29 |
30 | resizeTo(capacity)
31 | }
32 |
33 | private var dequeueIndex: Int {
34 | get {
35 | var index = pushNextIndex - count
36 | return index < 0 ? index + self.storage.count : index
37 | }
38 | }
39 |
40 | public var count: Int {
41 | get {
42 | return _count
43 | }
44 | }
45 |
46 | public func peek() -> T {
47 | contract(count > 0)
48 |
49 | return storage[dequeueIndex]!
50 | }
51 |
52 | mutating private func resizeTo(size: Int) {
53 | var newStorage: [T?] = []
54 | newStorage.reserveCapacity(size)
55 |
56 | var count = _count
57 |
58 | for var i = 0; i < count; ++i {
59 | // does swift array have some more efficient methods of copying?
60 | newStorage.append(dequeue())
61 | }
62 |
63 | while newStorage.count < size {
64 | newStorage.append(nil)
65 | }
66 |
67 | _count = count
68 | pushNextIndex = count
69 | storage = newStorage
70 | }
71 |
72 | public mutating func enqueue(item: T) {
73 | version++
74 |
75 | let queueFull = count == storage.count
76 | if count == storage.count {
77 | resizeTo(storage.count * resizeFactor)
78 | }
79 |
80 | storage[pushNextIndex] = item
81 | pushNextIndex++
82 | _count = _count + 1
83 |
84 | if pushNextIndex >= storage.count {
85 | pushNextIndex -= storage.count
86 | }
87 | }
88 |
89 | public mutating func dequeue() -> T {
90 | version++
91 |
92 | contract(count > 0)
93 |
94 | let index = dequeueIndex
95 | let value = storage[index]!
96 |
97 | storage[index] = nil
98 |
99 | _count = _count - 1
100 |
101 | let downsizeLimit = storage.count / (resizeFactor * resizeFactor)
102 | if _count < downsizeLimit && downsizeLimit >= initialCapacity {
103 | resizeTo(storage.count / resizeFactor)
104 | }
105 |
106 | return value
107 | }
108 |
109 | public func generate() -> Generator {
110 | var i = dequeueIndex
111 | var count = _count
112 |
113 | var lastVersion = version
114 |
115 | return GeneratorOf {
116 | if lastVersion != self.version {
117 | rxFatalError("Collection was modified while enumerated")
118 | }
119 |
120 | if count == 0 {
121 | return nil
122 | }
123 |
124 | count--
125 | if i >= self.storage.count {
126 | i -= self.storage.count
127 | }
128 |
129 | return self.storage[i++]
130 | }
131 | }
132 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Disposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Disposable.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 2/8/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public protocol Disposable
12 | {
13 | func dispose()
14 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Disposables/AnonymousDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AnonymousDisposable.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 2/15/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public class AnonymousDisposable : DisposeBase, Disposable {
12 | public typealias DisposeAction = () -> Void
13 |
14 | var lock = Lock()
15 | var disposeAction: DisposeAction?
16 |
17 | public init(_ disposeAction: DisposeAction) {
18 | self.disposeAction = disposeAction
19 | super.init()
20 | }
21 |
22 | public func dispose() {
23 | let toDispose: DisposeAction? = lock.calculateLocked {
24 | var action = self.disposeAction
25 | self.disposeAction = nil
26 | return action
27 | }
28 |
29 | if let toDispose = toDispose {
30 | toDispose()
31 | }
32 | }
33 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Disposables/CompositeDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CompositeDisposable.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 2/20/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public class CompositeDisposable : DisposeBase, Disposable {
12 | public typealias BagKey = Bag.KeyType
13 |
14 | typealias State = (
15 | disposables: RxMutableBox>!,
16 | disposed: Bool
17 | )
18 |
19 | var lock: Lock = Lock()
20 | var state: State = (
21 | disposables: RxMutableBox(Bag()),
22 | disposed: false
23 | )
24 |
25 | public override init() {
26 | }
27 |
28 | public init(_ disposable1: Disposable, _ disposable2: Disposable) {
29 | let bag = state.disposables
30 |
31 | bag.value.put(disposable1)
32 | bag.value.put(disposable2)
33 | }
34 |
35 | public init(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable) {
36 | let bag = state.disposables
37 |
38 | bag.value.put(disposable1)
39 | bag.value.put(disposable2)
40 | bag.value.put(disposable3)
41 | }
42 |
43 | public init(disposables: [Disposable]) {
44 | let bag = state.disposables
45 |
46 | for disposable in disposables {
47 | bag.value.put(disposable)
48 | }
49 | }
50 |
51 | public func addDisposable(disposable: Disposable) -> BagKey? {
52 | // this should be let
53 | // bucause of compiler bug it's var
54 | let key = self.lock.calculateLocked { oldState -> BagKey? in
55 | if state.disposed {
56 | return nil
57 | }
58 | else {
59 | let key = state.disposables.value.put(disposable)
60 | return key
61 | }
62 | }
63 |
64 | if key == nil {
65 | disposable.dispose()
66 | }
67 |
68 | return key
69 | }
70 |
71 | public var count: Int {
72 | get {
73 | return self.lock.calculateLocked {
74 | self.state.disposables.value.count
75 | }
76 | }
77 | }
78 |
79 | public func removeDisposable(disposeKey: BagKey) {
80 | let disposable = self.lock.calculateLocked { Void -> Disposable? in
81 | return state.disposables.value.removeKey(disposeKey)
82 | }
83 |
84 | if let disposable = disposable {
85 | disposable.dispose()
86 | }
87 | }
88 |
89 | public func dispose() {
90 | let oldDisposables = self.lock.calculateLocked { Void -> [Disposable] in
91 | if state.disposed {
92 | return []
93 | }
94 |
95 | let disposables = state.disposables
96 | var allValues = disposables.value.all
97 |
98 | state.disposed = true
99 | state.disposables = nil
100 |
101 | return allValues
102 | }
103 |
104 | for d in oldDisposables {
105 | d.dispose()
106 | }
107 | }
108 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Disposables/DefaultDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DefaultDisposable.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 2/15/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public struct DefaultDisposable : Disposable {
12 |
13 | public init() {
14 |
15 | }
16 |
17 | public func dispose() {
18 | }
19 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Disposables/DisposeBag.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DisposeBag.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 3/25/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | // Thread safe bag that disposes objects once it is being deallocated.
12 | // This returns RAII like resource management to `RxSwift`.
13 | public class DisposeBag: DisposeBase, Disposable {
14 | typealias State = (
15 | disposables: [Disposable],
16 | disposed: Bool
17 | )
18 |
19 | private var lock = Lock()
20 | var state: State = (
21 | disposables: [],
22 | disposed: false
23 | )
24 |
25 | public override init() {
26 | super.init()
27 | }
28 |
29 | public func addDisposable(disposable: Disposable) {
30 | let dispose = lock.calculateLocked { () -> Bool in
31 | if state.disposed {
32 | return true
33 | }
34 |
35 | state.disposables.append(disposable)
36 |
37 | return false
38 | }
39 |
40 | if dispose {
41 | disposable.dispose()
42 | }
43 | }
44 |
45 | public func dispose() {
46 | let oldDisposables = lock.calculateLocked { () -> [Disposable] in
47 | var disposables = self.state.disposables
48 |
49 | self.state.disposables.removeAll(keepCapacity: false)
50 | self.state.disposed = true
51 |
52 | return disposables
53 | }
54 |
55 | for disposable in oldDisposables {
56 | disposable.dispose()
57 | }
58 | }
59 |
60 | deinit {
61 | dispose()
62 | }
63 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Disposables/DisposeBase.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DisposeBase.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 4/4/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public class DisposeBase {
12 | init() {
13 | #if TRACE_RESOURCES
14 | OSAtomicIncrement32(&resourceCount)
15 | #endif
16 | }
17 |
18 | deinit {
19 | #if TRACE_RESOURCES
20 | OSAtomicDecrement32(&resourceCount)
21 | #endif
22 | }
23 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Disposables/ScopedDispose.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ScopedDispose.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 5/2/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class ScopedDispose : DisposeBase, Disposable {
12 | var disposable: Disposable?
13 |
14 | init(disposable: Disposable) {
15 | self.disposable = disposable
16 | }
17 |
18 | func dispose() {
19 | // disposables are already thread safe
20 | self.disposable?.dispose()
21 | }
22 |
23 | deinit {
24 | self.dispose()
25 | }
26 | }
27 |
28 | public func scopedDispose(disposable: Disposable) -> Disposable {
29 | return ScopedDispose(disposable: disposable)
30 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Disposables/SerialDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SerialDisposable.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 3/12/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public class SerialDisposable : DisposeBase, Cancelable {
12 | typealias State = (
13 | current: Disposable?,
14 | disposed: Bool
15 | )
16 |
17 | var lock = Lock()
18 | var state: State = (
19 | current: nil,
20 | disposed: false
21 | )
22 |
23 | public var disposed: Bool {
24 | get {
25 | return state.disposed
26 | }
27 | }
28 |
29 | override public init() {
30 | super.init()
31 | }
32 |
33 | public func setDisposable(disposable: Disposable) {
34 | var disposable: Disposable? = self.lock.calculateLocked {
35 | if state.disposed {
36 | return disposable
37 | }
38 | else {
39 | var toDispose = state.current
40 | state.current = disposable
41 | return toDispose
42 | }
43 | }
44 |
45 | if let disposable = disposable {
46 | disposable.dispose()
47 | }
48 | }
49 |
50 | public func dispose() {
51 | var disposable: Disposable? = self.lock.calculateLocked {
52 | if state.disposed {
53 | return nil
54 | }
55 | else {
56 | state.disposed = true
57 | return state.current
58 | }
59 | }
60 |
61 | if let disposable = disposable {
62 | disposable.dispose()
63 | }
64 | }
65 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Disposables/SingleAssignmentDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SingleAssignmentDisposable.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 2/15/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public class SingleAssignmentDisposable : DisposeBase, Disposable {
12 | typealias State = (
13 | disposed: Bool,
14 | disposableSet: Bool,
15 | disposable: Disposable?
16 | )
17 |
18 | var lock = Lock()
19 | var state: State = (
20 | disposed: false,
21 | disposableSet: false,
22 | disposable: nil
23 | )
24 |
25 | public override init() {
26 | super.init()
27 | }
28 |
29 | public func setDisposable(newDisposable: Disposable) {
30 | var disposable: Disposable? = self.lock.calculateLocked { oldState in
31 |
32 | if state.disposableSet {
33 | rxFatalError("oldState.disposable != nil")
34 | }
35 |
36 | state.disposableSet = true
37 |
38 | if state.disposed {
39 | return newDisposable
40 | }
41 |
42 | state.disposable = newDisposable
43 |
44 | return nil
45 | }
46 |
47 | if let disposable = disposable {
48 | return disposable.dispose()
49 | }
50 | }
51 |
52 | public func dispose() {
53 | var disposable: Disposable? = lock.calculateLocked { old in
54 | state.disposed = true
55 | var dispose = state.disposable
56 | state.disposable = nil
57 |
58 | return dispose
59 | }
60 |
61 | if let disposable = disposable {
62 | disposable.dispose()
63 | }
64 | }
65 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Error.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Error.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 3/28/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | let RxErrorDomain = "RxErrorDomain"
12 | let RxCompositeFailures = "RxCompositeFailures"
13 |
14 | public enum RxErrorCode : Int {
15 | case Unknown = 0
16 | case Cast = 2
17 | case Disposed = 3
18 | }
19 |
20 | // This defines error type for entire project.
21 | // It's not practical to have different error handling types for different areas of the app.
22 | // This is good enough solution for now unless proven otherwise
23 | public typealias ErrorType = NSError
24 |
25 | public let UnknownError = NSError(domain: RxErrorDomain, code: RxErrorCode.Unknown.rawValue, userInfo: nil)
26 | public let CastError = NSError(domain: RxErrorDomain, code: RxErrorCode.Cast.rawValue, userInfo: nil)
27 | public let DisposedError = NSError(domain: RxErrorDomain, code: RxErrorCode.Disposed.rawValue, userInfo: nil)
28 |
29 | func removingObserverFailed() {
30 | rxFatalError("Removing observer for key failed")
31 | }
32 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Event.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Event.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 2/8/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 |
12 | /// Due to current swift limitations, we have to include this Box in RxResult.
13 | /// Swift cannot handle an enum with multiple associated data (A, NSError) where one is of unknown size (A)
14 | /// This can be swiftified once the compiler is completed
15 |
16 | /**
17 | * Represents event that happened
18 | * `Box` is there because of a bug in swift compiler
19 | * >> error: unimplemented IR generation feature non-fixed multi-payload enum layout
20 | */
21 | public enum Event : Printable {
22 | // Box is used is because swift compiler doesn't know
23 | // how to handle `Next(Element)` and it crashes.
24 | case Next(RxBox) // next element of a sequence
25 | case Error(ErrorType) // sequence failed with error
26 | case Completed // sequence terminated successfully
27 |
28 | public var description: String {
29 | get {
30 | switch self {
31 | case .Next(let boxedValue):
32 | return "Next(\(boxedValue))"
33 | case .Error(let error):
34 | return "Error(\(error))"
35 | case .Completed:
36 | return "Completed"
37 | }
38 | }
39 | }
40 | }
41 |
42 | public func eventType(event: Event) -> String {
43 | switch event {
44 | case .Next:
45 | return "Next: \(event)"
46 | case .Completed:
47 | return "Completed"
48 | case .Error(let error):
49 | return "Error \(error)"
50 | }
51 | }
52 |
53 | public func == (lhs: Event, rhs: Event) -> Bool {
54 | switch (lhs, rhs) {
55 | case (.Completed, .Completed): return true
56 | case (.Error(let e1), .Error(let e2)): return e1 == e2
57 | case (.Next(let v1), .Next(let v2)): return v1.value == v2.value
58 | default: return false
59 | }
60 | }
61 |
62 | extension Event {
63 | public var isStopEvent: Bool {
64 | get {
65 | switch self {
66 | case .Next:
67 | return false
68 | case .Error: fallthrough
69 | case .Completed: return true
70 | }
71 | }
72 | }
73 |
74 | public var value: Element? {
75 | get {
76 | switch self {
77 | case .Next(let value):
78 | return value.value
79 | case .Error: fallthrough
80 | case .Completed: return nil
81 | }
82 | }
83 | }
84 |
85 | public var error: ErrorType? {
86 | get {
87 | switch self {
88 | case .Next:
89 | return nil
90 | case .Error(let error):
91 | return error
92 | case .Completed:
93 | return nil
94 | }
95 | }
96 | }
97 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Observable+Subscription.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Observable+Subscription.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 2/21/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public func subscribe
12 | (on: (event: Event) -> Void)
13 | -> (Observable -> Disposable) {
14 | return { source in
15 | let observer = AnonymousObserver { e in
16 | on(event: e)
17 | }
18 | return source.subscribe(observer)
19 | }
20 | }
21 |
22 | public func subscribeNext
23 | (onNext: (E) -> Void)
24 | -> (Observable) -> Disposable {
25 | return { source in
26 | let observer = AnonymousObserver { e in
27 | switch e {
28 | case .Next(let boxedValue):
29 | onNext(boxedValue.value)
30 | default:
31 | break
32 | }
33 | }
34 | return source.subscribe(observer)
35 | }
36 | }
37 |
38 | public func subscribeError
39 | (onError: (ErrorType) -> Void)
40 | -> (Observable -> Disposable) {
41 | return { source in
42 | let observer = AnonymousObserver { e in
43 | switch e {
44 | case .Error(let error):
45 | onError(error)
46 | default:
47 | break
48 | }
49 | }
50 | return source.subscribe(observer)
51 | }
52 | }
53 |
54 | public func subscribeCompleted
55 | (onCompleted: () -> Void)
56 | -> (Observable -> Disposable) {
57 | return { source in
58 | let observer = AnonymousObserver { e in
59 | switch e {
60 | case .Completed:
61 | onCompleted()
62 | default:
63 | break
64 | }
65 | }
66 | return source.subscribe(observer)
67 | }
68 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Observable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Observable.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 2/8/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | /**
12 | * Using protocol for Observer complicates implementation too much
13 | */
14 | public class Observable {
15 |
16 | public init() {
17 | #if TRACE_RESOURCES
18 | OSAtomicIncrement32(&resourceCount)
19 | #endif
20 | }
21 |
22 | /// Subscribes `observer` to receive events from this observable
23 | public func subscribe(observer: O) -> Disposable {
24 | return abstractMethod()
25 | }
26 |
27 | deinit {
28 | #if TRACE_RESOURCES
29 | OSAtomicDecrement32(&resourceCount)
30 | #endif
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/Aggregate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Aggregate.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 4/1/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class Aggregate_ : Sink, ObserverType {
12 | typealias ResultType = O.Element
13 | typealias ParentType = Aggregate
14 |
15 | let parent: ParentType
16 | var accumulation: AccumulateType
17 |
18 | init(parent: ParentType, observer: O, cancel: Disposable) {
19 | self.parent = parent
20 |
21 | self.accumulation = parent.seed
22 |
23 | super.init(observer: observer, cancel: cancel)
24 | }
25 |
26 | func on(event: Event) {
27 | switch event {
28 | case .Next(let boxedValue):
29 | let value = boxedValue.value
30 | parent.accumulator(accumulation, value).flatMap { result in
31 | self.accumulation = result
32 | return SuccessResult
33 | }.recoverWith { e -> RxResult in
34 | trySendError(observer, e)
35 | self.dispose()
36 | return SuccessResult
37 | }
38 | case .Error(let e):
39 | trySendError(observer, e)
40 | self.dispose()
41 | case .Completed:
42 | parent.resultSelector(self.accumulation).flatMap { result in
43 | trySendNext(observer, result)
44 | trySendCompleted(observer)
45 | self.dispose()
46 | return SuccessResult
47 | }.recoverWith { error -> RxResult in
48 | trySendError(observer, error)
49 | self.dispose()
50 | return SuccessResult
51 | }
52 | }
53 | }
54 | }
55 |
56 | class Aggregate : Producer {
57 | typealias AccumulatorType = (AccumulateType, SourceType) -> RxResult
58 | typealias ResultSelectorType = (AccumulateType) -> RxResult
59 |
60 | let source: Observable
61 | let seed: AccumulateType
62 | let accumulator: AccumulatorType
63 | let resultSelector: ResultSelectorType
64 |
65 | init(source: Observable, seed: AccumulateType, accumulator: AccumulatorType, resultSelector: ResultSelectorType) {
66 | self.source = source
67 | self.seed = seed
68 | self.accumulator = accumulator
69 | self.resultSelector = resultSelector
70 | }
71 |
72 | override func run(observer: O, cancel: Disposable, setSink: (Disposable) -> Void) -> Disposable {
73 | let sink = Aggregate_(parent: self, observer: observer, cancel: cancel)
74 | setSink(sink)
75 | return source.subscribe(sink)
76 | }
77 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/AnonymousObservable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AnonymousObservable.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 2/8/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public class AnonymousObservable : ObservableBase {
12 | typealias SubscribeHandler = (ObserverOf) -> Disposable
13 |
14 | let subscribeHandler: SubscribeHandler
15 |
16 | public init(_ subscribeHandler: SubscribeHandler) {
17 | self.subscribeHandler = subscribeHandler
18 | }
19 |
20 | public override func subscribeCore(observer: ObserverOf) -> Disposable {
21 | return subscribeHandler(observer)
22 | }
23 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/AsObservable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AsObservable.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 2/27/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class AsObservableSink_ : Sink, ObserverType {
12 | typealias Element = O.Element
13 |
14 | override init(observer: O, cancel: Disposable) {
15 | super.init(observer: observer, cancel: cancel)
16 | }
17 |
18 | func on(event: Event) {
19 | trySend(observer, event)
20 |
21 | switch event {
22 | case .Error: fallthrough
23 | case .Completed:
24 | self.dispose()
25 | default: break
26 | }
27 | }
28 |
29 | }
30 |
31 | class AsObservable : Producer {
32 |
33 | let source: Observable
34 |
35 | init(source: Observable) {
36 | self.source = source
37 | }
38 |
39 | func omega() -> Observable {
40 | return self
41 | }
42 |
43 | func eval() -> Observable {
44 | return source
45 | }
46 |
47 | override func run(observer: O, cancel: Disposable, setSink: (Disposable) -> Void) -> Disposable {
48 | let sink = AsObservableSink_(observer: observer, cancel: cancel)
49 | setSink(sink)
50 | return source.subscribe(sink)
51 | }
52 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/Concat.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Concat.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 3/21/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class Concat_ : ConcatSink {
12 | override init(observer: Observer, cancel: Disposable) {
13 | super.init(observer: observer, cancel: cancel)
14 | }
15 |
16 | override func on(event: Event) {
17 | switch event {
18 | case .Next(let next):
19 | trySend(observer, event)
20 | case .Error:
21 | trySend(observer, event)
22 | dispose()
23 | case .Completed:
24 | super.on(event)
25 | }
26 | }
27 | }
28 |
29 | class Concat : Producer {
30 | let sources: [Observable]
31 |
32 | init(sources: [Observable]) {
33 | self.sources = sources
34 | }
35 |
36 | override func run
37 | (observer: O, cancel: Disposable, setSink: (Disposable) -> Void) -> Disposable {
38 | let sink = Concat_(observer: Observer.normalize(observer), cancel: cancel)
39 | setSink(sink)
40 |
41 | return sink.run(sources)
42 | }
43 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/ConcatSink.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ConcatSink.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 3/21/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class ConcatSink : TailRecursiveSink> {
12 | override init(observer: Observer, cancel: Disposable) {
13 | super.init(observer: observer, cancel: cancel)
14 | }
15 |
16 | override func on(event: Event){
17 | switch event {
18 | case .Completed:
19 | scheduleMoveNext()
20 | default:
21 | super.on(event)
22 | }
23 | }
24 |
25 | override func extract(observable: Observable) -> [Observable]? {
26 | if let source = observable as? Concat {
27 | return source.sources
28 | }
29 | else {
30 | return nil
31 | }
32 | }
33 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/ConnectableObservable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ConnectableObservable.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 3/1/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class Connection : Disposable {
12 | typealias SelfType = Connection
13 |
14 | var parent: ConnectableObservable?
15 | var subscription: SingleAssignmentDisposable? = SingleAssignmentDisposable()
16 |
17 | init(parent: ConnectableObservable) {
18 | self.parent = parent
19 | }
20 |
21 | func dispose() {
22 | if let parent = parent {
23 | parent.lock.performLocked {
24 | subscription!.dispose()
25 | subscription = nil
26 | self.parent!.connection = nil
27 | self.parent = nil
28 | }
29 | }
30 | }
31 | }
32 |
33 | class ConnectableObservable : ConnectableObservableType {
34 | typealias ConnectionType = Connection
35 |
36 | let subject: SubjectType
37 | let source: Observable
38 |
39 | var lock = Lock()
40 | var connection: ConnectionType?
41 |
42 | init(source: Observable, subject: SubjectType) {
43 | self.source = asObservable(source)
44 | self.subject = subject
45 | self.connection = nil
46 | }
47 |
48 | override func connect() -> Disposable {
49 | let (connection, connect) = self.lock.calculateLocked { oldConnection -> (Connection, Bool) in
50 | if let connection = self.connection {
51 | return (connection, false)
52 | }
53 | else {
54 | self.connection = Connection(parent: self)
55 | return (self.connection!, true)
56 | }
57 | }
58 |
59 | if connect {
60 | let disposable = self.source.subscribe(self.subject)
61 | connection.subscription!.setDisposable(disposable)
62 | }
63 |
64 | return connection
65 | }
66 |
67 | override func subscribe(observer: O) -> Disposable {
68 | return subject.subscribe(observer)
69 | }
70 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/Debug.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Debug.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 5/2/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class Debug_ : Sink, ObserverType {
12 | typealias Element = O.Element
13 | typealias Parent = Debug
14 |
15 | let parent: Parent
16 |
17 | init(parent: Parent, observer: O, cancel: Disposable) {
18 | self.parent = parent
19 | super.init(observer: observer, cancel: cancel)
20 | }
21 |
22 | func on(event: Event) {
23 | let maxEventTextLength = 40
24 | let ellipsis = "..."
25 |
26 | let eventText = "\(event)"
27 | let eventNormalized = count(eventText) > maxEventTextLength
28 | ? prefix(eventText, maxEventTextLength / 2) + "..." + suffix(eventText, maxEventTextLength / 2)
29 | : eventText
30 | println("Event \(eventNormalized) @ observer \(self) [\(parent.identifier)]")
31 | trySend(observer, event)
32 | }
33 |
34 | override func dispose() {
35 | println("Disposing observer \(self) [\(parent.identifier)]")
36 | super.dispose()
37 | }
38 | }
39 |
40 | class Debug : Producer {
41 | let identifier: String
42 |
43 | let source: Observable
44 |
45 | init(identifier: String, source: Observable) {
46 | self.identifier = identifier
47 | self.source = source
48 | }
49 |
50 | override func run(observer: O, cancel: Disposable, setSink: (Disposable) -> Void) -> Disposable {
51 | let sink = Debug_(parent: self, observer: observer, cancel: cancel)
52 | setSink(sink)
53 | return self.source.subscribe(sink)
54 | }
55 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/Defer.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Defer.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 4/19/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class Defer_ : Sink, ObserverType {
12 | typealias Element = O.Element
13 | typealias Parent = Defer
14 |
15 | let parent: Parent
16 |
17 | init(parent: Parent, observer: O, cancel: Disposable) {
18 | self.parent = parent
19 | super.init(observer: observer, cancel: cancel)
20 | }
21 |
22 | func run() -> Disposable {
23 | let disposable = parent.eval().flatMap { result in
24 | return success(result.subscribe(self))
25 | }.recoverWith { e in
26 | trySendError(observer, e)
27 | self.dispose()
28 | return success(DefaultDisposable())
29 | }
30 |
31 | return disposable.get()
32 | }
33 |
34 | func on(event: Event) {
35 | trySend(observer, event)
36 |
37 | switch event {
38 | case .Next:
39 | break
40 | case .Error:
41 | dispose()
42 | case .Completed:
43 | dispose()
44 | }
45 | }
46 | }
47 |
48 | class Defer : Producer {
49 | typealias Factory = () -> RxResult>
50 |
51 | let observableFactory : Factory
52 |
53 | init(observableFactory: Factory) {
54 | self.observableFactory = observableFactory
55 | }
56 |
57 | override func run(observer: O, cancel: Disposable, setSink: (Disposable) -> Void) -> Disposable {
58 | let sink = Defer_(parent: self, observer: observer, cancel: cancel)
59 | setSink(sink)
60 | return sink.run()
61 | }
62 |
63 | func eval() -> RxResult> {
64 | return observableFactory()
65 | }
66 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/DistinctUntilChanged.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DistinctUntilChanged.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 3/15/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class DistinctUntilChanged_: Sink, ObserverType {
12 | typealias Element = O.Element
13 |
14 | let parent: DistinctUntilChanged
15 | var currentKey: Key? = nil
16 |
17 | init(parent: DistinctUntilChanged, observer: O, cancel: Disposable) {
18 | self.parent = parent
19 | super.init(observer: observer, cancel: cancel)
20 | }
21 |
22 | func on(event: Event) {
23 | let observer = super.observer
24 |
25 | switch event {
26 | case .Next(let value):
27 | self.parent.selector(value.value).flatMap { key in
28 | var areEqual: RxResult
29 | if let currentKey = self.currentKey {
30 | areEqual = self.parent.comparer(currentKey, key)
31 | }
32 | else {
33 | areEqual = success(false)
34 | }
35 |
36 | return areEqual.flatMap { areEqual in
37 | if areEqual {
38 | return SuccessResult
39 | }
40 |
41 | self.currentKey = key
42 |
43 | trySend(observer, event)
44 | return SuccessResult
45 | }
46 | }.recoverWith { error -> RxResult in
47 | trySendError(observer, error)
48 | self.dispose()
49 | return SuccessResult
50 | }
51 | case .Error: fallthrough
52 | case .Completed:
53 | trySend(observer, event)
54 | self.dispose()
55 | }
56 | }
57 | }
58 |
59 | class DistinctUntilChanged: Producer {
60 | typealias KeySelector = (Element) -> RxResult
61 | typealias EqualityComparer = (Key, Key) -> RxResult
62 |
63 | let source: Observable
64 | let selector: KeySelector
65 | let comparer: EqualityComparer
66 |
67 | init(source: Observable, selector: KeySelector, comparer: EqualityComparer) {
68 | self.source = source
69 | self.selector = selector
70 | self.comparer = comparer
71 | }
72 |
73 | override func run(observer: O, cancel: Disposable, setSink: (Disposable) -> Void) -> Disposable {
74 | let sink = DistinctUntilChanged_(parent: self, observer: observer, cancel: cancel)
75 | setSink(sink)
76 | return source.subscribe(sink)
77 | }
78 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/Do.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Do.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 2/21/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class Do_ : Sink, ObserverType, Disposable {
12 | typealias Element = O.Element
13 | typealias DoType = Do
14 |
15 | let parent: DoType
16 |
17 | init(parent: DoType, observer: O, cancel: Disposable) {
18 | self.parent = parent
19 | super.init(observer: observer, cancel: cancel)
20 | }
21 |
22 | func on(event: Event) {
23 | parent.eventHandler(event).recoverWith { error in
24 | // catch clause
25 | trySendError(observer, error)
26 | self.dispose()
27 | return SuccessResult
28 | }.flatMap { _ -> RxResult in
29 | trySend(observer, event)
30 | if event.isStopEvent {
31 | self.dispose()
32 | }
33 | return SuccessResult
34 | }
35 | }
36 | }
37 |
38 | class Do : Producer {
39 | typealias EventHandler = Event -> RxResult
40 |
41 | let source: Observable
42 | let eventHandler: EventHandler
43 |
44 | init(source: Observable, eventHandler: EventHandler) {
45 | self.source = source
46 | self.eventHandler = eventHandler
47 | }
48 |
49 | override func run(observer: O, cancel: Disposable, setSink: (Disposable) -> Void) -> Disposable {
50 | let sink = Do_(parent: self, observer: observer, cancel: cancel)
51 |
52 | setSink(sink)
53 |
54 | return self.source.subscribe(sink)
55 | }
56 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/Multicast.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Multicast.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 2/27/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class Multicast_: Sink, ObserverType {
12 | typealias Element = O.Element
13 | typealias ResultType = Element
14 | typealias MutlicastType = Multicast
15 |
16 | typealias IntermediateObservable = ConnectableObservableType
17 | typealias ResultObservable = Observable
18 |
19 | let parent: MutlicastType
20 |
21 | init(parent: MutlicastType, observer: O, cancel: Disposable) {
22 | self.parent = parent
23 | super.init(observer: observer, cancel: cancel)
24 | }
25 |
26 | func run() -> Disposable {
27 | return parent.subjectSelector().flatMap { subject in
28 | let connectable = ConnectableObservable(source: self.parent.source, subject: subject)
29 |
30 | return self.parent.selector(connectable).flatMap { observable in
31 | let subscription = observable.subscribe(self)
32 | let connection = connectable.connect()
33 |
34 | return success(CompositeDisposable(subscription, connection))
35 | }
36 | }.recoverWith { e in
37 | trySendError(observer, e)
38 | self.dispose()
39 | return success(DefaultDisposable())
40 | }.get()
41 | }
42 |
43 | func on(event: Event) {
44 | trySend(observer, event)
45 | switch event {
46 | case .Next: break
47 | case .Error: fallthrough
48 | case .Completed: self.dispose()
49 | }
50 | }
51 | }
52 |
53 | class Multicast: Producer {
54 | typealias SubjectSelectorType = () -> RxResult>
55 | typealias SelectorType = (Observable) -> RxResult>
56 |
57 | let source: Observable
58 | let subjectSelector: SubjectSelectorType
59 | let selector: SelectorType
60 |
61 | init(source: Observable, subjectSelector: SubjectSelectorType, selector: SelectorType) {
62 | self.source = source
63 | self.subjectSelector = subjectSelector
64 | self.selector = selector
65 | }
66 |
67 | override func run(observer: O, cancel: Disposable, setSink: (Disposable) -> Void) -> Disposable {
68 | var sink = Multicast_(parent: self, observer: observer, cancel: cancel)
69 | setSink(sink)
70 | return sink.run()
71 | }
72 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/ObservableBase.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ObservableBase.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 2/15/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public class ObservableBase : Observable {
12 |
13 | override public func subscribe(observer: O) -> Disposable {
14 | let autoDetachObserver = AutoDetachObserver(observer: ObserverOf(observer))
15 |
16 | let disposable = subscribeCore(ObserverOf(autoDetachObserver))
17 | autoDetachObserver.setDisposable(disposable)
18 | return disposable
19 | }
20 |
21 | func subscribeCore(observer: ObserverOf) -> Disposable {
22 | return abstractMethod()
23 | }
24 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/ObserveSingleOn.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ObserveSingleOn.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 3/15/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | // This class is used to forward sequence of AT MOST ONE observed element to
12 | // another schedule.
13 | //
14 | // In case sequence contains more then one element, it will fire an exception.
15 |
16 | class ObserveSingleOnObserver : Sink, ObserverType, Disposable {
17 | typealias Element = O.Element
18 | typealias Parent = ObserveSingleOn
19 |
20 | let parent: Parent
21 |
22 | var lastElement: Event? = nil
23 |
24 | init(parent: Parent, observer: O, cancel: Disposable) {
25 | self.parent = parent
26 | super.init(observer: observer, cancel: cancel)
27 | }
28 |
29 | func on(event: Event) {
30 | var elementToForward: Event?
31 | var stopEventToForward: Event?
32 |
33 | let scheduler = self.parent.scheduler
34 |
35 | switch event {
36 | case .Next:
37 | if self.lastElement != nil {
38 | rxFatalError("Sequence contains more then one element")
39 | }
40 |
41 | self.lastElement = event
42 | case .Error:
43 | if self.lastElement != nil {
44 | rxFatalError("Observed sequence was expected to have more then one element")
45 | }
46 | stopEventToForward = event
47 | case .Completed:
48 | elementToForward = self.lastElement
49 | stopEventToForward = event
50 | }
51 |
52 | if let stopEventToForward = stopEventToForward {
53 | self.parent.scheduler.schedule(()) { (_) in
54 | if let elementToForward = elementToForward {
55 | trySend(self.observer, elementToForward)
56 | }
57 |
58 | trySend(self.observer, stopEventToForward)
59 |
60 | self.dispose()
61 |
62 | return SuccessResult
63 | }
64 | }
65 | }
66 |
67 | func run() -> Disposable {
68 | return self.parent.source.subscribe(self)
69 | }
70 | }
71 |
72 | class ObserveSingleOn : Producer {
73 | let scheduler: ImmediateScheduler
74 | let source: Observable
75 |
76 | init(source: Observable, scheduler: ImmediateScheduler) {
77 | self.source = source
78 | self.scheduler = scheduler
79 | }
80 |
81 | override func run(observer: O, cancel: Disposable, setSink: (Disposable) -> Void) -> Disposable {
82 | let sink = ObserveSingleOnObserver(parent: self, observer: observer, cancel: cancel)
83 | setSink(sink)
84 | return sink.run()
85 | }
86 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/Producer.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Producer.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 2/20/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public class Producer : Observable {
12 | public override init() {
13 | super.init()
14 | }
15 |
16 | public override func subscribe(observer: O) -> Disposable {
17 | let sink = SingleAssignmentDisposable()
18 | let subscription = SingleAssignmentDisposable()
19 |
20 | let d = CompositeDisposable(sink, subscription)
21 |
22 | let setSink: (Disposable) -> Void = { d in sink.setDisposable(d) }
23 | let disposable = run(observer, cancel: subscription, setSink: setSink)
24 |
25 | subscription.setDisposable(disposable)
26 |
27 | return d
28 | }
29 |
30 | public func run(observer: O, cancel: Disposable, setSink: (Disposable) -> Void) -> Disposable {
31 | return abstractMethod()
32 | }
33 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/RefCount.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RefCount.swift
3 | // Rx
4 | //
5 | // Created by Krunoslav Zaher on 3/5/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class RefCount_ : Sink, ObserverType {
12 | typealias Element = O.Element
13 | let parent: RefCount
14 | typealias ParentState = RefCount.State
15 |
16 | init(parent: RefCount, observer: O, cancel: Disposable) {
17 | self.parent = parent
18 | super.init(observer: observer, cancel: cancel)
19 | }
20 |
21 | func run() -> Disposable {
22 | let subscription = self.parent.source.subscribe(self)
23 |
24 | let state = self.parent.state
25 |
26 | self.parent.lock.performLocked {
27 | if state.count == 0 {
28 | let disposable = self.parent.source.connect()
29 | self.parent.state.count = 1
30 | self.parent.state.connectableSubscription = disposable
31 | }
32 | else {
33 | self.parent.state.count = state.count + 1
34 | }
35 | }
36 |
37 | return AnonymousDisposable {
38 | subscription.dispose()
39 | self.parent.lock.performLocked {
40 | let state = self.parent.state
41 | if state.count == 1 {
42 | state.connectableSubscription!.dispose()
43 | self.parent.state.count = 0
44 | self.parent.state.connectableSubscription = nil
45 | }
46 | else if state.count > 1 {
47 | self.parent.state.count = state.count - 1
48 | }
49 | else {
50 | rxFatalError("Something went wrong with RefCount disposing mechanism")
51 | }
52 | }
53 | }
54 | }
55 |
56 | func on(event: Event) {
57 | switch event {
58 | case .Next:
59 | trySend(observer, event)
60 | case .Error: fallthrough
61 | case .Completed:
62 | trySend(observer, event)
63 | self.dispose()
64 | }
65 | }
66 | }
67 |
68 | class RefCount: Producer {
69 | typealias State = (
70 | count: Int,
71 | connectableSubscription: Disposable?
72 | )
73 |
74 | var lock = Lock()
75 |
76 | var state: State = (
77 | count: 0,
78 | connectableSubscription: nil
79 | )
80 |
81 | let source: ConnectableObservableType
82 |
83 | init(source: ConnectableObservableType) {
84 | self.source = source
85 | }
86 |
87 | override func run(observer: O, cancel: Disposable, setSink: (Disposable) -> Void) -> Disposable {
88 | let sink = RefCount_(parent: self, observer: observer, cancel: cancel)
89 | setSink(sink)
90 | return sink.run()
91 | }
92 | }
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/Sample.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Sample.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 5/1/15.
6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class SampleImpl_ : Observer {
12 | typealias Parent = Sample_
13 |
14 | let parent: Parent
15 |
16 | init(parent: Parent) {
17 | self.parent = parent
18 | }
19 |
20 | override func on(event: Event) {
21 | parent.lock.performLocked {
22 | switch event {
23 | case .Next:
24 | if let element = parent.sampleState.element {
25 | if self.parent.parent.onlyNew {
26 | parent.sampleState.element = nil
27 | }
28 |
29 | trySend(parent.observer, element)
30 | }
31 |
32 | if parent.sampleState.atEnd {
33 | trySendCompleted(parent.observer)
34 | parent.dispose()
35 | }
36 | case .Error(let e):
37 | trySendError(parent.observer, e)
38 | parent.dispose()
39 | case .Completed:
40 | if let element = parent.sampleState.element {
41 | parent.sampleState.element = nil
42 | trySend(parent.observer, element)
43 | }
44 | if parent.sampleState.atEnd {
45 | trySendCompleted(parent.observer)
46 | parent.dispose()
47 | }
48 | }
49 | }
50 | }
51 | }
52 |
53 | class Sample_ : Sink, ObserverType {
54 | typealias Element = O.Element
55 | typealias Parent = Sample
56 | typealias SampleState = (
57 | element: Event?,
58 | atEnd: Bool,
59 | sourceSubscription: SingleAssignmentDisposable
60 | )
61 |
62 | let parent: Parent
63 |
64 | var lock = NSRecursiveLock()
65 |
66 | var sampleState: SampleState = (
67 | element: nil,
68 | atEnd: false,
69 | sourceSubscription: SingleAssignmentDisposable()
70 | )
71 |
72 | init(parent: Parent, observer: O, cancel: Disposable) {
73 | self.parent = parent
74 | super.init(observer: observer, cancel: cancel)
75 | }
76 |
77 | func run() -> Disposable {
78 | sampleState.sourceSubscription.setDisposable(parent.source.subscribe(self))
79 | let samplerSubscription = parent.sampler.subscribe(SampleImpl_(parent: self))
80 |
81 | return CompositeDisposable(sampleState.sourceSubscription, samplerSubscription)
82 | }
83 |
84 | func on(event: Event) {
85 | self.lock.performLocked {
86 | switch event {
87 | case .Next:
88 | self.sampleState.element = event
89 | case .Error:
90 | trySend(observer, event)
91 | self.dispose()
92 | case .Completed:
93 | self.sampleState.atEnd = true
94 | self.sampleState.sourceSubscription.dispose()
95 | }
96 | }
97 | }
98 |
99 | }
100 |
101 | class Sample : Producer {
102 | let source: Observable
103 | let sampler: Observable
104 | let onlyNew: Bool
105 |
106 | init(source: Observable, sampler: Observable, onlyNew: Bool) {
107 | self.source = source
108 | self.sampler = sampler
109 | self.onlyNew = onlyNew
110 | }
111 |
112 | override func run