├── 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(observer: O, cancel: Disposable, setSink: (Disposable) -> Void) -> Disposable { 113 | let sink = Sample_(parent: self, observer: observer, cancel: cancel) 114 | setSink(sink) 115 | return sink.run() 116 | } 117 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/ScheduledObserver.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ScheduledObserver.swift 3 | // Rx 4 | // 5 | // Created by Krunoslav Zaher on 4/5/15. 6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | enum ScheduledState: Int { 12 | case Stopped = 0 13 | case Running = 1 14 | case Pending = 2 15 | case Faulted = 9 16 | } 17 | 18 | class ScheduledObserver : ObserverBase { 19 | 20 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/Select.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Select.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 Select_ : Sink, ObserverType { 12 | typealias ResultType = O.Element 13 | typealias Element = SourceType 14 | 15 | let parent: Select 16 | 17 | init(parent: Select, observer: O, cancel: Disposable) { 18 | self.parent = parent 19 | super.init(observer: observer, cancel: cancel) 20 | } 21 | 22 | func select(element: SourceType) -> RxResult { 23 | return abstractMethod() 24 | } 25 | 26 | func on(event: Event) { 27 | let observer = super.observer 28 | 29 | switch event { 30 | case .Next(let element): 31 | select(element.value).flatMap { value in 32 | trySendNext(observer, value) 33 | return SuccessResult 34 | }.recoverWith { e -> RxResult in 35 | trySendError(observer, e) 36 | self.dispose() 37 | return SuccessResult 38 | } 39 | case .Error(let error): 40 | trySendError(observer, error) 41 | self.dispose() 42 | case .Completed: 43 | trySendCompleted(observer) 44 | self.dispose() 45 | } 46 | } 47 | } 48 | 49 | class Select_1 : Select_ { 50 | typealias ResultType = O.Element 51 | 52 | override init(parent: Select, observer: O, cancel: Disposable) { 53 | super.init(parent: parent, observer: observer, cancel: cancel) 54 | } 55 | 56 | override func select(element: SourceType) -> RxResult { 57 | return (self.parent.selector1!)(element) 58 | } 59 | } 60 | 61 | class Select_2 : Select_ { 62 | typealias ResultType = O.Element 63 | 64 | var index = 0 65 | 66 | override init(parent: Select, observer: O, cancel: Disposable) { 67 | super.init(parent: parent, observer: observer, cancel: cancel) 68 | } 69 | override func select(element: SourceType) -> RxResult { 70 | return (self.parent.selector2!)(element, index++) 71 | } 72 | } 73 | 74 | class Select: Producer { 75 | typealias Selector1 = (SourceType) -> RxResult 76 | typealias Selector2 = (SourceType, Int) -> RxResult 77 | 78 | let source: Observable 79 | 80 | let selector1: Selector1? 81 | let selector2: Selector2? 82 | 83 | init(source: Observable, selector: Selector1) { 84 | self.source = source 85 | self.selector1 = selector 86 | self.selector2 = nil 87 | } 88 | 89 | init(source: Observable, selector: Selector2) { 90 | self.source = source 91 | self.selector2 = selector 92 | self.selector1 = nil 93 | } 94 | 95 | override func run(observer: O, cancel: Disposable, setSink: (Disposable) -> Void) -> Disposable { 96 | if let selector1 = self.selector1 { 97 | let sink = Select_1(parent: self, observer: observer, cancel: cancel) 98 | setSink(sink) 99 | return self.source.subscribe(sink) 100 | } 101 | else { 102 | let sink = Select_2(parent: self, observer: observer, cancel: cancel) 103 | setSink(sink) 104 | return self.source.subscribe(sink) 105 | } 106 | 107 | } 108 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/Sink.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Sink.swift 3 | // Rx 4 | // 5 | // Created by Krunoslav Zaher on 2/19/15. 6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class Sink : Disposable { 12 | private typealias Element = O.Element 13 | 14 | typealias State = ( 15 | observer: O?, 16 | cancel: Disposable, 17 | disposed: Bool 18 | ) 19 | 20 | private var lock = Lock() 21 | private var _state: State 22 | 23 | var observer: O? { 24 | get { 25 | return lock.calculateLocked { _state.observer } 26 | } 27 | } 28 | 29 | var cancel: Disposable { 30 | get { 31 | return lock.calculateLocked { _state.cancel } 32 | } 33 | } 34 | 35 | var state: State { 36 | get { 37 | return lock.calculateLocked { _state } 38 | } 39 | } 40 | 41 | init(observer: O, cancel: Disposable) { 42 | #if TRACE_RESOURCES 43 | OSAtomicIncrement32(&resourceCount) 44 | #endif 45 | _state = ( 46 | observer: observer, 47 | cancel: cancel, 48 | disposed: false 49 | ) 50 | } 51 | 52 | func dispose() { 53 | var cancel: Disposable? = lock.calculateLocked { 54 | if _state.disposed { 55 | return nil 56 | } 57 | 58 | var cancel = _state.cancel 59 | 60 | _state.disposed = true 61 | _state.observer = nil 62 | _state.cancel = DefaultDisposable() 63 | 64 | return cancel 65 | } 66 | 67 | if let cancel = cancel { 68 | cancel.dispose() 69 | } 70 | } 71 | 72 | deinit { 73 | #if TRACE_RESOURCES 74 | OSAtomicDecrement32(&resourceCount) 75 | #endif 76 | } 77 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/StartWith.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StartWith.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 4/6/15. 6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import RxSwift 11 | 12 | class StartWith: Producer { 13 | let element: Element 14 | let source: Observable 15 | 16 | init(source: Observable, element: Element) { 17 | self.source = source 18 | self.element = element 19 | super.init() 20 | } 21 | 22 | override func subscribe(observer: O) -> Disposable { 23 | sendNext(observer, element) 24 | 25 | return source.subscribe(observer) 26 | } 27 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/TailRecursiveSink.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TailRecursiveSink.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 TailRecursiveSink : Sink, ObserverType { 12 | typealias Element = O.Element 13 | typealias StackElementType = (generator: GeneratorOf>, length: Int) 14 | 15 | var stack: [StackElementType] = [] 16 | var disposed: Bool = false 17 | var subscription = SerialDisposable() 18 | 19 | // this is thread safe object 20 | var gate: AsyncLock = AsyncLock() 21 | 22 | override init(observer: O, cancel: Disposable) { 23 | super.init(observer: observer, cancel: cancel) 24 | } 25 | 26 | func run(sources: [Observable]) -> Disposable { 27 | let generator: GeneratorOf> = GeneratorOf(sources.generate()) 28 | self.stack.append((generator: generator, length: sources.count)) 29 | 30 | let stateSnapshot = self.state 31 | 32 | scheduleMoveNext() 33 | return CompositeDisposable( 34 | self.subscription, 35 | stateSnapshot.cancel, 36 | AnonymousDisposable { 37 | self.disposePrivate() 38 | } 39 | ) 40 | } 41 | 42 | func scheduleMoveNext() { 43 | return schedule { 44 | self.moveNext() 45 | } 46 | } 47 | 48 | // simple implementation for now 49 | func schedule(action: () -> Void) { 50 | self.gate.wait(action) 51 | } 52 | 53 | func moveNext() { 54 | var next: Observable? = nil; 55 | 56 | do { 57 | if self.stack.count == 0 { 58 | break 59 | } 60 | 61 | if disposed { 62 | return 63 | } 64 | 65 | var (e, l) = stack.last! 66 | 67 | let current = e.next() 68 | 69 | if current == nil { 70 | stack.removeLast() 71 | continue; 72 | } 73 | 74 | let r = l - 1 75 | 76 | stack.removeLast() 77 | stack.append((generator: e, length: r)) 78 | 79 | next = current 80 | 81 | if r == 0 { 82 | stack.removeLast() 83 | } 84 | 85 | let nextSeq = extract(next!) 86 | 87 | if let nextSeq = nextSeq { 88 | let generator = GeneratorOf(nextSeq.generate()) 89 | let length = nextSeq.count 90 | 91 | next = nil 92 | } 93 | } while next == nil 94 | 95 | if next == nil { 96 | done() 97 | return 98 | } 99 | 100 | let subscription2 = next!.subscribe(self) 101 | subscription.setDisposable(subscription2) 102 | } 103 | 104 | private func disposePrivate() { 105 | disposed = true 106 | 107 | stack.removeAll(keepCapacity: false) 108 | } 109 | 110 | func done() { 111 | trySendCompleted(observer) 112 | self.dispose() 113 | } 114 | 115 | func extract(observable: Observable) -> [Observable]? { 116 | return abstractMethod() 117 | } 118 | 119 | func on(event: Event) { 120 | return abstractMethod() 121 | } 122 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observables/Implementations/Where.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Where.swift 3 | // Rx 4 | // 5 | // Created by Krunoslav Zaher on 2/17/15. 6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class Where_: Sink, ObserverType { 12 | typealias Element = O.Element 13 | 14 | typealias Parent = Where 15 | 16 | let parent: Parent 17 | 18 | init(parent: Parent, observer: O, cancel: Disposable) { 19 | self.parent = parent 20 | super.init(observer: observer, cancel: cancel) 21 | } 22 | 23 | func on(event: Event) { 24 | switch event { 25 | case .Next(let boxedValue): 26 | let value = boxedValue.value 27 | _ = self.parent.predicate(value).recoverWith { e in 28 | trySendError(observer, e) 29 | self.dispose() 30 | return failure(e) 31 | }.flatMap { satisfies -> RxResult in 32 | if satisfies { 33 | trySend(observer, event) 34 | } 35 | return SuccessResult 36 | } 37 | case .Completed: fallthrough 38 | case .Error: 39 | trySend(observer, event) 40 | self.dispose() 41 | } 42 | } 43 | } 44 | 45 | class Where : Producer { 46 | typealias Predicate = (Element) -> RxResult 47 | 48 | let source: Observable 49 | let predicate: Predicate 50 | 51 | init(source: Observable, predicate: Predicate) { 52 | self.source = source 53 | self.predicate = predicate 54 | } 55 | 56 | override func run(observer: O, cancel: Disposable, setSink: (Disposable) -> Void) -> Disposable { 57 | let sink = Where_(parent: self, observer: observer, cancel: cancel) 58 | setSink(sink) 59 | return source.subscribe(sink) 60 | } 61 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observables/Observable+Aggregate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Observable+Aggregate.swift 3 | // Rx 4 | // 5 | // Created by Krunoslav Zaher on 3/22/15. 6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // aggregate 12 | 13 | public func aggregateOrDie 14 | (seed: A, accumulator: (A, E) -> RxResult, resultSelector: (A) -> RxResult) 15 | -> (Observable -> Observable) { 16 | return { source in 17 | return Aggregate(source: source, seed: seed, accumulator: accumulator, resultSelector: resultSelector) 18 | } 19 | } 20 | 21 | public func aggregateOrDie 22 | (seed: A, accumulator: (A, E) -> RxResult) 23 | -> (Observable -> Observable) { 24 | return { source in 25 | return Aggregate(source: source, seed: seed, accumulator: accumulator, resultSelector: { success($0) }) 26 | } 27 | } 28 | 29 | public func aggregate 30 | (seed: A, accumulator: (A, E) -> A, resultSelector: (A) -> R) 31 | -> (Observable -> Observable) { 32 | return { source in 33 | return Aggregate(source: source, seed: seed, accumulator: { success(accumulator($0, $1)) }, resultSelector: { success(resultSelector($0)) }) 34 | } 35 | } 36 | 37 | public func aggregate 38 | (seed: A, accumulator: (A, E) -> A) 39 | -> (Observable -> Observable) { 40 | return { source in 41 | return Aggregate(source: source, seed: seed, accumulator: { success(accumulator($0, $1)) }, resultSelector: { success($0) }) 42 | } 43 | } 44 | 45 | // foldl 46 | 47 | public func foldlOrDie 48 | (seed: A, accumulator: (A, E) -> RxResult, resultSelector: (A) -> RxResult) 49 | -> (Observable -> Observable) { 50 | return { source in 51 | return Aggregate(source: source, seed: seed, accumulator: accumulator, resultSelector: resultSelector) 52 | } 53 | } 54 | 55 | public func foldlOrDie 56 | (seed: A, accumulator: (A, E) -> RxResult) 57 | -> (Observable -> Observable) { 58 | return { source in 59 | return Aggregate(source: source, seed: seed, accumulator: accumulator, resultSelector: { success($0) }) 60 | } 61 | } 62 | 63 | public func foldl 64 | (seed: A, accumulator: (A, E) -> A, resultSelector: (A) -> R) 65 | -> (Observable -> Observable) { 66 | return { source in 67 | return Aggregate(source: source, seed: seed, accumulator: { success(accumulator($0, $1)) }, resultSelector: { success(resultSelector($0)) }) 68 | } 69 | } 70 | 71 | public func foldl 72 | (seed: A, accumulator: (A, E) -> A) 73 | -> (Observable -> Observable) { 74 | return { source in 75 | return Aggregate(source: source, seed: seed, accumulator: { success(accumulator($0, $1)) }, resultSelector: { success($0) }) 76 | } 77 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observables/Observable+Binding.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Observable+Binding.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 | // multicast 12 | 13 | public func multicast 14 | (subject: SubjectType) 15 | -> (Observable -> ConnectableObservableType) { 16 | return { source in 17 | return ConnectableObservable(source: source, subject: subject) 18 | } 19 | } 20 | 21 | public func multicastOrDie 22 | ( 23 | subjectSelector: () -> RxResult>, 24 | selector: (Observable) -> RxResult> 25 | ) 26 | -> (Observable -> Observable) { 27 | 28 | return { source in 29 | return Multicast( 30 | source: source, 31 | subjectSelector: subjectSelector, 32 | selector: selector 33 | ) 34 | } 35 | } 36 | 37 | public func multicast 38 | ( 39 | subjectSelector: () -> SubjectType, 40 | selector: (Observable) -> Observable 41 | ) 42 | -> (Observable -> Observable) { 43 | 44 | return { source in 45 | return Multicast( 46 | source: source, 47 | subjectSelector: { success(subjectSelector()) }, 48 | selector: { success(selector($0)) } 49 | ) 50 | } 51 | } 52 | 53 | // publish 54 | 55 | public func publish(source: Observable) 56 | -> ConnectableObservableType { 57 | return source >- multicast(Subject()) 58 | } 59 | 60 | // replay 61 | 62 | public func replay 63 | (bufferSize: Int) 64 | -> (Observable -> ConnectableObservableType) { 65 | return { source in 66 | return multicast(ReplaySubject(bufferSize: bufferSize))(source) 67 | } 68 | } 69 | 70 | // refcount 71 | 72 | public func refCount 73 | (source: ConnectableObservableType) 74 | -> Observable { 75 | return RefCount(source: source) 76 | } 77 | 78 | // sharedWithCachedLastResult 79 | 80 | // In Rx every subscription uses it's own set of resources. 81 | // In case of UI, asynchronous operations are usually used to fetch data from server. 82 | // In case data is fetched from server, stale data can be server first, and then updated with 83 | // fresh data from server. 84 | 85 | public func sharedWithCachedLastResult(source: Observable) 86 | -> Observable { 87 | return source >- replay(1) >- refCount 88 | } 89 | 90 | // variable 91 | 92 | // variable is synonym for `sharedWithCachedLastResult` 93 | public func variable(source: Observable) 94 | -> Observable { 95 | return source >- replay(1) >- refCount 96 | } 97 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observables/Observable+Concurrency.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Observable+Concurrency.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 | // Currently only simple observing is implemented. 12 | // 13 | // On client devices most common use case for observeOn would be to execute some work on background thread 14 | // or return result to main thread. 15 | // 16 | // `observeSingleOn` is optimized for that specific purpose. It assumes that sequence will have one element 17 | // and in cases it has more then one element it will throw an exception. 18 | // 19 | // This is a huge performance win considering most general case. 20 | // 21 | // General slower version of `observeOn` will not be implemented until needed. 22 | // 23 | // Even though it looks like naive implementation of general `observeOn` using simple `schedule` 24 | // for each event will work, this is not the case. 25 | 26 | public func observeSingleOn 27 | (scheduler: ImmediateScheduler) 28 | -> ((Observable) -> Observable) { 29 | return { source in 30 | return ObserveSingleOn(source: source, scheduler: scheduler) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observables/Observable+Creation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Observable+Creation.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 | // create 12 | 13 | public func create(subscribe: (ObserverOf) -> Disposable) -> Observable { 14 | return AnonymousObservable(subscribe) 15 | } 16 | 17 | // empty 18 | 19 | public func empty() -> Observable { 20 | return AnonymousObservable { observer in 21 | sendCompleted(observer) 22 | return DefaultDisposable() 23 | } 24 | } 25 | 26 | // never 27 | 28 | public func never() -> Observable { 29 | return AnonymousObservable { observer in 30 | return DefaultDisposable() 31 | } 32 | } 33 | 34 | // return 35 | 36 | public func returnElement(value: E) -> Observable { 37 | return AnonymousObservable { observer in 38 | sendNext(observer, value) 39 | sendCompleted(observer) 40 | return DefaultDisposable() 41 | } 42 | } 43 | 44 | public func just(value: E) -> Observable { 45 | return returnElement(value) 46 | } 47 | 48 | public func returnElements(values: E ...) -> Observable { 49 | return AnonymousObservable { observer in 50 | for element in values { 51 | sendNext(observer, element) 52 | } 53 | 54 | sendCompleted(observer) 55 | return DefaultDisposable() 56 | } 57 | } 58 | 59 | // fail 60 | 61 | public func failWith(error: ErrorType) -> Observable { 62 | return AnonymousObservable { observer in 63 | sendError(observer, error) 64 | return DefaultDisposable() 65 | } 66 | } 67 | 68 | // defer 69 | 70 | public func deferOrDie(observableFactory: () -> RxResult>) 71 | -> Observable { 72 | return Defer(observableFactory: observableFactory) 73 | } 74 | 75 | public func defer(observableFactory: () -> Observable) 76 | -> Observable { 77 | return Defer(observableFactory: { success(observableFactory()) }) 78 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observables/Observable+Debug.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Observable+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 | // debug 12 | 13 | public func debug(identifier: String) 14 | -> (Observable -> Observable) { 15 | return { source in 16 | return Debug(identifier: identifier, source: source) 17 | } 18 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observables/Observable+Multiple.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Observable+Multiple.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 | // switch 12 | 13 | public func switchLatest 14 | (sources: Observable>) 15 | -> Observable { 16 | 17 | // swift doesn't have co/contravariance 18 | return Switch(sources: sources) 19 | } 20 | 21 | 22 | // concat 23 | 24 | public func concat 25 | (sources: [Observable]) 26 | -> Observable { 27 | return Concat(sources: sources) 28 | } 29 | 30 | public func concat 31 | (sources: Observable>) 32 | -> Observable { 33 | return merge(maxConcurrent: 1)(sources) 34 | } 35 | 36 | // merge 37 | 38 | public func merge 39 | (sources: Observable>) 40 | -> Observable { 41 | return Merge(sources: sources, maxConcurrent: 0) 42 | } 43 | 44 | public func merge 45 | (#maxConcurrent: Int) 46 | -> (Observable> -> Observable) { 47 | return { sources in 48 | return Merge(sources: sources, maxConcurrent: maxConcurrent) 49 | } 50 | } 51 | 52 | // catch 53 | 54 | public func catchOrDie 55 | (handler: (ErrorType) -> RxResult>) 56 | -> (Observable -> Observable) { 57 | return { source in 58 | return Catch(source: source, handler: handler) 59 | } 60 | } 61 | 62 | public func catch 63 | (handler: (ErrorType) -> Observable) 64 | -> (Observable -> Observable) { 65 | return { source in 66 | return Catch(source: source, handler: { success(handler($0)) }) 67 | } 68 | } 69 | 70 | // In case of error, terminates sequence with `replaceErrorWith`. 71 | public func catch 72 | (replaceErrorWith: E) 73 | -> (Observable -> Observable) { 74 | return { source in 75 | return Catch(source: source, handler: { _ in success(returnElement(replaceErrorWith)) }) 76 | } 77 | } 78 | 79 | // When error happens `error` will be forwarded as a next `Result` value 80 | // and sequence will be completed. 81 | public func catchToResult 82 | (source: Observable) 83 | -> Observable > { 84 | return CatchToResult(source: source) 85 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observables/Observable+StandardSequenceOperators.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Observable+StandardSequenceOperators.swift 3 | // Rx 4 | // 5 | // Created by Krunoslav Zaher on 2/17/15. 6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // filter aka where 12 | 13 | public func filterOrDie 14 | (predicate: (E) -> RxResult) 15 | -> (Observable -> Observable) { 16 | return { source in 17 | return whereOrDie(predicate)(source) 18 | } 19 | } 20 | 21 | public func filter 22 | (predicate: (E) -> Bool) 23 | -> (Observable -> Observable) { 24 | return { source in 25 | return `where`(predicate)(source) 26 | } 27 | } 28 | 29 | public func whereOrDie 30 | (predicate: (E) -> RxResult) 31 | -> (Observable -> Observable) { 32 | return { source in 33 | return Where(source: source, predicate: predicate) 34 | } 35 | } 36 | 37 | public func `where` 38 | (predicate: (E) -> Bool) 39 | -> (Observable -> Observable) { 40 | return { source in 41 | return Where(source: source, predicate: { success(predicate($0)) }) 42 | } 43 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observables/Observable+Time.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Observable+Time.swift 3 | // Rx 4 | // 5 | // Created by Krunoslav Zaher on 3/22/15. 6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // throttle 12 | 13 | public func throttle 14 | (dueTime: S.TimeInterval, scheduler: S) 15 | -> (Observable -> Observable) { 16 | return { source in 17 | return Throttle(source: source, dueTime: dueTime, scheduler: scheduler) 18 | } 19 | } 20 | 21 | // sample 22 | 23 | // If there isn't a new value in `source` sequence from the last sample time 24 | // nothing will be forwarded. 25 | public func sample 26 | (sampler: Observable) 27 | -> (Observable -> Observable) { 28 | return { source in 29 | return Sample(source: source, sampler: sampler, onlyNew: true) 30 | } 31 | } 32 | 33 | // On each sample latest element will always be forwarded. 34 | public func sampleLatest 35 | (sampler: Observable) 36 | -> (Observable -> Observable) { 37 | return { source in 38 | return Sample(source: source, sampler: sampler, onlyNew: false) 39 | } 40 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Observer.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 5/23/15. 6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // This is a base class for all of the internal observers/sinks 12 | class Observer : ObserverType { 13 | typealias Element = ElementType 14 | 15 | func on(event: Event) { 16 | return abstractMethod() 17 | } 18 | 19 | class func normalize(observer: O) -> Observer { 20 | if let observer = observer as? Observer { 21 | return observer 22 | } 23 | else { 24 | return ObserverAdapter(observer: observer) 25 | } 26 | } 27 | } 28 | 29 | class ObserverAdapter : Observer { 30 | let observer: O 31 | 32 | init(observer: O) { 33 | self.observer = observer 34 | } 35 | 36 | override func on(event: Event) { 37 | self.observer.on(event) 38 | } 39 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/ObserverOf.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ObserverOf.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 | public struct ObserverOf { 12 | typealias Element = ElementType 13 | 14 | private typealias ObserverSinkType = (Event) -> Void 15 | 16 | private let observer: ObserverSinkType 17 | private let instance: AnyObject? 18 | 19 | /// Construct an instance whose `on(event)` calls `observer.on(event)` 20 | public init(_ observer: O) { 21 | var observerReference = observer // this is because swift compiler crashing 22 | self.instance = observerReference 23 | self.observer = { e in 24 | return observerReference.on(e) 25 | } 26 | } 27 | 28 | /// Send `event` to this observer. 29 | public func on(event: Event) { 30 | return observer(event) 31 | } 32 | } 33 | 34 | public func dispatch>(event: Event, observers: S?) { 35 | if let observers = observers { 36 | for o in observers { 37 | o.on(event) 38 | } 39 | } 40 | } 41 | 42 | 43 | public func dispatchNext>(element: Element, observers: S?) { 44 | if let observers = observers { 45 | let event = Event.Next(RxBox(element)) 46 | for o in observers { 47 | o.on(event) 48 | } 49 | } 50 | } 51 | 52 | public func dispatch(event: Event, observers: S?) { 53 | if let observers = observers { 54 | for o in observers { 55 | o.on(event) 56 | } 57 | } 58 | } 59 | 60 | public func dispatchNext(element: O.Element, observers: S?) { 61 | if let observers = observers { 62 | let event = Event.Next(RxBox(element)) 63 | for o in observers { 64 | o.on(event) 65 | } 66 | } 67 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/ObserverType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ObserverType.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 ObserverType : class { 12 | /// The type of event to be written to this observer. 13 | typealias Element 14 | 15 | /// Send `event` to this observer. 16 | func on(event: Event) 17 | } 18 | 19 | public func send(observer: O, event: Event) { 20 | observer.on(event) 21 | } 22 | 23 | public func sendNext(observer: O, element: O.Element) { 24 | observer.on(.Next(RxBox(element))) 25 | } 26 | 27 | public func sendError(observer: O, error: ErrorType) { 28 | observer.on(.Error(error)) 29 | } 30 | 31 | public func sendCompleted(observer: O) { 32 | observer.on(.Completed) 33 | } 34 | 35 | func trySend(observer: O?, event: Event) { 36 | observer?.on(event) 37 | } 38 | 39 | func trySendNext(observer: O?, element: O.Element) { 40 | observer?.on(.Next(RxBox(element))) 41 | } 42 | 43 | public func trySendError(observer: O?, error: ErrorType) { 44 | observer?.on(.Error(error)) 45 | } 46 | 47 | public func trySendCompleted(observer: O?) { 48 | observer?.on(.Completed) 49 | } 50 | 51 | // this is temporary only 52 | 53 | public func send(observer: ObserverOf, event: Event) { 54 | observer.on(event) 55 | } 56 | 57 | public func sendNext(observer: ObserverOf, element: Element) { 58 | observer.on(.Next(RxBox(element))) 59 | } 60 | 61 | public func sendError(observer: ObserverOf, error: ErrorType) { 62 | observer.on(.Error(error)) 63 | } 64 | 65 | public func sendCompleted(observer: ObserverOf) { 66 | observer.on(.Completed) 67 | } 68 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observers/AnonymousObserver.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnonymousObserver.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 AnonymousObserver : ObserverType { 12 | typealias Element = ElementType 13 | 14 | typealias EventHandler = Event -> Void 15 | 16 | private let eventHandler : EventHandler 17 | 18 | public init(_ eventHandler: EventHandler) { 19 | self.eventHandler = eventHandler 20 | } 21 | 22 | public func on(event: Event) { 23 | return self.eventHandler(event) 24 | } 25 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observers/AutoDetachObserver.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AutoDetachObserver.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 | class AutoDetachObserver : ObserverBase { 12 | private let observer : ObserverOf 13 | private let m : SingleAssignmentDisposable 14 | 15 | init(observer: ObserverOf) { 16 | self.observer = observer 17 | self.m = SingleAssignmentDisposable() 18 | 19 | super.init() 20 | } 21 | 22 | func setDisposable(disposable: Disposable) { 23 | m.setDisposable(disposable) 24 | } 25 | 26 | override func onCore(event: Event) { 27 | switch event { 28 | case .Next: 29 | observer.on(event) 30 | case .Completed: fallthrough 31 | case .Error: 32 | observer.on(event) 33 | dispose() 34 | } 35 | } 36 | 37 | override func dispose() { 38 | super.dispose() 39 | m.dispose() 40 | } 41 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observers/DoneObserver.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DoneObserver.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 DoneObserver : ObserverType { 12 | typealias Element = ElementType 13 | 14 | //static let Instance = DoneObserver() 15 | 16 | func on(event: Event) { 17 | } 18 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observers/NopObserver.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NopObserver.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 class NopObserver : ObserverType { 12 | typealias Element = ElementType 13 | 14 | public init() { 15 | 16 | } 17 | 18 | public func on(event: Event) { 19 | } 20 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Observers/ObserverBase.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ObserverBase.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 | class ObserverBase : Observer, Disposable { 12 | typealias Element = ElementType 13 | 14 | var lock = Lock() 15 | var isStopped: Bool = false 16 | 17 | override init() { 18 | super.init() 19 | } 20 | 21 | override func on(event: Event) { 22 | switch event { 23 | case .Next: 24 | if !isStopped { 25 | onCore(event) 26 | } 27 | case .Error: fallthrough 28 | case .Completed: 29 | var wasStopped: Bool = lock.calculateLocked { 30 | var wasStopped = self.isStopped 31 | self.isStopped = true 32 | return wasStopped 33 | } 34 | 35 | if !wasStopped { 36 | self.onCore(event) 37 | } 38 | } 39 | } 40 | 41 | func onCore(event: Event) { 42 | } 43 | 44 | func dispose() { 45 | } 46 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Rx.swift 3 | // Rx 4 | // 5 | // Created by Krunoslav Zaher on 2/14/15. 6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | #if TRACE_RESOURCES 12 | // counts resources 13 | // used to detect resource leaks during unit tests 14 | // it's not perfect, but works well 15 | public var resourceCount: Int32 = 0 16 | #endif 17 | 18 | // This is the pipe operator (left associative function application operator) 19 | // a >- b >- c == c(b(a)) 20 | // The reason this one is chosen for now is because 21 | // * It's subtle, doesn't add a lot of visual noise 22 | // * It's short 23 | // * It kind of looks like ASCII art horizontal sink to the right 24 | // 25 | infix operator >- { associativity left precedence 91 } 26 | 27 | public func >- (lhs: In, @noescape rhs: In -> Out) -> Out { 28 | return rhs(lhs) 29 | } 30 | 31 | func contract(@autoclosure condition: () -> Bool) { 32 | if !condition() { 33 | let exception = NSException(name: "ContractError", reason: "Contract failed", userInfo: nil) 34 | exception.raise() 35 | } 36 | } 37 | 38 | // Swift doesn't have a concept of abstract metods. 39 | // This function is being used as a runtime check that abstract methods aren't being called. 40 | func abstractMethod() -> T { 41 | rxFatalError("Abstract method") 42 | let dummyValue: T? = nil 43 | return dummyValue! 44 | } 45 | 46 | func rxFatalError(lastMessage: String) { 47 | // The temptation to comment this line is great, but please don't, it's for your own good. The choice is yours. 48 | fatalError(lastMessage) 49 | } 50 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/RxBox.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxBox.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 5/22/15. 6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // Because ... Swift 12 | // Because ... Crash 13 | // Because ... compiler bugs 14 | 15 | // Wrapper for any value type 16 | public class RxBox : Printable { 17 | public let value : T 18 | public init (_ value: T) { 19 | self.value = value 20 | } 21 | 22 | public var description: String { 23 | get { 24 | return "Box(\(self.value))" 25 | } 26 | } 27 | } 28 | 29 | // Wrapper for any value type that can be mutated 30 | public class RxMutableBox : Printable { 31 | public var value : T 32 | public init (_ value: T) { 33 | self.value = value 34 | } 35 | 36 | public var description: String { 37 | get { 38 | return "MutatingBox(\(self.value))" 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Scheduler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Scheduler.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 ImmediateScheduler { 12 | func schedule(state: StateType, action: (StateType) -> RxResult) -> RxResult 13 | } 14 | 15 | public protocol Scheduler: ImmediateScheduler { 16 | typealias TimeInterval 17 | typealias Time 18 | 19 | var now : Time { 20 | get 21 | } 22 | 23 | func scheduleRelative(state: StateType, dueTime: TimeInterval, action: (StateType) -> RxResult) -> RxResult 24 | } 25 | 26 | 27 | // This is being called every time `Rx` scheduler performs action to 28 | // check the result of the computation. 29 | // 30 | // The default implementation will throw an Exception if the result failed. 31 | // 32 | // It's probably best to make sure all of the errors have been handled before 33 | // the computation finishes, but it's not unreasonable to change the implementation 34 | // for release builds to silently fail (although I would not recommended). 35 | // 36 | // Changing default behavior is not recommended because possible data corruption 37 | // is "usually" a lot worse then letting program to crash. 38 | // 39 | func ensureScheduledSuccessfully(result: RxResult) -> RxResult { 40 | switch result { 41 | case .Failure(let error): 42 | return errorDuringScheduledAction(error); 43 | default: break 44 | } 45 | 46 | return SuccessResult 47 | } 48 | 49 | func errorDuringScheduledAction(error: ErrorType) -> RxResult { 50 | let exception = NSException(name: "ScheduledActionError", reason: "Error happened during scheduled action execution", userInfo: ["error": error]) 51 | exception.raise() 52 | 53 | return SuccessResult 54 | } 55 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Scheduler/DispatchQueueScheduler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DispatchQueueScheduler.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 DispatchQueueScheduler : Scheduler { 12 | public typealias Time = NSDate 13 | public typealias TimeInterval = NSTimeInterval 14 | 15 | private let queue : dispatch_queue_t 16 | 17 | public init(queue: dispatch_queue_t) { 18 | self.queue = queue 19 | 20 | } 21 | 22 | // DISPATCH_QUEUE_PRIORITY_DEFAULT 23 | // DISPATCH_QUEUE_PRIORITY_HIGH 24 | // DISPATCH_QUEUE_PRIORITY_LOW 25 | convenience public init(priority: Int) { 26 | self.init(queue: dispatch_get_global_queue(priority, UInt(0))) 27 | } 28 | 29 | public var now : NSDate { 30 | get { 31 | return NSDate() 32 | } 33 | } 34 | 35 | class func convertTimeIntervalToDispatchTime(timeInterval: NSTimeInterval) -> dispatch_time_t { 36 | return dispatch_time(DISPATCH_TIME_NOW, Int64(timeInterval * Double(NSEC_PER_SEC) / 1000)) 37 | } 38 | 39 | public func schedule(state: StateType, action: (StateType) -> RxResult) -> RxResult { 40 | dispatch_async(self.queue, { 41 | ensureScheduledSuccessfully(action(state)) 42 | }) 43 | 44 | return success(DefaultDisposable()) 45 | } 46 | 47 | public func scheduleRelative(state: StateType, dueTime: NSTimeInterval, action: (StateType) -> RxResult) -> RxResult { 48 | let timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.queue) 49 | 50 | let dispatchInterval = MainScheduler.convertTimeIntervalToDispatchTime(dueTime) 51 | 52 | dispatch_source_set_timer(timer, dispatchInterval, DISPATCH_TIME_FOREVER, 0) 53 | dispatch_source_set_event_handler(timer, { 54 | ensureScheduledSuccessfully(action(state)) 55 | }) 56 | dispatch_resume(timer) 57 | 58 | return success(AnonymousDisposable { 59 | dispatch_source_cancel(timer) 60 | }) 61 | } 62 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Scheduler/ImmediateSchedulerOnCurrentThread.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImmediateSchedulerOnCurrentThread.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 ImmediateSchedulerOnCurrentThread : ImmediateScheduler { 12 | public func schedule(state: StateType, action: (StateType) -> RxResult) -> RxResult { 13 | return action(state).map { (DefaultDisposable()) } 14 | } 15 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Scheduler/MainScheduler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MainScheduler.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 MainScheduler : DispatchQueueScheduler { 12 | struct Singleton { 13 | static let sharedInstance = MainScheduler() 14 | } 15 | 16 | private init() { 17 | super.init(queue: dispatch_get_main_queue()) 18 | } 19 | 20 | public class var sharedInstance: MainScheduler { 21 | get { 22 | return Singleton.sharedInstance 23 | } 24 | } 25 | 26 | public class func ensureExecutingOnScheduler() { 27 | if !NSThread.currentThread().isMainThread { 28 | rxFatalError("Executing on wrong scheduler") 29 | } 30 | } 31 | 32 | public override func schedule(state: StateType, action: (StateType) -> RxResult) -> RxResult { 33 | if NSThread.currentThread().isMainThread { 34 | ensureScheduledSuccessfully(action(state)) 35 | 36 | return success(DefaultDisposable()) 37 | } 38 | 39 | return super.schedule(state, action: action) 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Scheduler/OperationQueueScheduler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // OperationQueueScheduler.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 OperationQueueScheduler: ImmediateScheduler { 12 | private let operationQueue: NSOperationQueue 13 | 14 | public init(operationQueue: NSOperationQueue) { 15 | self.operationQueue = operationQueue 16 | } 17 | 18 | public func schedule(state: StateType, action: (StateType) -> RxResult) -> RxResult { 19 | let operation = NSBlockOperation { 20 | ensureScheduledSuccessfully(action(state)) 21 | } 22 | self.operationQueue.addOperation(operation) 23 | 24 | return success(AnonymousDisposable { 25 | operation.cancel() 26 | }) 27 | } 28 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Scheduler/SchedulerDefaults.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SchedulerDefaults.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 | struct SchedulerDefaults { 12 | static var ConstantTimeOperations : ImmediateScheduler { 13 | get { 14 | return ImmediateSchedulerOnCurrentThread() 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Subjects/BehaviorSubject.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BehaviorSubject.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 5/23/15. 6 | // Copyright (c) 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | private class BehaviorSubjectSubscription : Disposable { 12 | typealias Parent = BehaviorSubject 13 | typealias DisposeKey = Parent.ObserverBag.KeyType 14 | 15 | let parent: Parent 16 | var disposeKey: DisposeKey? 17 | 18 | init(parent: BehaviorSubject, disposeKey: DisposeKey) { 19 | self.parent = parent 20 | self.disposeKey = disposeKey 21 | } 22 | 23 | func dispose() { 24 | self.parent.lock.performLocked { 25 | if let disposeKey = disposeKey { 26 | self.parent.observers.removeKey(disposeKey) 27 | self.disposeKey = nil 28 | } 29 | } 30 | } 31 | } 32 | 33 | public class BehaviorSubject : SubjectType { 34 | typealias ObserverOf = Observer 35 | typealias ObserverBag = Bag> 36 | 37 | let lock = NSRecursiveLock() 38 | 39 | private var _value: Element 40 | private var observers: ObserverBag = Bag() 41 | private var stoppedEvent: Event? 42 | 43 | public init(value: Element) { 44 | self._value = value 45 | super.init() 46 | } 47 | 48 | // Returns value if value exists or throws exception if subject contains error 49 | public var value: Element { 50 | get { 51 | return lock.calculateLocked { 52 | if let error = stoppedEvent?.error { 53 | // intentionally throw exception 54 | return failure(error).get() 55 | } 56 | else { 57 | return _value 58 | } 59 | } 60 | } 61 | } 62 | 63 | public var valueResult: RxResult { 64 | get { 65 | return lock.calculateLocked { 66 | if let error = stoppedEvent?.error { 67 | // intentionally throw exception 68 | return failure(error) 69 | } 70 | else { 71 | return success(_value) 72 | } 73 | } 74 | } 75 | } 76 | 77 | 78 | public var hasObservers: Bool { 79 | get { 80 | return lock.calculateLocked { 81 | observers.count > 0 82 | } 83 | } 84 | } 85 | 86 | public override func on(event: Event) { 87 | let observers = lock.calculateLocked { () -> [Observer]? in 88 | if self.stoppedEvent != nil { 89 | return nil 90 | } 91 | 92 | switch event { 93 | case .Next(let boxedValue): 94 | self._value = boxedValue.value 95 | case .Error: 96 | self.stoppedEvent = event 97 | case .Completed: 98 | self.stoppedEvent = event 99 | } 100 | 101 | return self.observers.all 102 | } 103 | 104 | dispatch(event, observers) 105 | } 106 | 107 | override public func subscribe(observer: O) -> Disposable { 108 | let disposeKey = lock.calculateLocked { () -> ObserverBag.KeyType? in 109 | if let stoppedEvent = stoppedEvent { 110 | send(observer, stoppedEvent) 111 | return nil 112 | } 113 | 114 | let key = observers.put(ObserverOf.normalize(observer)) 115 | sendNext(observer, _value) 116 | return key 117 | } 118 | 119 | if let disposeKey = disposeKey { 120 | return BehaviorSubjectSubscription(parent: self, disposeKey: disposeKey) 121 | } 122 | else { 123 | return DefaultDisposable() 124 | } 125 | } 126 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Subjects/ConnectableObservableType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConnectableObservableType.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 | public class ConnectableObservableType: Observable { 12 | public override init() { 13 | 14 | } 15 | 16 | public func connect() -> Disposable { 17 | return abstractMethod() 18 | } 19 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Subjects/SubjectType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SubjectType.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 | public class SubjectType : Observable, ObserverType { 12 | typealias Element = SourceType 13 | 14 | public override init() { 15 | 16 | } 17 | 18 | public func on(x: Event) { 19 | return abstractMethod() 20 | } 21 | } -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxSwift/Subjects/Variable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Variable.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 | // Variables can be useful when interacting with imperative 12 | public class Variable: BehaviorSubject { 13 | typealias VariableState = Element 14 | 15 | public init(_ value: Element) { 16 | super.init(value: value) 17 | } 18 | 19 | public func next(value: Element) { 20 | sendNext(self, value) 21 | } 22 | } 23 | 24 | 25 | @availability(*, deprecated=1.4, message="Please use variable.next, it's more clear") 26 | public func << (variable: Variable, element: E) { 27 | variable.next(element) 28 | } -------------------------------------------------------------------------------- /Pods/SVProgressHUD/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2011-2014 Sam Vermette 2 | 3 | Permission is hereby granted, free of charge, to any person 4 | obtaining a copy of this software and associated documentation 5 | files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, 7 | copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following 10 | conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | A different license may apply to other resources included in this package, 25 | including Freepik Icons. Please consult their 26 | respective headers for the terms of their individual licenses. -------------------------------------------------------------------------------- /Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h: -------------------------------------------------------------------------------- 1 | // 2 | // SVIndefiniteAnimatedView.h 3 | // SVProgressHUD 4 | // 5 | // Created by Guillaume Campagna on 2014-12-05. 6 | // 7 | // 8 | 9 | #import 10 | 11 | @interface SVIndefiniteAnimatedView : UIView 12 | 13 | @property (nonatomic, assign) CGFloat strokeThickness; 14 | @property (nonatomic, assign) CGFloat radius; 15 | @property (nonatomic, strong) UIColor *strokeColor; 16 | 17 | @end 18 | 19 | -------------------------------------------------------------------------------- /Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashfurrow/FunctionalReactiveAwesome/b9166f3c4c89ba055fb729b2fd7f928353f8e4f9/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask.png -------------------------------------------------------------------------------- /Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashfurrow/FunctionalReactiveAwesome/b9166f3c4c89ba055fb729b2fd7f928353f8e4f9/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@2x.png -------------------------------------------------------------------------------- /Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashfurrow/FunctionalReactiveAwesome/b9166f3c4c89ba055fb729b2fd7f928353f8e4f9/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@3x.png -------------------------------------------------------------------------------- /Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashfurrow/FunctionalReactiveAwesome/b9166f3c4c89ba055fb729b2fd7f928353f8e4f9/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error.png -------------------------------------------------------------------------------- /Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashfurrow/FunctionalReactiveAwesome/b9166f3c4c89ba055fb729b2fd7f928353f8e4f9/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@2x.png -------------------------------------------------------------------------------- /Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashfurrow/FunctionalReactiveAwesome/b9166f3c4c89ba055fb729b2fd7f928353f8e4f9/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@3x.png -------------------------------------------------------------------------------- /Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashfurrow/FunctionalReactiveAwesome/b9166f3c4c89ba055fb729b2fd7f928353f8e4f9/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info.png -------------------------------------------------------------------------------- /Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashfurrow/FunctionalReactiveAwesome/b9166f3c4c89ba055fb729b2fd7f928353f8e4f9/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@2x.png -------------------------------------------------------------------------------- /Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashfurrow/FunctionalReactiveAwesome/b9166f3c4c89ba055fb729b2fd7f928353f8e4f9/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@3x.png -------------------------------------------------------------------------------- /Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashfurrow/FunctionalReactiveAwesome/b9166f3c4c89ba055fb729b2fd7f928353f8e4f9/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success.png -------------------------------------------------------------------------------- /Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashfurrow/FunctionalReactiveAwesome/b9166f3c4c89ba055fb729b2fd7f928353f8e4f9/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@2x.png -------------------------------------------------------------------------------- /Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashfurrow/FunctionalReactiveAwesome/b9166f3c4c89ba055fb729b2fd7f928353f8e4f9/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@3x.png -------------------------------------------------------------------------------- /Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h: -------------------------------------------------------------------------------- 1 | // 2 | // SVProgressHUD.h 3 | // 4 | // Copyright 2011-2014 Sam Vermette. All rights reserved. 5 | // 6 | // https://github.com/samvermette/SVProgressHUD 7 | // 8 | 9 | #import 10 | #import 11 | 12 | extern NSString * const SVProgressHUDDidReceiveTouchEventNotification; 13 | extern NSString * const SVProgressHUDDidTouchDownInsideNotification; 14 | extern NSString * const SVProgressHUDWillDisappearNotification; 15 | extern NSString * const SVProgressHUDDidDisappearNotification; 16 | extern NSString * const SVProgressHUDWillAppearNotification; 17 | extern NSString * const SVProgressHUDDidAppearNotification; 18 | 19 | extern NSString * const SVProgressHUDStatusUserInfoKey; 20 | 21 | typedef NS_ENUM(NSUInteger, SVProgressHUDMaskType) { 22 | SVProgressHUDMaskTypeNone = 1, // allow user interactions while HUD is displayed 23 | SVProgressHUDMaskTypeClear, // don't allow user interactions 24 | SVProgressHUDMaskTypeBlack, // don't allow user interactions and dim the UI in the back of the HUD 25 | SVProgressHUDMaskTypeGradient // don't allow user interactions and dim the UI with a a-la-alert-view background gradient 26 | }; 27 | 28 | @interface SVProgressHUD : UIView 29 | 30 | #pragma mark - Customization 31 | 32 | + (void)setBackgroundColor:(UIColor*)color; // default is [UIColor whiteColor] 33 | + (void)setForegroundColor:(UIColor*)color; // default is [UIColor blackColor] 34 | + (void)setRingThickness:(CGFloat)width; // default is 4 pt 35 | + (void)setFont:(UIFont*)font; // default is [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline] 36 | + (void)setInfoImage:(UIImage*)image; // default is the bundled info image provided by Freepik 37 | + (void)setSuccessImage:(UIImage*)image; // default is the bundled success image provided by Freepik 38 | + (void)setErrorImage:(UIImage*)image; // default is the bundled error image provided by Freepik 39 | + (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType; // default is SVProgressHUDMaskTypeNone 40 | + (void)setViewForExtension:(UIView*)view; // default is nil, only used if #define SV_APP_EXTENSIONS is set 41 | 42 | #pragma mark - Show Methods 43 | 44 | + (void)show; 45 | + (void)showWithMaskType:(SVProgressHUDMaskType)maskType; 46 | + (void)showWithStatus:(NSString*)status; 47 | + (void)showWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType; 48 | 49 | + (void)showProgress:(float)progress; 50 | + (void)showProgress:(float)progress maskType:(SVProgressHUDMaskType)maskType; 51 | + (void)showProgress:(float)progress status:(NSString*)status; 52 | + (void)showProgress:(float)progress status:(NSString*)status maskType:(SVProgressHUDMaskType)maskType; 53 | 54 | + (void)setStatus:(NSString*)string; // change the HUD loading status while it's showing 55 | 56 | // stops the activity indicator, shows a glyph + status, and dismisses HUD a little bit later 57 | + (void)showInfoWithStatus:(NSString *)string; 58 | + (void)showInfoWithStatus:(NSString *)string maskType:(SVProgressHUDMaskType)maskType; 59 | 60 | + (void)showSuccessWithStatus:(NSString*)string; 61 | + (void)showSuccessWithStatus:(NSString*)string maskType:(SVProgressHUDMaskType)maskType; 62 | 63 | + (void)showErrorWithStatus:(NSString *)string; 64 | + (void)showErrorWithStatus:(NSString *)string maskType:(SVProgressHUDMaskType)maskType; 65 | 66 | // use 28x28 white pngs 67 | + (void)showImage:(UIImage*)image status:(NSString*)status; 68 | + (void)showImage:(UIImage*)image status:(NSString*)status maskType:(SVProgressHUDMaskType)maskType; 69 | 70 | + (void)setOffsetFromCenter:(UIOffset)offset; 71 | + (void)resetOffsetFromCenter; 72 | 73 | + (void)popActivity; // decrease activity count, if activity count == 0 the HUD is dismissed 74 | + (void)dismiss; 75 | 76 | + (BOOL)isVisible; 77 | 78 | @end 79 | 80 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-Alamofire/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.2.2 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-Alamofire/Pods-FunctionalReactiveAwesome-Alamofire-Private.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods-FunctionalReactiveAwesome-Alamofire.xcconfig" 2 | CONFIGURATION_BUILD_DIR = $PODS_FRAMEWORK_BUILD_PATH 3 | FRAMEWORK_SEARCH_PATHS = "$PODS_FRAMEWORK_BUILD_PATH" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Alamofire" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Alamofire" "${PODS_ROOT}/Headers/Public/Moya" "${PODS_ROOT}/Headers/Public/RxCocoa" "${PODS_ROOT}/Headers/Public/RxSwift" "${PODS_ROOT}/Headers/Public/SVProgressHUD" 6 | OTHER_LDFLAGS = -ObjC 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-FunctionalReactiveAwesome 9 | PODS_ROOT = ${SRCROOT} 10 | SKIP_INSTALL = YES -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-Alamofire/Pods-FunctionalReactiveAwesome-Alamofire-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_FunctionalReactiveAwesome_Alamofire : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_FunctionalReactiveAwesome_Alamofire 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-Alamofire/Pods-FunctionalReactiveAwesome-Alamofire-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | #import "Pods-FunctionalReactiveAwesome-environment.h" 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-Alamofire/Pods-FunctionalReactiveAwesome-Alamofire-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double AlamofireVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char AlamofireVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-Alamofire/Pods-FunctionalReactiveAwesome-Alamofire.modulemap: -------------------------------------------------------------------------------- 1 | framework module Alamofire { 2 | umbrella header "Pods-FunctionalReactiveAwesome-Alamofire-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-Alamofire/Pods-FunctionalReactiveAwesome-Alamofire.xcconfig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashfurrow/FunctionalReactiveAwesome/b9166f3c4c89ba055fb729b2fd7f928353f8e4f9/Pods/Target Support Files/Pods-FunctionalReactiveAwesome-Alamofire/Pods-FunctionalReactiveAwesome-Alamofire.xcconfig -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-Moya/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.1.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-Moya/Pods-FunctionalReactiveAwesome-Moya-Private.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods-FunctionalReactiveAwesome-Moya.xcconfig" 2 | CONFIGURATION_BUILD_DIR = $PODS_FRAMEWORK_BUILD_PATH 3 | FRAMEWORK_SEARCH_PATHS = "$PODS_FRAMEWORK_BUILD_PATH" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Moya" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Alamofire" "${PODS_ROOT}/Headers/Public/Moya" "${PODS_ROOT}/Headers/Public/RxCocoa" "${PODS_ROOT}/Headers/Public/RxSwift" "${PODS_ROOT}/Headers/Public/SVProgressHUD" 6 | OTHER_LDFLAGS = ${PODS_FUNCTIONALREACTIVEAWESOME_MOYA_OTHER_LDFLAGS} -ObjC 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-FunctionalReactiveAwesome 9 | PODS_ROOT = ${SRCROOT} 10 | SKIP_INSTALL = YES -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-Moya/Pods-FunctionalReactiveAwesome-Moya-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_FunctionalReactiveAwesome_Moya : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_FunctionalReactiveAwesome_Moya 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-Moya/Pods-FunctionalReactiveAwesome-Moya-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | #import "Pods-FunctionalReactiveAwesome-environment.h" 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-Moya/Pods-FunctionalReactiveAwesome-Moya-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double MoyaVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char MoyaVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-Moya/Pods-FunctionalReactiveAwesome-Moya.modulemap: -------------------------------------------------------------------------------- 1 | framework module Moya { 2 | umbrella header "Pods-FunctionalReactiveAwesome-Moya-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-Moya/Pods-FunctionalReactiveAwesome-Moya.xcconfig: -------------------------------------------------------------------------------- 1 | PODS_FUNCTIONALREACTIVEAWESOME_MOYA_OTHER_LDFLAGS = -framework "Foundation" -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-RxCocoa/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.5 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-RxCocoa/Pods-FunctionalReactiveAwesome-RxCocoa-Private.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods-FunctionalReactiveAwesome-RxCocoa.xcconfig" 2 | CONFIGURATION_BUILD_DIR = $PODS_FRAMEWORK_BUILD_PATH 3 | FRAMEWORK_SEARCH_PATHS = "$PODS_FRAMEWORK_BUILD_PATH" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/RxCocoa" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Alamofire" "${PODS_ROOT}/Headers/Public/Moya" "${PODS_ROOT}/Headers/Public/RxCocoa" "${PODS_ROOT}/Headers/Public/RxSwift" "${PODS_ROOT}/Headers/Public/SVProgressHUD" 6 | OTHER_LDFLAGS = -ObjC 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-FunctionalReactiveAwesome 9 | PODS_ROOT = ${SRCROOT} 10 | SKIP_INSTALL = YES -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-RxCocoa/Pods-FunctionalReactiveAwesome-RxCocoa-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_FunctionalReactiveAwesome_RxCocoa : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_FunctionalReactiveAwesome_RxCocoa 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-RxCocoa/Pods-FunctionalReactiveAwesome-RxCocoa-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | #import "Pods-FunctionalReactiveAwesome-environment.h" 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-RxCocoa/Pods-FunctionalReactiveAwesome-RxCocoa-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double RxCocoaVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char RxCocoaVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-RxCocoa/Pods-FunctionalReactiveAwesome-RxCocoa.modulemap: -------------------------------------------------------------------------------- 1 | framework module RxCocoa { 2 | umbrella header "Pods-FunctionalReactiveAwesome-RxCocoa-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-RxCocoa/Pods-FunctionalReactiveAwesome-RxCocoa.xcconfig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashfurrow/FunctionalReactiveAwesome/b9166f3c4c89ba055fb729b2fd7f928353f8e4f9/Pods/Target Support Files/Pods-FunctionalReactiveAwesome-RxCocoa/Pods-FunctionalReactiveAwesome-RxCocoa.xcconfig -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-RxSwift/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.4 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-RxSwift/Pods-FunctionalReactiveAwesome-RxSwift-Private.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods-FunctionalReactiveAwesome-RxSwift.xcconfig" 2 | CONFIGURATION_BUILD_DIR = $PODS_FRAMEWORK_BUILD_PATH 3 | FRAMEWORK_SEARCH_PATHS = "$PODS_FRAMEWORK_BUILD_PATH" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/RxSwift" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Alamofire" "${PODS_ROOT}/Headers/Public/Moya" "${PODS_ROOT}/Headers/Public/RxCocoa" "${PODS_ROOT}/Headers/Public/RxSwift" "${PODS_ROOT}/Headers/Public/SVProgressHUD" 6 | OTHER_LDFLAGS = -ObjC 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-FunctionalReactiveAwesome 9 | PODS_ROOT = ${SRCROOT} 10 | SKIP_INSTALL = YES -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-RxSwift/Pods-FunctionalReactiveAwesome-RxSwift-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_FunctionalReactiveAwesome_RxSwift : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_FunctionalReactiveAwesome_RxSwift 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-RxSwift/Pods-FunctionalReactiveAwesome-RxSwift-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | #import "Pods-FunctionalReactiveAwesome-environment.h" 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-RxSwift/Pods-FunctionalReactiveAwesome-RxSwift-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double RxSwiftVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char RxSwiftVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-RxSwift/Pods-FunctionalReactiveAwesome-RxSwift.modulemap: -------------------------------------------------------------------------------- 1 | framework module RxSwift { 2 | umbrella header "Pods-FunctionalReactiveAwesome-RxSwift-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-RxSwift/Pods-FunctionalReactiveAwesome-RxSwift.xcconfig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashfurrow/FunctionalReactiveAwesome/b9166f3c4c89ba055fb729b2fd7f928353f8e4f9/Pods/Target Support Files/Pods-FunctionalReactiveAwesome-RxSwift/Pods-FunctionalReactiveAwesome-RxSwift.xcconfig -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-SVProgressHUD/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.1.3 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-SVProgressHUD/Pods-FunctionalReactiveAwesome-SVProgressHUD-Private.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods-FunctionalReactiveAwesome-SVProgressHUD.xcconfig" 2 | CONFIGURATION_BUILD_DIR = $PODS_FRAMEWORK_BUILD_PATH 3 | FRAMEWORK_SEARCH_PATHS = "$PODS_FRAMEWORK_BUILD_PATH" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/SVProgressHUD" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Alamofire" "${PODS_ROOT}/Headers/Public/Moya" "${PODS_ROOT}/Headers/Public/RxCocoa" "${PODS_ROOT}/Headers/Public/RxSwift" "${PODS_ROOT}/Headers/Public/SVProgressHUD" 6 | OTHER_LDFLAGS = ${PODS_FUNCTIONALREACTIVEAWESOME_SVPROGRESSHUD_OTHER_LDFLAGS} -ObjC 7 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-FunctionalReactiveAwesome 8 | PODS_ROOT = ${SRCROOT} 9 | SKIP_INSTALL = YES -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-SVProgressHUD/Pods-FunctionalReactiveAwesome-SVProgressHUD-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_FunctionalReactiveAwesome_SVProgressHUD : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_FunctionalReactiveAwesome_SVProgressHUD 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-SVProgressHUD/Pods-FunctionalReactiveAwesome-SVProgressHUD-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | #import "Pods-FunctionalReactiveAwesome-environment.h" 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-SVProgressHUD/Pods-FunctionalReactiveAwesome-SVProgressHUD-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "SVIndefiniteAnimatedView.h" 4 | #import "SVProgressHUD.h" 5 | 6 | FOUNDATION_EXPORT double SVProgressHUDVersionNumber; 7 | FOUNDATION_EXPORT const unsigned char SVProgressHUDVersionString[]; 8 | 9 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-SVProgressHUD/Pods-FunctionalReactiveAwesome-SVProgressHUD.modulemap: -------------------------------------------------------------------------------- 1 | framework module SVProgressHUD { 2 | umbrella header "Pods-FunctionalReactiveAwesome-SVProgressHUD-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome-SVProgressHUD/Pods-FunctionalReactiveAwesome-SVProgressHUD.xcconfig: -------------------------------------------------------------------------------- 1 | PODS_FUNCTIONALREACTIVEAWESOME_SVPROGRESSHUD_OTHER_LDFLAGS = -framework "QuartzCore" -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome/Pods-FunctionalReactiveAwesome-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_FunctionalReactiveAwesome : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_FunctionalReactiveAwesome 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome/Pods-FunctionalReactiveAwesome-environment.h: -------------------------------------------------------------------------------- 1 | 2 | // To check if a library is compiled with CocoaPods you 3 | // can use the `COCOAPODS` macro definition which is 4 | // defined in the xcconfigs so it is available in 5 | // headers also when they are imported in the client 6 | // project. 7 | 8 | 9 | // Alamofire 10 | #define COCOAPODS_POD_AVAILABLE_Alamofire 11 | #define COCOAPODS_VERSION_MAJOR_Alamofire 1 12 | #define COCOAPODS_VERSION_MINOR_Alamofire 2 13 | #define COCOAPODS_VERSION_PATCH_Alamofire 2 14 | 15 | // Moya/Core 16 | #define COCOAPODS_POD_AVAILABLE_Moya_Core 17 | #define COCOAPODS_VERSION_MAJOR_Moya_Core 1 18 | #define COCOAPODS_VERSION_MINOR_Moya_Core 1 19 | #define COCOAPODS_VERSION_PATCH_Moya_Core 1 20 | 21 | // Moya/ReactiveCore 22 | #define COCOAPODS_POD_AVAILABLE_Moya_ReactiveCore 23 | #define COCOAPODS_VERSION_MAJOR_Moya_ReactiveCore 1 24 | #define COCOAPODS_VERSION_MINOR_Moya_ReactiveCore 1 25 | #define COCOAPODS_VERSION_PATCH_Moya_ReactiveCore 1 26 | 27 | // Moya/RxSwift 28 | #define COCOAPODS_POD_AVAILABLE_Moya_RxSwift 29 | #define COCOAPODS_VERSION_MAJOR_Moya_RxSwift 1 30 | #define COCOAPODS_VERSION_MINOR_Moya_RxSwift 1 31 | #define COCOAPODS_VERSION_PATCH_Moya_RxSwift 1 32 | 33 | // RxCocoa 34 | #define COCOAPODS_POD_AVAILABLE_RxCocoa 35 | #define COCOAPODS_VERSION_MAJOR_RxCocoa 1 36 | #define COCOAPODS_VERSION_MINOR_RxCocoa 5 37 | #define COCOAPODS_VERSION_PATCH_RxCocoa 0 38 | 39 | // RxSwift 40 | #define COCOAPODS_POD_AVAILABLE_RxSwift 41 | #define COCOAPODS_VERSION_MAJOR_RxSwift 1 42 | #define COCOAPODS_VERSION_MINOR_RxSwift 4 43 | #define COCOAPODS_VERSION_PATCH_RxSwift 0 44 | 45 | // SVProgressHUD 46 | #define COCOAPODS_POD_AVAILABLE_SVProgressHUD 47 | #define COCOAPODS_VERSION_MAJOR_SVProgressHUD 1 48 | #define COCOAPODS_VERSION_MINOR_SVProgressHUD 1 49 | #define COCOAPODS_VERSION_PATCH_SVProgressHUD 3 50 | 51 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome/Pods-FunctionalReactiveAwesome-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 5 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 6 | 7 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 8 | 9 | install_framework() 10 | { 11 | local source="${BUILT_PRODUCTS_DIR}/Pods-FunctionalReactiveAwesome/$1" 12 | local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 13 | 14 | if [ -L "${source}" ]; then 15 | echo "Symlinked..." 16 | source=$(readlink "${source}") 17 | fi 18 | 19 | # use filter instead of exclude so missing patterns dont' throw errors 20 | echo "rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers/" --filter "- PrivateHeaders/" --filter "- Modules/" ${source} ${destination}" 21 | rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers/" --filter "- PrivateHeaders/" --filter "- Modules/" "${source}" "${destination}" 22 | # Resign the code if required by the build settings to avoid unstable apps 23 | if [ "${CODE_SIGNING_REQUIRED}" == "YES" ]; then 24 | code_sign "${destination}/$1" 25 | fi 26 | 27 | # Embed linked Swift runtime libraries 28 | local basename 29 | basename=$(echo $1 | sed -E s/\\..+// && exit ${PIPESTATUS[0]}) 30 | local swift_runtime_libs 31 | swift_runtime_libs=$(xcrun otool -LX "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/$1/${basename}" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 32 | for lib in $swift_runtime_libs; do 33 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 34 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 35 | if [ "${CODE_SIGNING_REQUIRED}" == "YES" ]; then 36 | code_sign "${destination}/${lib}" 37 | fi 38 | done 39 | } 40 | 41 | # Signs a framework with the provided identity 42 | code_sign() { 43 | # Use the current code_sign_identitiy 44 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 45 | echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements $1" 46 | /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" 47 | } 48 | 49 | 50 | if [[ "$CONFIGURATION" == "Debug" ]]; then 51 | install_framework 'Alamofire.framework' 52 | install_framework 'Moya.framework' 53 | install_framework 'RxCocoa.framework' 54 | install_framework 'RxSwift.framework' 55 | install_framework 'SVProgressHUD.framework' 56 | fi 57 | if [[ "$CONFIGURATION" == "Release" ]]; then 58 | install_framework 'Alamofire.framework' 59 | install_framework 'Moya.framework' 60 | install_framework 'RxCocoa.framework' 61 | install_framework 'RxSwift.framework' 62 | install_framework 'SVProgressHUD.framework' 63 | fi 64 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome/Pods-FunctionalReactiveAwesome-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double Pods_FunctionalReactiveAwesomeVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char Pods_FunctionalReactiveAwesomeVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome/Pods-FunctionalReactiveAwesome.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_FRAMEWORK_BUILD_PATH" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_FRAMEWORK_BUILD_PATH/Alamofire.framework/Headers" -iquote "$PODS_FRAMEWORK_BUILD_PATH/Moya.framework/Headers" -iquote "$PODS_FRAMEWORK_BUILD_PATH/RxCocoa.framework/Headers" -iquote "$PODS_FRAMEWORK_BUILD_PATH/RxSwift.framework/Headers" -iquote "$PODS_FRAMEWORK_BUILD_PATH/SVProgressHUD.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -ObjC -framework "Alamofire" -framework "Moya" -framework "RxCocoa" -framework "RxSwift" -framework "SVProgressHUD" 6 | OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-FunctionalReactiveAwesome 9 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome/Pods-FunctionalReactiveAwesome.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_FunctionalReactiveAwesome { 2 | umbrella header "Pods-FunctionalReactiveAwesome-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-FunctionalReactiveAwesome/Pods-FunctionalReactiveAwesome.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_FRAMEWORK_BUILD_PATH" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_FRAMEWORK_BUILD_PATH/Alamofire.framework/Headers" -iquote "$PODS_FRAMEWORK_BUILD_PATH/Moya.framework/Headers" -iquote "$PODS_FRAMEWORK_BUILD_PATH/RxCocoa.framework/Headers" -iquote "$PODS_FRAMEWORK_BUILD_PATH/RxSwift.framework/Headers" -iquote "$PODS_FRAMEWORK_BUILD_PATH/SVProgressHUD.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -ObjC -framework "Alamofire" -framework "Moya" -framework "RxCocoa" -framework "RxSwift" -framework "SVProgressHUD" 6 | OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-FunctionalReactiveAwesome 9 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FunctionalReactiveAwesome 2 | 3 | Here's my sample code from my AltConf 2015 talk, titled "[Functional Reactive Awesome](https://speakerdeck.com/ashfurrow/functional-reactive-awesome)". It discusses the benefits of functional reactive programming in the context of Swift using a still-nascent FRP framework. 4 | 5 | The goal here is that you pay attention to the _ideas_ and not the implementation. Who cares about implementation – you can figure that out once you understand the importance of it. 6 | 7 | Pay attention to the "View Controllers" group in the Xcode project. 8 | 9 | Ignore everything else. It _does not matter_. 10 | 11 | The point is you see how cool writing code in functional reactive programming can be. Once you understand how powerful signals, transformations, and bindings can be, you can start to explore how to build these things yourself. 12 | 13 | ![Screenshot](/web/screenshot.png) 14 | 15 | ## Instructions 16 | 17 | Download the repo. The Pods are included, so you just need to open the workspace. 18 | 19 | ## Requirements 20 | 21 | - Xcode 6.3 22 | - Swift 1.2 23 | - A sense of adventure 24 | 25 | ## License 26 | 27 | Go wild. 28 | -------------------------------------------------------------------------------- /podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '6.0' 3 | 4 | use_frameworks! 5 | 6 | target 'FunctionalReactiveAwesome' do 7 | 8 | pod 'RxCocoa' 9 | pod 'RxSwift' 10 | pod 'Moya/RxSwift' 11 | pod 'SVProgressHUD' 12 | 13 | end 14 | -------------------------------------------------------------------------------- /web/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ashfurrow/FunctionalReactiveAwesome/b9166f3c4c89ba055fb729b2fd7f928353f8e4f9/web/screenshot.png --------------------------------------------------------------------------------