├── .github
└── workflows
│ └── CI.yml
├── .gitignore
├── LICENSE
├── MVVMWithRxSwift.xcodeproj
├── project.pbxproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── xcshareddata
│ └── xcschemes
│ └── MVVMWithRxSwift.xcscheme
├── MVVMWithRxSwift.xcworkspace
├── contents.xcworkspacedata
└── xcshareddata
│ └── IDEWorkspaceChecks.plist
├── MVVMWithRxSwift
├── AppDelegate.swift
├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ └── Contents.json
│ └── Contents.json
├── Base.lproj
│ └── LaunchScreen.storyboard
├── Info.plist
└── Payment
│ ├── API
│ └── RandomSuggestionsService.swift
│ ├── Domain
│ ├── Suggestion.swift
│ └── SuggestionsService.swift
│ └── Form
│ ├── Presentation
│ ├── CellViewModel.swift
│ ├── FieldViewModel.swift
│ ├── PaymentFormViewModel.swift
│ └── SuggestionViewModel.swift
│ └── UI
│ ├── FieldCell.swift
│ └── PaymentFormViewController.swift
├── MVVMWithRxSwiftTests
├── AppDelegateTests.swift
├── Info.plist
└── Payment
│ ├── Form
│ ├── Presentation
│ │ ├── CellViewModelTests.swift
│ │ ├── FieldViewModelTests.swift
│ │ ├── PaymentFormViewModelTests.swift
│ │ └── SuggestionViewModelTests.swift
│ └── UI
│ │ ├── FieldCellTests.swift
│ │ └── PaymentFormViewControllerIntegrationTests.swift
│ └── Helpers
│ ├── SuggestionViewModel+TestHelpers.swift
│ └── SuggestionsServiceStub.swift
├── Podfile
├── Podfile.lock
├── Pods
├── Differentiator
│ ├── LICENSE.md
│ ├── README.md
│ └── Sources
│ │ └── Differentiator
│ │ ├── AnimatableSectionModel.swift
│ │ ├── AnimatableSectionModelType+ItemPath.swift
│ │ ├── AnimatableSectionModelType.swift
│ │ ├── Changeset.swift
│ │ ├── Diff.swift
│ │ ├── IdentifiableType.swift
│ │ ├── IdentifiableValue.swift
│ │ ├── ItemPath.swift
│ │ ├── Optional+Extensions.swift
│ │ ├── SectionModel.swift
│ │ ├── SectionModelType.swift
│ │ └── Utilities.swift
├── Manifest.lock
├── Pods.xcodeproj
│ └── project.pbxproj
├── RxCocoa
│ ├── LICENSE.md
│ ├── Platform
│ │ ├── DataStructures
│ │ │ ├── Bag.swift
│ │ │ ├── InfiniteSequence.swift
│ │ │ ├── PriorityQueue.swift
│ │ │ └── Queue.swift
│ │ ├── DispatchQueue+Extensions.swift
│ │ ├── Platform.Darwin.swift
│ │ ├── Platform.Linux.swift
│ │ └── RecursiveLock.swift
│ ├── README.md
│ └── RxCocoa
│ │ ├── Common
│ │ ├── ControlTarget.swift
│ │ ├── DelegateProxy.swift
│ │ ├── DelegateProxyType.swift
│ │ ├── Infallible+Bind.swift
│ │ ├── Observable+Bind.swift
│ │ ├── RxCocoaObjCRuntimeError+Extensions.swift
│ │ ├── RxTarget.swift
│ │ ├── SectionedViewDataSourceType.swift
│ │ └── TextInput.swift
│ │ ├── Foundation
│ │ ├── KVORepresentable+CoreGraphics.swift
│ │ ├── KVORepresentable+Swift.swift
│ │ ├── KVORepresentable.swift
│ │ ├── NSObject+Rx+KVORepresentable.swift
│ │ ├── NSObject+Rx+RawRepresentable.swift
│ │ ├── NSObject+Rx.swift
│ │ ├── NotificationCenter+Rx.swift
│ │ └── URLSession+Rx.swift
│ │ ├── Runtime
│ │ ├── _RX.m
│ │ ├── _RXDelegateProxy.m
│ │ ├── _RXKVOObserver.m
│ │ ├── _RXObjCRuntime.m
│ │ └── include
│ │ │ ├── RxCocoaRuntime.h
│ │ │ ├── _RX.h
│ │ │ ├── _RXDelegateProxy.h
│ │ │ ├── _RXKVOObserver.h
│ │ │ └── _RXObjCRuntime.h
│ │ ├── RxCocoa.h
│ │ ├── RxCocoa.swift
│ │ ├── Traits
│ │ ├── ControlEvent.swift
│ │ ├── ControlProperty.swift
│ │ ├── Driver
│ │ │ ├── BehaviorRelay+Driver.swift
│ │ │ ├── ControlEvent+Driver.swift
│ │ │ ├── ControlProperty+Driver.swift
│ │ │ ├── Driver+Subscription.swift
│ │ │ ├── Driver.swift
│ │ │ └── ObservableConvertibleType+Driver.swift
│ │ ├── SharedSequence
│ │ │ ├── ObservableConvertibleType+SharedSequence.swift
│ │ │ ├── SchedulerType+SharedSequence.swift
│ │ │ ├── SharedSequence+Operators+arity.swift
│ │ │ ├── SharedSequence+Operators.swift
│ │ │ └── SharedSequence.swift
│ │ └── Signal
│ │ │ ├── ControlEvent+Signal.swift
│ │ │ ├── ObservableConvertibleType+Signal.swift
│ │ │ ├── PublishRelay+Signal.swift
│ │ │ ├── Signal+Subscription.swift
│ │ │ └── Signal.swift
│ │ ├── iOS
│ │ ├── DataSources
│ │ │ ├── RxCollectionViewReactiveArrayDataSource.swift
│ │ │ ├── RxPickerViewAdapter.swift
│ │ │ └── RxTableViewReactiveArrayDataSource.swift
│ │ ├── Events
│ │ │ └── ItemEvents.swift
│ │ ├── NSTextStorage+Rx.swift
│ │ ├── Protocols
│ │ │ ├── RxCollectionViewDataSourceType.swift
│ │ │ ├── RxPickerViewDataSourceType.swift
│ │ │ └── RxTableViewDataSourceType.swift
│ │ ├── Proxies
│ │ │ ├── RxCollectionViewDataSourcePrefetchingProxy.swift
│ │ │ ├── RxCollectionViewDataSourceProxy.swift
│ │ │ ├── RxCollectionViewDelegateProxy.swift
│ │ │ ├── RxNavigationControllerDelegateProxy.swift
│ │ │ ├── RxPickerViewDataSourceProxy.swift
│ │ │ ├── RxPickerViewDelegateProxy.swift
│ │ │ ├── RxScrollViewDelegateProxy.swift
│ │ │ ├── RxSearchBarDelegateProxy.swift
│ │ │ ├── RxSearchControllerDelegateProxy.swift
│ │ │ ├── RxTabBarControllerDelegateProxy.swift
│ │ │ ├── RxTabBarDelegateProxy.swift
│ │ │ ├── RxTableViewDataSourcePrefetchingProxy.swift
│ │ │ ├── RxTableViewDataSourceProxy.swift
│ │ │ ├── RxTableViewDelegateProxy.swift
│ │ │ ├── RxTextStorageDelegateProxy.swift
│ │ │ ├── RxTextViewDelegateProxy.swift
│ │ │ └── RxWKNavigationDelegateProxy.swift
│ │ ├── UIActivityIndicatorView+Rx.swift
│ │ ├── UIApplication+Rx.swift
│ │ ├── UIBarButtonItem+Rx.swift
│ │ ├── UIButton+Rx.swift
│ │ ├── UICollectionView+Rx.swift
│ │ ├── UIControl+Rx.swift
│ │ ├── UIDatePicker+Rx.swift
│ │ ├── UIGestureRecognizer+Rx.swift
│ │ ├── UINavigationController+Rx.swift
│ │ ├── UIPickerView+Rx.swift
│ │ ├── UIRefreshControl+Rx.swift
│ │ ├── UIScrollView+Rx.swift
│ │ ├── UISearchBar+Rx.swift
│ │ ├── UISearchController+Rx.swift
│ │ ├── UISegmentedControl+Rx.swift
│ │ ├── UISlider+Rx.swift
│ │ ├── UIStepper+Rx.swift
│ │ ├── UISwitch+Rx.swift
│ │ ├── UITabBar+Rx.swift
│ │ ├── UITabBarController+Rx.swift
│ │ ├── UITableView+Rx.swift
│ │ ├── UITextField+Rx.swift
│ │ ├── UITextView+Rx.swift
│ │ └── WKWebView+Rx.swift
│ │ └── macOS
│ │ ├── NSButton+Rx.swift
│ │ ├── NSControl+Rx.swift
│ │ ├── NSSlider+Rx.swift
│ │ ├── NSTextField+Rx.swift
│ │ ├── NSTextView+Rx.swift
│ │ └── NSView+Rx.swift
├── RxDataSources
│ ├── LICENSE.md
│ ├── README.md
│ └── Sources
│ │ └── RxDataSources
│ │ ├── AnimationConfiguration.swift
│ │ ├── Array+Extensions.swift
│ │ ├── CollectionViewSectionedDataSource.swift
│ │ ├── DataSources.swift
│ │ ├── Deprecated.swift
│ │ ├── FloatingPointType+IdentifiableType.swift
│ │ ├── IntegerType+IdentifiableType.swift
│ │ ├── RxCollectionViewSectionedAnimatedDataSource.swift
│ │ ├── RxCollectionViewSectionedReloadDataSource.swift
│ │ ├── RxPickerViewAdapter.swift
│ │ ├── RxTableViewSectionedAnimatedDataSource.swift
│ │ ├── RxTableViewSectionedReloadDataSource.swift
│ │ ├── String+IdentifiableType.swift
│ │ ├── TableViewSectionedDataSource.swift
│ │ ├── UI+SectionedViewType.swift
│ │ └── ViewTransition.swift
├── RxRelay
│ ├── LICENSE.md
│ ├── README.md
│ └── RxRelay
│ │ ├── BehaviorRelay.swift
│ │ ├── Observable+Bind.swift
│ │ ├── PublishRelay.swift
│ │ ├── ReplayRelay.swift
│ │ └── Utils.swift
├── RxSwift
│ ├── LICENSE.md
│ ├── Platform
│ │ ├── AtomicInt.swift
│ │ ├── DataStructures
│ │ │ ├── Bag.swift
│ │ │ ├── InfiniteSequence.swift
│ │ │ ├── PriorityQueue.swift
│ │ │ └── Queue.swift
│ │ ├── DispatchQueue+Extensions.swift
│ │ ├── Platform.Darwin.swift
│ │ ├── Platform.Linux.swift
│ │ └── RecursiveLock.swift
│ ├── README.md
│ └── RxSwift
│ │ ├── AnyObserver.swift
│ │ ├── Binder.swift
│ │ ├── Cancelable.swift
│ │ ├── Concurrency
│ │ ├── AsyncLock.swift
│ │ ├── Lock.swift
│ │ ├── LockOwnerType.swift
│ │ ├── SynchronizedDisposeType.swift
│ │ ├── SynchronizedOnType.swift
│ │ └── SynchronizedUnsubscribeType.swift
│ │ ├── ConnectableObservableType.swift
│ │ ├── Date+Dispatch.swift
│ │ ├── Disposable.swift
│ │ ├── Disposables
│ │ ├── AnonymousDisposable.swift
│ │ ├── BinaryDisposable.swift
│ │ ├── BooleanDisposable.swift
│ │ ├── CompositeDisposable.swift
│ │ ├── Disposables.swift
│ │ ├── DisposeBag.swift
│ │ ├── DisposeBase.swift
│ │ ├── NopDisposable.swift
│ │ ├── RefCountDisposable.swift
│ │ ├── ScheduledDisposable.swift
│ │ ├── SerialDisposable.swift
│ │ ├── SingleAssignmentDisposable.swift
│ │ └── SubscriptionDisposable.swift
│ │ ├── Errors.swift
│ │ ├── Event.swift
│ │ ├── Extensions
│ │ └── Bag+Rx.swift
│ │ ├── GroupedObservable.swift
│ │ ├── ImmediateSchedulerType.swift
│ │ ├── Observable.swift
│ │ ├── ObservableConvertibleType.swift
│ │ ├── ObservableType+Extensions.swift
│ │ ├── ObservableType.swift
│ │ ├── Observables
│ │ ├── AddRef.swift
│ │ ├── Amb.swift
│ │ ├── AsMaybe.swift
│ │ ├── AsSingle.swift
│ │ ├── Buffer.swift
│ │ ├── Catch.swift
│ │ ├── CombineLatest+Collection.swift
│ │ ├── CombineLatest+arity.swift
│ │ ├── CombineLatest.swift
│ │ ├── CompactMap.swift
│ │ ├── Concat.swift
│ │ ├── Create.swift
│ │ ├── Debounce.swift
│ │ ├── Debug.swift
│ │ ├── Decode.swift
│ │ ├── DefaultIfEmpty.swift
│ │ ├── Deferred.swift
│ │ ├── Delay.swift
│ │ ├── DelaySubscription.swift
│ │ ├── Dematerialize.swift
│ │ ├── DistinctUntilChanged.swift
│ │ ├── Do.swift
│ │ ├── ElementAt.swift
│ │ ├── Empty.swift
│ │ ├── Enumerated.swift
│ │ ├── Error.swift
│ │ ├── Filter.swift
│ │ ├── First.swift
│ │ ├── Generate.swift
│ │ ├── GroupBy.swift
│ │ ├── Just.swift
│ │ ├── Map.swift
│ │ ├── Materialize.swift
│ │ ├── Merge.swift
│ │ ├── Multicast.swift
│ │ ├── Never.swift
│ │ ├── ObserveOn.swift
│ │ ├── Optional.swift
│ │ ├── Producer.swift
│ │ ├── Range.swift
│ │ ├── Reduce.swift
│ │ ├── Repeat.swift
│ │ ├── RetryWhen.swift
│ │ ├── Sample.swift
│ │ ├── Scan.swift
│ │ ├── Sequence.swift
│ │ ├── ShareReplayScope.swift
│ │ ├── SingleAsync.swift
│ │ ├── Sink.swift
│ │ ├── Skip.swift
│ │ ├── SkipUntil.swift
│ │ ├── SkipWhile.swift
│ │ ├── StartWith.swift
│ │ ├── SubscribeOn.swift
│ │ ├── Switch.swift
│ │ ├── SwitchIfEmpty.swift
│ │ ├── Take.swift
│ │ ├── TakeLast.swift
│ │ ├── TakeWithPredicate.swift
│ │ ├── Throttle.swift
│ │ ├── Timeout.swift
│ │ ├── Timer.swift
│ │ ├── ToArray.swift
│ │ ├── Using.swift
│ │ ├── Window.swift
│ │ ├── WithLatestFrom.swift
│ │ ├── WithUnretained.swift
│ │ ├── Zip+Collection.swift
│ │ ├── Zip+arity.swift
│ │ └── Zip.swift
│ │ ├── ObserverType.swift
│ │ ├── Observers
│ │ ├── AnonymousObserver.swift
│ │ ├── ObserverBase.swift
│ │ └── TailRecursiveSink.swift
│ │ ├── Reactive.swift
│ │ ├── Rx.swift
│ │ ├── RxMutableBox.swift
│ │ ├── SchedulerType.swift
│ │ ├── Schedulers
│ │ ├── ConcurrentDispatchQueueScheduler.swift
│ │ ├── ConcurrentMainScheduler.swift
│ │ ├── CurrentThreadScheduler.swift
│ │ ├── HistoricalScheduler.swift
│ │ ├── HistoricalSchedulerTimeConverter.swift
│ │ ├── Internal
│ │ │ ├── DispatchQueueConfiguration.swift
│ │ │ ├── InvocableScheduledItem.swift
│ │ │ ├── InvocableType.swift
│ │ │ ├── ScheduledItem.swift
│ │ │ └── ScheduledItemType.swift
│ │ ├── MainScheduler.swift
│ │ ├── OperationQueueScheduler.swift
│ │ ├── RecursiveScheduler.swift
│ │ ├── SchedulerServices+Emulation.swift
│ │ ├── SerialDispatchQueueScheduler.swift
│ │ ├── VirtualTimeConverterType.swift
│ │ └── VirtualTimeScheduler.swift
│ │ ├── Subjects
│ │ ├── AsyncSubject.swift
│ │ ├── BehaviorSubject.swift
│ │ ├── PublishSubject.swift
│ │ ├── ReplaySubject.swift
│ │ └── SubjectType.swift
│ │ ├── SwiftSupport
│ │ └── SwiftSupport.swift
│ │ └── Traits
│ │ ├── Infallible
│ │ ├── Infallible+CombineLatest+arity.swift
│ │ ├── Infallible+Create.swift
│ │ ├── Infallible+Operators.swift
│ │ ├── Infallible+Zip+arity.swift
│ │ ├── Infallible.swift
│ │ └── ObservableConvertibleType+Infallible.swift
│ │ └── PrimitiveSequence
│ │ ├── Completable+AndThen.swift
│ │ ├── Completable.swift
│ │ ├── Maybe.swift
│ │ ├── ObservableType+PrimitiveSequence.swift
│ │ ├── PrimitiveSequence+Zip+arity.swift
│ │ ├── PrimitiveSequence.swift
│ │ └── Single.swift
└── Target Support Files
│ ├── Differentiator
│ ├── Differentiator-Info.plist
│ ├── Differentiator-dummy.m
│ ├── Differentiator-prefix.pch
│ ├── Differentiator-umbrella.h
│ ├── Differentiator.debug.xcconfig
│ ├── Differentiator.modulemap
│ └── Differentiator.release.xcconfig
│ ├── Pods-MVVMWithRxSwift
│ ├── Pods-MVVMWithRxSwift-Info.plist
│ ├── Pods-MVVMWithRxSwift-acknowledgements.markdown
│ ├── Pods-MVVMWithRxSwift-acknowledgements.plist
│ ├── Pods-MVVMWithRxSwift-dummy.m
│ ├── Pods-MVVMWithRxSwift-frameworks-Debug-input-files.xcfilelist
│ ├── Pods-MVVMWithRxSwift-frameworks-Debug-output-files.xcfilelist
│ ├── Pods-MVVMWithRxSwift-frameworks-Release-input-files.xcfilelist
│ ├── Pods-MVVMWithRxSwift-frameworks-Release-output-files.xcfilelist
│ ├── Pods-MVVMWithRxSwift-frameworks.sh
│ ├── Pods-MVVMWithRxSwift-umbrella.h
│ ├── Pods-MVVMWithRxSwift.debug.xcconfig
│ ├── Pods-MVVMWithRxSwift.modulemap
│ └── Pods-MVVMWithRxSwift.release.xcconfig
│ ├── Pods-MVVMWithRxSwiftTests
│ ├── Pods-MVVMWithRxSwiftTests-Info.plist
│ ├── Pods-MVVMWithRxSwiftTests-acknowledgements.markdown
│ ├── Pods-MVVMWithRxSwiftTests-acknowledgements.plist
│ ├── Pods-MVVMWithRxSwiftTests-dummy.m
│ ├── Pods-MVVMWithRxSwiftTests-umbrella.h
│ ├── Pods-MVVMWithRxSwiftTests.debug.xcconfig
│ ├── Pods-MVVMWithRxSwiftTests.modulemap
│ └── Pods-MVVMWithRxSwiftTests.release.xcconfig
│ ├── RxCocoa
│ ├── RxCocoa-Info.plist
│ ├── RxCocoa-dummy.m
│ ├── RxCocoa-prefix.pch
│ ├── RxCocoa-umbrella.h
│ ├── RxCocoa.debug.xcconfig
│ ├── RxCocoa.modulemap
│ └── RxCocoa.release.xcconfig
│ ├── RxDataSources
│ ├── RxDataSources-Info.plist
│ ├── RxDataSources-dummy.m
│ ├── RxDataSources-prefix.pch
│ ├── RxDataSources-umbrella.h
│ ├── RxDataSources.debug.xcconfig
│ ├── RxDataSources.modulemap
│ └── RxDataSources.release.xcconfig
│ ├── RxRelay
│ ├── RxRelay-Info.plist
│ ├── RxRelay-dummy.m
│ ├── RxRelay-prefix.pch
│ ├── RxRelay-umbrella.h
│ ├── RxRelay.debug.xcconfig
│ ├── RxRelay.modulemap
│ └── RxRelay.release.xcconfig
│ └── RxSwift
│ ├── RxSwift-Info.plist
│ ├── RxSwift-dummy.m
│ ├── RxSwift-prefix.pch
│ ├── RxSwift-umbrella.h
│ ├── RxSwift.debug.xcconfig
│ ├── RxSwift.modulemap
│ └── RxSwift.release.xcconfig
└── README.md
/.github/workflows/CI.yml:
--------------------------------------------------------------------------------
1 |
2 | name: CI
3 |
4 | # Controls when the action will run. Triggers the workflow on push or pull request
5 | # events but only for the master branch
6 | on:
7 | push:
8 | branches: [ master ]
9 | pull_request:
10 | branches: [ master ]
11 |
12 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel
13 | jobs:
14 | # This workflow contains a single job called "build"
15 | build-and-test:
16 | # The type of runner that the job will run on
17 | runs-on: macos-11
18 |
19 | timeout-minutes: 10
20 |
21 | # Steps represent a sequence of tasks that will be executed as part of the job
22 | steps:
23 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
24 | - uses: actions/checkout@v2
25 |
26 | - name: Select Xcode
27 | run: sudo xcode-select -switch /Applications/Xcode_12.5.1.app
28 |
29 | - name: Xcode version
30 | run: /usr/bin/xcodebuild -version
31 |
32 | - name: Build and Test
33 | run: xcodebuild clean build test -workspace MVVMWithRxSwift.xcworkspace -scheme "MVVMWithRxSwift" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO -sdk iphonesimulator -destination "platform=iOS Simulator,name=iPhone 12,OS=14.5" ONLY_ACTIVE_ARCH=YES
34 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4 |
5 | ## Build generated
6 | build/
7 | DerivedData/
8 |
9 | ## Various settings
10 | *.pbxuser
11 | !default.pbxuser
12 | *.mode1v3
13 | !default.mode1v3
14 | *.mode2v3
15 | !default.mode2v3
16 | *.perspectivev3
17 | !default.perspectivev3
18 | xcuserdata/
19 |
20 | ## Other
21 | *.moved-aside
22 | *.xccheckout
23 | *.xcscmblueprint
24 |
25 | ## Obj-C/Swift specific
26 | *.hmap
27 | *.ipa
28 | *.dSYM.zip
29 | *.dSYM
30 | *.DS_Store
31 |
32 | ## Playgrounds
33 | timeline.xctimeline
34 | playground.xcworkspace
35 |
36 | # Swift Package Manager
37 | #
38 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
39 | # Packages/
40 | # Package.pins
41 | .build/
42 |
43 | # CocoaPods
44 | #
45 | # We recommend against adding the Pods directory to your .gitignore. However
46 | # you should judge for yourself, the pros and cons are mentioned at:
47 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
48 | #
49 | #Pods/
50 |
51 | # Carthage
52 | #
53 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
54 | # Carthage/Checkouts
55 |
56 | Carthage/Build
57 |
58 | # fastlane
59 | #
60 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
61 | # screenshots whenever they are needed.
62 | # For more information about the recommended setup visit:
63 | # https://docs.fastlane.tools/best-practices/source-control/#source-control
64 |
65 | \.idea/
66 |
67 | fastlane/swift/
68 |
69 | fastlane/FastlaneRunner
70 |
71 | fastlane/report\.xml
72 |
73 | screenshots/
74 |
75 | *.icloud
76 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Essential Developer
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 |
--------------------------------------------------------------------------------
/MVVMWithRxSwift.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/MVVMWithRxSwift.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/MVVMWithRxSwift.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/MVVMWithRxSwift.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/MVVMWithRxSwift/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Copyright © 2020 Essential Developer Ltd. All rights reserved.
3 | //
4 |
5 | import UIKit
6 | import RxSwift
7 |
8 | @UIApplicationMain
9 | class AppDelegate: UIResponder, UIApplicationDelegate {
10 | var window: UIWindow?
11 |
12 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
13 |
14 | showPaymentForm()
15 |
16 | return true
17 | }
18 |
19 | private func showPaymentForm() {
20 | let vm = PaymentFormViewModel(service: RandomSuggestionsService())
21 | let vc = PaymentFormViewController(viewModel: vm)
22 |
23 | window = UIWindow(frame: UIScreen.main.bounds)
24 | window?.rootViewController = UINavigationController(rootViewController: vc)
25 | window?.makeKeyAndVisible()
26 | }
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/MVVMWithRxSwift/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "scale" : "2x",
6 | "size" : "20x20"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "scale" : "3x",
11 | "size" : "20x20"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "scale" : "2x",
16 | "size" : "29x29"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "scale" : "3x",
21 | "size" : "29x29"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "scale" : "2x",
26 | "size" : "40x40"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "scale" : "3x",
31 | "size" : "40x40"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "scale" : "2x",
36 | "size" : "60x60"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "scale" : "3x",
41 | "size" : "60x60"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "scale" : "1x",
46 | "size" : "20x20"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "scale" : "2x",
51 | "size" : "20x20"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "scale" : "1x",
56 | "size" : "29x29"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "scale" : "2x",
61 | "size" : "29x29"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "scale" : "1x",
66 | "size" : "40x40"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "scale" : "2x",
71 | "size" : "40x40"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "scale" : "1x",
76 | "size" : "76x76"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "scale" : "2x",
81 | "size" : "76x76"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "scale" : "2x",
86 | "size" : "83.5x83.5"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "scale" : "1x",
91 | "size" : "1024x1024"
92 | }
93 | ],
94 | "info" : {
95 | "author" : "xcode",
96 | "version" : 1
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/MVVMWithRxSwift/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/MVVMWithRxSwift/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UILaunchStoryboardName
24 | LaunchScreen
25 | UIRequiredDeviceCapabilities
26 |
27 | armv7
28 |
29 | UISupportedInterfaceOrientations
30 |
31 | UIInterfaceOrientationPortrait
32 | UIInterfaceOrientationLandscapeLeft
33 | UIInterfaceOrientationLandscapeRight
34 |
35 | UISupportedInterfaceOrientations~ipad
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationPortraitUpsideDown
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/MVVMWithRxSwift/Payment/API/RandomSuggestionsService.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Copyright © 2020 Essential Developer Ltd. All rights reserved.
3 | //
4 |
5 | import RxSwift
6 |
7 | class RandomSuggestionsService: SuggestionsService {
8 | func perform(request: SuggestionsRequest) -> Single<[Suggestion]> {
9 | return .just((0...10).map { _ in
10 | Suggestion(
11 | iban: "\(Int.random(in: 10000...99999))",
12 | taxNumber: "\(Int.random(in: 10000...99999))")
13 | })
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/MVVMWithRxSwift/Payment/Domain/Suggestion.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Copyright © 2020 Essential Developer Ltd. All rights reserved.
3 | //
4 |
5 | public struct Suggestion: Equatable {
6 | public let iban: String?
7 | public let taxNumber: String?
8 |
9 | public init(iban: String?, taxNumber: String?) {
10 | self.iban = iban
11 | self.taxNumber = taxNumber
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/MVVMWithRxSwift/Payment/Domain/SuggestionsService.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Copyright © 2020 Essential Developer Ltd. All rights reserved.
3 | //
4 |
5 | import RxSwift
6 |
7 | public protocol SuggestionsService {
8 | func perform(request: SuggestionsRequest) -> Single<[Suggestion]>
9 | }
10 |
11 | public struct SuggestionsRequest {
12 | public let query: String
13 |
14 | public init(query: String) {
15 | self.query = query
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/MVVMWithRxSwift/Payment/Form/Presentation/CellViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Copyright © 2020 Essential Developer Ltd. All rights reserved.
3 | //
4 |
5 | import Differentiator
6 |
7 | public enum CellViewModel: Equatable {
8 | case field(FieldViewModel)
9 | case suggestion(SuggestionViewModel)
10 | }
11 |
12 | extension CellViewModel: IdentifiableType {
13 | public var identity: String {
14 | switch self {
15 | case let .field(vm): return vm.title
16 | case let .suggestion(vm): return vm.text
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/MVVMWithRxSwift/Payment/Form/Presentation/FieldViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Copyright © 2020 Essential Developer Ltd. All rights reserved.
3 | //
4 |
5 | import RxCocoa
6 | import Differentiator
7 |
8 | public struct FieldViewModel {
9 | public let title: String
10 | public let text = BehaviorRelay(value: "")
11 | public let focus = PublishRelay()
12 |
13 | public init(title: String = "") {
14 | self.title = title
15 | }
16 | }
17 |
18 | extension FieldViewModel: Equatable {
19 | public static func == (lhs: FieldViewModel, rhs: FieldViewModel) -> Bool {
20 | lhs.title == rhs.title && lhs.text.value == rhs.text.value
21 | }
22 | }
23 |
24 | extension FieldViewModel: IdentifiableType {
25 | public var identity: String { title }
26 | }
27 |
28 | extension FieldViewModel {
29 | public static func iban() -> FieldViewModel {
30 | return FieldViewModel(title: "IBAN")
31 | }
32 |
33 | public static func taxNumber() -> FieldViewModel {
34 | return FieldViewModel(title: "Tax number")
35 | }
36 |
37 | public static func bankName() -> FieldViewModel {
38 | return FieldViewModel(title: "Bank name")
39 | }
40 |
41 | public static func comment() -> FieldViewModel {
42 | return FieldViewModel(title: "Comment")
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/MVVMWithRxSwift/Payment/Form/Presentation/SuggestionViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Copyright © 2020 Essential Developer Ltd. All rights reserved.
3 | //
4 |
5 | import RxCocoa
6 | import Differentiator
7 |
8 | public struct SuggestionViewModel {
9 | public let text: String
10 | public let select: PublishRelay
11 |
12 | public init(_ suggestion: Suggestion, select: PublishRelay) {
13 | switch (suggestion.iban, suggestion.taxNumber) {
14 | case let (.some(iban), .some(taxNumber)):
15 | self.text = "Iban: \(iban) | Tax number: \(taxNumber)"
16 | case let (.none, .some(taxNumber)):
17 | self.text = "Tax number: \(taxNumber)"
18 | case let (.some(iban), .none):
19 | self.text = "Iban: \(iban)"
20 | default:
21 | self.text = ""
22 | }
23 | self.select = select
24 | }
25 | }
26 |
27 | extension SuggestionViewModel: Equatable {
28 | public static func == (lhs: SuggestionViewModel, rhs: SuggestionViewModel) -> Bool {
29 | lhs.text == rhs.text
30 | }
31 | }
32 |
33 | extension SuggestionViewModel: IdentifiableType {
34 | public var identity: String { text }
35 | }
36 |
--------------------------------------------------------------------------------
/MVVMWithRxSwiftTests/AppDelegateTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Copyright © 2020 Essential Developer Ltd. All rights reserved.
3 | //
4 |
5 | import XCTest
6 | @testable import MVVMWithRxSwift
7 |
8 | class AppDelegateTests: XCTestCase {
9 |
10 | func test_didFinishLaunchingWithOptions_setsWindowWithRootNavigationController() {
11 | let sut = AppDelegate()
12 | XCTAssertNil(sut.window)
13 |
14 | _ = sut.application(UIApplication.shared, didFinishLaunchingWithOptions: nil)
15 |
16 | XCTAssertNotNil(sut.window)
17 | XCTAssertTrue(sut.window?.rootViewController is UINavigationController)
18 | XCTAssertTrue(sut.window?.topViewController is PaymentFormViewController)
19 | }
20 |
21 | }
22 |
23 | private extension UIWindow {
24 | var topViewController: UIViewController? {
25 | (rootViewController as? UINavigationController)?.topViewController
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/MVVMWithRxSwiftTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/MVVMWithRxSwiftTests/Payment/Form/Presentation/CellViewModelTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Copyright © 2020 Essential Developer Ltd. All rights reserved.
3 | //
4 |
5 | import XCTest
6 | import MVVMWithRxSwift
7 |
8 | class CellViewModelTests: XCTestCase {
9 |
10 | func test_identity_isValueIdentity() {
11 | let field = FieldViewModel(title: "a title")
12 | let c1 = CellViewModel.field(field)
13 |
14 | let suggestion = SuggestionViewModel(Suggestion(iban: "111", taxNumber: "222"))
15 | let c2 = CellViewModel.suggestion(suggestion)
16 |
17 | XCTAssertEqual(c1.identity, field.identity)
18 | XCTAssertEqual(c2.identity, suggestion.identity)
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/MVVMWithRxSwiftTests/Payment/Form/Presentation/FieldViewModelTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Copyright © 2020 Essential Developer Ltd. All rights reserved.
3 | //
4 |
5 | import XCTest
6 | import MVVMWithRxSwift
7 |
8 | class FieldViewModelTests: XCTestCase {
9 |
10 | func test_isEqual_whenTitleAndTextMatches() {
11 | let f1 = FieldViewModel(title: "a title")
12 | let f2 = FieldViewModel(title: "another title")
13 |
14 | XCTAssertNotEqual(f1, f2)
15 | XCTAssertEqual(f1, f1)
16 |
17 | let f3 = FieldViewModel(title: "a title")
18 | f3.text.accept("a text")
19 |
20 | XCTAssertNotEqual(f1, f3)
21 | }
22 |
23 | func test_identity_isTitle() {
24 | let f1 = FieldViewModel(title: "a title")
25 | let f2 = FieldViewModel(title: "another title")
26 |
27 | XCTAssertEqual(f1.identity, f1.title)
28 | XCTAssertEqual(f2.identity, f2.title)
29 | }
30 |
31 | }
32 |
--------------------------------------------------------------------------------
/MVVMWithRxSwiftTests/Payment/Form/Presentation/SuggestionViewModelTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Copyright © 2020 Essential Developer Ltd. All rights reserved.
3 | //
4 |
5 | import XCTest
6 | import MVVMWithRxSwift
7 |
8 | class SuggestionViewModelTests: XCTestCase {
9 |
10 | func test_text_isBasedOnProvidedSuggestionValues() {
11 | let suggestion = Suggestion(iban: "123", taxNumber: "456")
12 |
13 | let sut = SuggestionViewModel(suggestion)
14 |
15 | XCTAssertEqual(sut.text, "Iban: 123 | Tax number: 456")
16 | }
17 |
18 | func test_textWithoutIban_isBasedOnProvidedSuggestionValues() {
19 | let suggestion = Suggestion(iban: nil, taxNumber: "456")
20 |
21 | let sut = SuggestionViewModel(suggestion)
22 |
23 | XCTAssertEqual(sut.text, "Tax number: 456")
24 | }
25 |
26 | func test_textWithoutTaxNumber_isBasedOnProvidedSuggestionValues() {
27 | let suggestion = Suggestion(iban: "123", taxNumber: nil)
28 |
29 | let sut = SuggestionViewModel(suggestion)
30 |
31 | XCTAssertEqual(sut.text, "Iban: 123")
32 | }
33 |
34 | func test_textWithoutIbanAndTaxNumber_isEmpty() {
35 | let suggestion = Suggestion(iban: nil, taxNumber: nil)
36 |
37 | let sut = SuggestionViewModel(suggestion)
38 |
39 | XCTAssertEqual(sut.text, "")
40 | }
41 |
42 | func test_isEqual_whenIbanAndTextMatches() {
43 | let s1 = SuggestionViewModel(Suggestion(iban: "111", taxNumber: "222"))
44 | let s2 = SuggestionViewModel(Suggestion(iban: "333", taxNumber: "444"))
45 |
46 | XCTAssertNotEqual(s1, s2)
47 | XCTAssertEqual(s1, s1)
48 | }
49 |
50 | func test_identity_isText() {
51 | let s1 = SuggestionViewModel(Suggestion(iban: "111", taxNumber: "222"))
52 | let s2 = SuggestionViewModel(Suggestion(iban: "333", taxNumber: "444"))
53 |
54 | XCTAssertEqual(s1.identity, s1.text)
55 | XCTAssertEqual(s2.identity, s2.text)
56 | }
57 |
58 | }
59 |
--------------------------------------------------------------------------------
/MVVMWithRxSwiftTests/Payment/Helpers/SuggestionViewModel+TestHelpers.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SuggestionViewModel+TestHelpers.swift
3 | // MVVMWithRxSwiftTests
4 | //
5 | // Created by Caio Zullo on 30/04/2020.
6 | // Copyright © 2020 Essential Developer Ltd. All rights reserved.
7 | //
8 |
9 | import RxCocoa
10 | import MVVMWithRxSwift
11 |
12 | extension SuggestionViewModel {
13 | init(_ suggestion: Suggestion) {
14 | self.init(suggestion, select: PublishRelay())
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/MVVMWithRxSwiftTests/Payment/Helpers/SuggestionsServiceStub.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Copyright © 2020 Essential Developer Ltd. All rights reserved.
3 | //
4 |
5 | import RxSwift
6 | import MVVMWithRxSwift
7 |
8 | class SuggestionsServiceStub: SuggestionsService {
9 | let stub = (query: "a query", suggestions: [
10 | Suggestion(iban: "111", taxNumber: "222"),
11 | Suggestion(iban: "333", taxNumber: "444")
12 | ])
13 |
14 | func perform(request: SuggestionsRequest) -> Single<[Suggestion]> {
15 | .just(request.query == stub.query ? stub.suggestions : [])
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Podfile:
--------------------------------------------------------------------------------
1 |
2 | platform :ios, '12.0'
3 | use_frameworks!
4 |
5 | target 'MVVMWithRxSwift' do
6 | pod 'RxSwift', '6.2.0'
7 | pod 'RxCocoa', '6.2.0'
8 | pod 'RxDataSources', '5.0.0'
9 |
10 | target 'MVVMWithRxSwiftTests' do
11 | inherit! :search_paths
12 | end
13 | end
14 |
15 | post_install do |installer|
16 | installer.pods_project.targets.each do |target|
17 | target.build_configurations.each do |config|
18 | config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
19 | end
20 | end
21 | end
22 |
--------------------------------------------------------------------------------
/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - Differentiator (5.0.0)
3 | - RxCocoa (6.2.0):
4 | - RxRelay (= 6.2.0)
5 | - RxSwift (= 6.2.0)
6 | - RxDataSources (5.0.0):
7 | - Differentiator (~> 5.0)
8 | - RxCocoa (~> 6.0)
9 | - RxSwift (~> 6.0)
10 | - RxRelay (6.2.0):
11 | - RxSwift (= 6.2.0)
12 | - RxSwift (6.2.0)
13 |
14 | DEPENDENCIES:
15 | - RxCocoa (= 6.2.0)
16 | - RxDataSources (= 5.0.0)
17 | - RxSwift (= 6.2.0)
18 |
19 | SPEC REPOS:
20 | trunk:
21 | - Differentiator
22 | - RxCocoa
23 | - RxDataSources
24 | - RxRelay
25 | - RxSwift
26 |
27 | SPEC CHECKSUMS:
28 | Differentiator: e8497ceab83c1b10ca233716d547b9af21b9344d
29 | RxCocoa: 4baf94bb35f2c0ab31bc0cb9f1900155f646ba42
30 | RxDataSources: aa47cc1ed6c500fa0dfecac5c979b723542d79cf
31 | RxRelay: e72dbfd157807478401ef1982e1c61c945c94b2f
32 | RxSwift: d356ab7bee873611322f134c5f9ef379fa183d8f
33 |
34 | PODFILE CHECKSUM: d0de44178f4e1b2300068bf6f298083f5a389971
35 |
36 | COCOAPODS: 1.10.1
37 |
--------------------------------------------------------------------------------
/Pods/Differentiator/LICENSE.md:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 RxSwift Community
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/Differentiator/Sources/Differentiator/AnimatableSectionModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AnimatableSectionModel.swift
3 | // RxDataSources
4 | //
5 | // Created by Krunoslav Zaher on 1/10/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public struct AnimatableSectionModel {
12 | public var model: Section
13 | public var items: [Item]
14 |
15 | public init(model: Section, items: [ItemType]) {
16 | self.model = model
17 | self.items = items
18 | }
19 |
20 | }
21 |
22 | extension AnimatableSectionModel
23 | : AnimatableSectionModelType {
24 | public typealias Item = ItemType
25 | public typealias Identity = Section.Identity
26 |
27 | public var identity: Section.Identity {
28 | return model.identity
29 | }
30 |
31 | public init(original: AnimatableSectionModel, items: [Item]) {
32 | self.model = original.model
33 | self.items = items
34 | }
35 |
36 | public var hashValue: Int {
37 | return self.model.identity.hashValue
38 | }
39 | }
40 |
41 |
42 | extension AnimatableSectionModel
43 | : CustomStringConvertible {
44 |
45 | public var description: String {
46 | return "HashableSectionModel(model: \"\(self.model)\", items: \(items))"
47 | }
48 |
49 | }
50 |
51 | extension AnimatableSectionModel
52 | : Equatable where Section: Equatable {
53 |
54 | public static func == (lhs: AnimatableSectionModel, rhs: AnimatableSectionModel) -> Bool {
55 | return lhs.model == rhs.model
56 | && lhs.items == rhs.items
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/Pods/Differentiator/Sources/Differentiator/AnimatableSectionModelType+ItemPath.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AnimatableSectionModelType+ItemPath.swift
3 | // RxDataSources
4 | //
5 | // Created by Krunoslav Zaher on 1/9/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | extension Array where Element: AnimatableSectionModelType {
12 | subscript(index: ItemPath) -> Element.Item {
13 | return self[index.sectionIndex].items[index.itemIndex]
14 | }
15 | }
--------------------------------------------------------------------------------
/Pods/Differentiator/Sources/Differentiator/AnimatableSectionModelType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AnimatableSectionModelType.swift
3 | // RxDataSources
4 | //
5 | // Created by Krunoslav Zaher on 1/6/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public protocol AnimatableSectionModelType
12 | : SectionModelType
13 | , IdentifiableType where Item: IdentifiableType, Item: Equatable {
14 | }
15 |
--------------------------------------------------------------------------------
/Pods/Differentiator/Sources/Differentiator/IdentifiableType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // IdentifiableType.swift
3 | // RxDataSources
4 | //
5 | // Created by Krunoslav Zaher on 1/6/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public protocol IdentifiableType {
12 | associatedtype Identity: Hashable
13 |
14 | var identity : Identity { get }
15 | }
--------------------------------------------------------------------------------
/Pods/Differentiator/Sources/Differentiator/IdentifiableValue.swift:
--------------------------------------------------------------------------------
1 | //
2 | // IdentifiableValue.swift
3 | // RxDataSources
4 | //
5 | // Created by Krunoslav Zaher on 1/7/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public struct IdentifiableValue {
12 | public let value: Value
13 | }
14 |
15 | extension IdentifiableValue
16 | : IdentifiableType {
17 |
18 | public typealias Identity = Value
19 |
20 | public var identity : Identity {
21 | return value
22 | }
23 | }
24 |
25 | extension IdentifiableValue
26 | : Equatable
27 | , CustomStringConvertible
28 | , CustomDebugStringConvertible {
29 |
30 | public var description: String {
31 | return "\(value)"
32 | }
33 |
34 | public var debugDescription: String {
35 | return "\(value)"
36 | }
37 | }
38 |
39 | public func == (lhs: IdentifiableValue, rhs: IdentifiableValue) -> Bool {
40 | return lhs.value == rhs.value
41 | }
42 |
--------------------------------------------------------------------------------
/Pods/Differentiator/Sources/Differentiator/ItemPath.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ItemPath.swift
3 | // RxDataSources
4 | //
5 | // Created by Krunoslav Zaher on 1/9/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public struct ItemPath {
12 | public let sectionIndex: Int
13 | public let itemIndex: Int
14 |
15 | public init(sectionIndex: Int, itemIndex: Int) {
16 | self.sectionIndex = sectionIndex
17 | self.itemIndex = itemIndex
18 | }
19 | }
20 |
21 | extension ItemPath : Equatable {
22 |
23 | }
24 |
25 | public func == (lhs: ItemPath, rhs: ItemPath) -> Bool {
26 | return lhs.sectionIndex == rhs.sectionIndex && lhs.itemIndex == rhs.itemIndex
27 | }
28 |
29 | extension ItemPath: Hashable {
30 |
31 | public func hash(into hasher: inout Hasher) {
32 | hasher.combine(sectionIndex.byteSwapped.hashValue)
33 | hasher.combine(itemIndex.hashValue)
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/Pods/Differentiator/Sources/Differentiator/Optional+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Optional+Extensions.swift
3 | // RxDataSources
4 | //
5 | // Created by Krunoslav Zaher on 1/8/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | extension Optional {
12 | func unwrap() throws -> Wrapped {
13 | if let unwrapped = self {
14 | return unwrapped
15 | }
16 | else {
17 | debugFatalError("Error during unwrapping optional")
18 | throw DifferentiatorError.unwrappingOptional
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Pods/Differentiator/Sources/Differentiator/SectionModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SectionModel.swift
3 | // RxDataSources
4 | //
5 | // Created by Krunoslav Zaher on 6/16/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public struct SectionModel {
12 | public var model: Section
13 | public var items: [Item]
14 |
15 | public init(model: Section, items: [Item]) {
16 | self.model = model
17 | self.items = items
18 | }
19 | }
20 |
21 | extension SectionModel
22 | : SectionModelType {
23 | public typealias Identity = Section
24 | public typealias Item = ItemType
25 |
26 | public var identity: Section {
27 | return model
28 | }
29 | }
30 |
31 | extension SectionModel
32 | : CustomStringConvertible {
33 |
34 | public var description: String {
35 | return "\(self.model) > \(items)"
36 | }
37 | }
38 |
39 | extension SectionModel {
40 | public init(original: SectionModel, items: [Item]) {
41 | self.model = original.model
42 | self.items = items
43 | }
44 | }
45 |
46 | extension SectionModel
47 | : Equatable where Section: Equatable, ItemType: Equatable {
48 |
49 | public static func == (lhs: SectionModel, rhs: SectionModel) -> Bool {
50 | return lhs.model == rhs.model
51 | && lhs.items == rhs.items
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/Pods/Differentiator/Sources/Differentiator/SectionModelType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SectionModelType.swift
3 | // RxDataSources
4 | //
5 | // Created by Krunoslav Zaher on 6/28/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public protocol SectionModelType {
12 | associatedtype Item
13 |
14 | var items: [Item] { get }
15 |
16 | init(original: Self, items: [Item])
17 | }
--------------------------------------------------------------------------------
/Pods/Differentiator/Sources/Differentiator/Utilities.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Utilities.swift
3 | // RxDataSources
4 | //
5 | // Created by muukii on 8/2/17.
6 | // Copyright © 2017 kzaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | enum DifferentiatorError : Error {
12 | case unwrappingOptional
13 | case preconditionFailed(message: String)
14 | }
15 |
16 | func precondition(_ condition: Bool, _ message: @autoclosure() -> String) throws {
17 | if condition {
18 | return
19 | }
20 | debugFatalError("Precondition failed")
21 |
22 | throw DifferentiatorError.preconditionFailed(message: message())
23 | }
24 |
25 | func debugFatalError(_ error: Error) {
26 | debugFatalError("\(error)")
27 | }
28 |
29 | func debugFatalError(_ message: String) {
30 | #if DEBUG
31 | fatalError(message)
32 | #else
33 | print(message)
34 | #endif
35 | }
36 |
--------------------------------------------------------------------------------
/Pods/Manifest.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - Differentiator (5.0.0)
3 | - RxCocoa (6.2.0):
4 | - RxRelay (= 6.2.0)
5 | - RxSwift (= 6.2.0)
6 | - RxDataSources (5.0.0):
7 | - Differentiator (~> 5.0)
8 | - RxCocoa (~> 6.0)
9 | - RxSwift (~> 6.0)
10 | - RxRelay (6.2.0):
11 | - RxSwift (= 6.2.0)
12 | - RxSwift (6.2.0)
13 |
14 | DEPENDENCIES:
15 | - RxCocoa (= 6.2.0)
16 | - RxDataSources (= 5.0.0)
17 | - RxSwift (= 6.2.0)
18 |
19 | SPEC REPOS:
20 | trunk:
21 | - Differentiator
22 | - RxCocoa
23 | - RxDataSources
24 | - RxRelay
25 | - RxSwift
26 |
27 | SPEC CHECKSUMS:
28 | Differentiator: e8497ceab83c1b10ca233716d547b9af21b9344d
29 | RxCocoa: 4baf94bb35f2c0ab31bc0cb9f1900155f646ba42
30 | RxDataSources: aa47cc1ed6c500fa0dfecac5c979b723542d79cf
31 | RxRelay: e72dbfd157807478401ef1982e1c61c945c94b2f
32 | RxSwift: d356ab7bee873611322f134c5f9ef379fa183d8f
33 |
34 | PODFILE CHECKSUM: d0de44178f4e1b2300068bf6f298083f5a389971
35 |
36 | COCOAPODS: 1.10.1
37 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/LICENSE.md:
--------------------------------------------------------------------------------
1 | **The MIT License**
2 | **Copyright © 2015 Krunoslav Zaher, Shai Mishali**
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.
10 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/Platform/DataStructures/InfiniteSequence.swift:
--------------------------------------------------------------------------------
1 | //
2 | // InfiniteSequence.swift
3 | // Platform
4 | //
5 | // Created by Krunoslav Zaher on 6/13/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Sequence that repeats `repeatedValue` infinite number of times.
10 | struct InfiniteSequence : Sequence {
11 | typealias Iterator = AnyIterator
12 |
13 | private let repeatedValue: Element
14 |
15 | init(repeatedValue: Element) {
16 | self.repeatedValue = repeatedValue
17 | }
18 |
19 | func makeIterator() -> Iterator {
20 | let repeatedValue = self.repeatedValue
21 | return AnyIterator { repeatedValue }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/Platform/DispatchQueue+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DispatchQueue+Extensions.swift
3 | // Platform
4 | //
5 | // Created by Krunoslav Zaher on 10/22/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Dispatch
10 |
11 | extension DispatchQueue {
12 | private static var token: DispatchSpecificKey<()> = {
13 | let key = DispatchSpecificKey<()>()
14 | DispatchQueue.main.setSpecific(key: key, value: ())
15 | return key
16 | }()
17 |
18 | static var isMain: Bool {
19 | DispatchQueue.getSpecific(key: token) != nil
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/Platform/Platform.Darwin.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Platform.Darwin.swift
3 | // Platform
4 | //
5 | // Created by Krunoslav Zaher on 12/29/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)
10 |
11 | import Darwin
12 | import Foundation
13 |
14 | extension Thread {
15 | static func setThreadLocalStorageValue(_ value: T?, forKey key: NSCopying) {
16 | let currentThread = Thread.current
17 | let threadDictionary = currentThread.threadDictionary
18 |
19 | if let newValue = value {
20 | threadDictionary[key] = newValue
21 | }
22 | else {
23 | threadDictionary[key] = nil
24 | }
25 | }
26 |
27 | static func getThreadLocalStorageValueForKey(_ key: NSCopying) -> T? {
28 | let currentThread = Thread.current
29 | let threadDictionary = currentThread.threadDictionary
30 |
31 | return threadDictionary[key] as? T
32 | }
33 | }
34 |
35 | #endif
36 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/Platform/Platform.Linux.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Platform.Linux.swift
3 | // Platform
4 | //
5 | // Created by Krunoslav Zaher on 12/29/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(Linux)
10 |
11 | import Foundation
12 |
13 | extension Thread {
14 |
15 | static func setThreadLocalStorageValue(_ value: T?, forKey key: String) {
16 | if let newValue = value {
17 | Thread.current.threadDictionary[key] = newValue
18 | }
19 | else {
20 | Thread.current.threadDictionary[key] = nil
21 | }
22 | }
23 |
24 | static func getThreadLocalStorageValueForKey(_ key: String) -> T? {
25 | let currentThread = Thread.current
26 | let threadDictionary = currentThread.threadDictionary
27 |
28 | return threadDictionary[key] as? T
29 | }
30 | }
31 |
32 | #endif
33 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/Platform/RecursiveLock.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RecursiveLock.swift
3 | // Platform
4 | //
5 | // Created by Krunoslav Zaher on 12/18/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | #if TRACE_RESOURCES
12 | class RecursiveLock: NSRecursiveLock {
13 | override init() {
14 | _ = Resources.incrementTotal()
15 | super.init()
16 | }
17 |
18 | override func lock() {
19 | super.lock()
20 | _ = Resources.incrementTotal()
21 | }
22 |
23 | override func unlock() {
24 | super.unlock()
25 | _ = Resources.decrementTotal()
26 | }
27 |
28 | deinit {
29 | _ = Resources.decrementTotal()
30 | }
31 | }
32 | #else
33 | typealias RecursiveLock = NSRecursiveLock
34 | #endif
35 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Common/RxTarget.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxTarget.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 7/12/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | import RxSwift
12 |
13 | class RxTarget : NSObject
14 | , Disposable {
15 |
16 | private var retainSelf: RxTarget?
17 |
18 | override init() {
19 | super.init()
20 | self.retainSelf = self
21 |
22 | #if TRACE_RESOURCES
23 | _ = Resources.incrementTotal()
24 | #endif
25 |
26 | #if DEBUG
27 | MainScheduler.ensureRunningOnMainThread()
28 | #endif
29 | }
30 |
31 | func dispose() {
32 | #if DEBUG
33 | MainScheduler.ensureRunningOnMainThread()
34 | #endif
35 | self.retainSelf = nil
36 | }
37 |
38 | #if TRACE_RESOURCES
39 | deinit {
40 | _ = Resources.decrementTotal()
41 | }
42 | #endif
43 | }
44 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Common/SectionedViewDataSourceType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SectionedViewDataSourceType.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 1/10/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | /// Data source with access to underlying sectioned model.
12 | public protocol SectionedViewDataSourceType {
13 | /// Returns model at index path.
14 | ///
15 | /// In case data source doesn't contain any sections when this method is being called, `RxCocoaError.ItemsNotYetBound(object: self)` is thrown.
16 |
17 | /// - parameter indexPath: Model index path
18 | /// - returns: Model at index path.
19 | func model(at indexPath: IndexPath) throws -> Any
20 | }
21 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable+CoreGraphics.swift:
--------------------------------------------------------------------------------
1 | //
2 | // KVORepresentable+CoreGraphics.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 11/14/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if !os(Linux)
10 |
11 | import RxSwift
12 | import CoreGraphics
13 |
14 | import Foundation
15 |
16 | #if arch(x86_64) || arch(arm64)
17 | let CGRectType = "{CGRect={CGPoint=dd}{CGSize=dd}}"
18 | let CGSizeType = "{CGSize=dd}"
19 | let CGPointType = "{CGPoint=dd}"
20 | #elseif arch(i386) || arch(arm) || os(watchOS)
21 | let CGRectType = "{CGRect={CGPoint=ff}{CGSize=ff}}"
22 | let CGSizeType = "{CGSize=ff}"
23 | let CGPointType = "{CGPoint=ff}"
24 | #endif
25 |
26 | extension CGRect : KVORepresentable {
27 | public typealias KVOType = NSValue
28 |
29 | /// Constructs self from `NSValue`.
30 | public init?(KVOValue: KVOType) {
31 | if strcmp(KVOValue.objCType, CGRectType) != 0 {
32 | return nil
33 | }
34 | var typedValue = CGRect(x: 0, y: 0, width: 0, height: 0)
35 | KVOValue.getValue(&typedValue)
36 | self = typedValue
37 | }
38 | }
39 |
40 | extension CGPoint : KVORepresentable {
41 | public typealias KVOType = NSValue
42 |
43 | /// Constructs self from `NSValue`.
44 | public init?(KVOValue: KVOType) {
45 | if strcmp(KVOValue.objCType, CGPointType) != 0 {
46 | return nil
47 | }
48 | var typedValue = CGPoint(x: 0, y: 0)
49 | KVOValue.getValue(&typedValue)
50 | self = typedValue
51 | }
52 | }
53 |
54 | extension CGSize : KVORepresentable {
55 | public typealias KVOType = NSValue
56 |
57 | /// Constructs self from `NSValue`.
58 | public init?(KVOValue: KVOType) {
59 | if strcmp(KVOValue.objCType, CGSizeType) != 0 {
60 | return nil
61 | }
62 | var typedValue = CGSize(width: 0, height: 0)
63 | KVOValue.getValue(&typedValue)
64 | self = typedValue
65 | }
66 | }
67 |
68 | #endif
69 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // KVORepresentable.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 11/14/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Type that is KVO representable (KVO mechanism can be used to observe it).
10 | public protocol KVORepresentable {
11 | /// Associated KVO type.
12 | associatedtype KVOType
13 |
14 | /// Constructs `Self` using KVO value.
15 | init?(KVOValue: KVOType)
16 | }
17 |
18 | extension KVORepresentable {
19 | /// Initializes `KVORepresentable` with optional value.
20 | init?(KVOValue: KVOType?) {
21 | guard let KVOValue = KVOValue else {
22 | return nil
23 | }
24 |
25 | self.init(KVOValue: KVOValue)
26 | }
27 | }
28 |
29 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NSObject+Rx+RawRepresentable.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 11/9/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if !os(Linux)
10 |
11 | import RxSwift
12 |
13 | import Foundation
14 |
15 | extension Reactive where Base: NSObject {
16 | /**
17 | Specialization of generic `observe` method.
18 |
19 | This specialization first observes `KVORepresentable` value and then converts it to `RawRepresentable` value.
20 |
21 | It is useful for observing bridged ObjC enum values.
22 |
23 | For more information take a look at `observe` method.
24 | */
25 | public func observe(_ type: Element.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable where Element.RawValue: KVORepresentable {
26 | return self.observe(Element.RawValue.KVOType.self, keyPath, options: options, retainSelf: retainSelf)
27 | .map(Element.init)
28 | }
29 | }
30 |
31 | #if !DISABLE_SWIZZLING
32 |
33 | // observeWeakly + RawRepresentable
34 | extension Reactive where Base: NSObject {
35 |
36 | /**
37 | Specialization of generic `observeWeakly` method.
38 |
39 | This specialization first observes `KVORepresentable` value and then converts it to `RawRepresentable` value.
40 |
41 | It is useful for observing bridged ObjC enum values.
42 |
43 | For more information take a look at `observeWeakly` method.
44 | */
45 | public func observeWeakly(_ type: Element.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial]) -> Observable where Element.RawValue: KVORepresentable {
46 | return self.observeWeakly(Element.RawValue.KVOType.self, keyPath, options: options)
47 | .map(Element.init)
48 | }
49 | }
50 | #endif
51 |
52 | #endif
53 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Foundation/NotificationCenter+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NotificationCenter+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 5/2/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import RxSwift
11 |
12 | extension Reactive where Base: NotificationCenter {
13 | /**
14 | Transforms notifications posted to notification center to observable sequence of notifications.
15 |
16 | - parameter name: Optional name used to filter notifications.
17 | - parameter object: Optional object used to filter notifications.
18 | - returns: Observable sequence of posted notifications.
19 | */
20 | public func notification(_ name: Notification.Name?, object: AnyObject? = nil) -> Observable {
21 | return Observable.create { [weak object] observer in
22 | let nsObserver = self.base.addObserver(forName: name, object: object, queue: nil) { notification in
23 | observer.on(.next(notification))
24 | }
25 |
26 | return Disposables.create {
27 | self.base.removeObserver(nsObserver)
28 | }
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Runtime/_RX.m:
--------------------------------------------------------------------------------
1 | //
2 | // _RX.m
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 7/12/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #import "include/_RX.h"
10 |
11 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Runtime/_RXKVOObserver.m:
--------------------------------------------------------------------------------
1 | //
2 | // _RXKVOObserver.m
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 7/11/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #import "include/_RXKVOObserver.h"
10 |
11 | @interface _RXKVOObserver ()
12 |
13 | @property (nonatomic, unsafe_unretained) id target;
14 | @property (nonatomic, strong ) id retainedTarget;
15 | @property (nonatomic, copy ) NSString *keyPath;
16 | @property (nonatomic, copy ) void (^callback)(id);
17 |
18 | @end
19 |
20 | @implementation _RXKVOObserver
21 |
22 | -(instancetype)initWithTarget:(id)target
23 | retainTarget:(BOOL)retainTarget
24 | keyPath:(NSString*)keyPath
25 | options:(NSKeyValueObservingOptions)options
26 | callback:(void (^)(id))callback {
27 | self = [super init];
28 | if (!self) return nil;
29 |
30 | self.target = target;
31 | if (retainTarget) {
32 | self.retainedTarget = target;
33 | }
34 | self.keyPath = keyPath;
35 | self.callback = callback;
36 |
37 | [self.target addObserver:self forKeyPath:self.keyPath options:options context:nil];
38 |
39 | return self;
40 | }
41 |
42 | -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
43 | @synchronized(self) {
44 | self.callback(change[NSKeyValueChangeNewKey]);
45 | }
46 | }
47 |
48 | -(void)dispose {
49 | [self.target removeObserver:self forKeyPath:self.keyPath context:nil];
50 | self.target = nil;
51 | self.retainedTarget = nil;
52 | }
53 |
54 | @end
55 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Runtime/include/RxCocoaRuntime.h:
--------------------------------------------------------------------------------
1 | //
2 | // RxCocoaRuntime.h
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 2/21/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "_RX.h"
11 | #import "_RXDelegateProxy.h"
12 | #import "_RXKVOObserver.h"
13 | #import "_RXObjCRuntime.h"
14 |
15 | //! Project version number for RxCocoa.
16 | FOUNDATION_EXPORT double RxCocoaVersionNumber;
17 |
18 | //! Project version string for RxCocoa.
19 | FOUNDATION_EXPORT const unsigned char RxCocoaVersionString[];
20 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Runtime/include/_RXDelegateProxy.h:
--------------------------------------------------------------------------------
1 | //
2 | // _RXDelegateProxy.h
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 7/4/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | NS_ASSUME_NONNULL_BEGIN
12 |
13 | @interface _RXDelegateProxy : NSObject
14 |
15 | @property (nonatomic, weak, readonly) id _forwardToDelegate;
16 |
17 | -(void)_setForwardToDelegate:(id __nullable)forwardToDelegate retainDelegate:(BOOL)retainDelegate NS_SWIFT_NAME(_setForwardToDelegate(_:retainDelegate:)) ;
18 |
19 | -(BOOL)hasWiredImplementationForSelector:(SEL)selector;
20 | -(BOOL)voidDelegateMethodsContain:(SEL)selector;
21 |
22 | -(void)_sentMessage:(SEL)selector withArguments:(NSArray*)arguments;
23 | -(void)_methodInvoked:(SEL)selector withArguments:(NSArray*)arguments;
24 |
25 | @end
26 |
27 | NS_ASSUME_NONNULL_END
28 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Runtime/include/_RXKVOObserver.h:
--------------------------------------------------------------------------------
1 | //
2 | // _RXKVOObserver.h
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 7/11/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | /**
12 | ################################################################################
13 | This file is part of RX private API
14 | ################################################################################
15 | */
16 |
17 | // Exists because if written in Swift, reading unowned is disabled during dealloc process
18 | @interface _RXKVOObserver : NSObject
19 |
20 | -(instancetype)initWithTarget:(id)target
21 | retainTarget:(BOOL)retainTarget
22 | keyPath:(NSString*)keyPath
23 | options:(NSKeyValueObservingOptions)options
24 | callback:(void (^)(id))callback;
25 |
26 | -(void)dispose;
27 |
28 | @end
29 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/RxCocoa.h:
--------------------------------------------------------------------------------
1 | //
2 | // RxCocoa.h
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 2/21/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 | #import
12 | #import
13 | #import
14 |
15 | //! Project version number for RxCocoa.
16 | FOUNDATION_EXPORT double RxCocoaVersionNumber;
17 |
18 | //! Project version string for RxCocoa.
19 | FOUNDATION_EXPORT const unsigned char RxCocoaVersionString[];
20 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Traits/Driver/BehaviorRelay+Driver.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BehaviorRelay+Driver.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 10/7/17.
6 | // Copyright © 2017 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import RxSwift
10 | import RxRelay
11 |
12 | extension BehaviorRelay {
13 | /// Converts `BehaviorRelay` to `Driver`.
14 | ///
15 | /// - returns: Observable sequence.
16 | public func asDriver() -> Driver {
17 | let source = self.asObservable()
18 | .observe(on:DriverSharingStrategy.scheduler)
19 | return SharedSequence(source)
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Traits/Driver/ControlEvent+Driver.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ControlEvent+Driver.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 9/19/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import RxSwift
10 |
11 | extension ControlEvent {
12 | /// Converts `ControlEvent` to `Driver` trait.
13 | ///
14 | /// `ControlEvent` already can't fail, so no special case needs to be handled.
15 | public func asDriver() -> Driver {
16 | return self.asDriver { _ -> Driver in
17 | #if DEBUG
18 | rxFatalError("Somehow driver received error from a source that shouldn't fail.")
19 | #else
20 | return Driver.empty()
21 | #endif
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Traits/Driver/ControlProperty+Driver.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ControlProperty+Driver.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 9/19/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import RxSwift
10 |
11 | extension ControlProperty {
12 | /// Converts `ControlProperty` to `Driver` trait.
13 | ///
14 | /// `ControlProperty` already can't fail, so no special case needs to be handled.
15 | public func asDriver() -> Driver {
16 | return self.asDriver { _ -> Driver in
17 | #if DEBUG
18 | rxFatalError("Somehow driver received error from a source that shouldn't fail.")
19 | #else
20 | return Driver.empty()
21 | #endif
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Traits/Driver/ObservableConvertibleType+Driver.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ObservableConvertibleType+Driver.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 9/19/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import RxSwift
10 |
11 | extension ObservableConvertibleType {
12 | /**
13 | Converts observable sequence to `Driver` trait.
14 |
15 | - parameter onErrorJustReturn: Element to return in case of error and after that complete the sequence.
16 | - returns: Driver trait.
17 | */
18 | public func asDriver(onErrorJustReturn: Element) -> Driver {
19 | let source = self
20 | .asObservable()
21 | .observe(on:DriverSharingStrategy.scheduler)
22 | .catchAndReturn(onErrorJustReturn)
23 | return Driver(source)
24 | }
25 |
26 | /**
27 | Converts observable sequence to `Driver` trait.
28 |
29 | - parameter onErrorDriveWith: Driver that continues to drive the sequence in case of error.
30 | - returns: Driver trait.
31 | */
32 | public func asDriver(onErrorDriveWith: Driver) -> Driver {
33 | let source = self
34 | .asObservable()
35 | .observe(on:DriverSharingStrategy.scheduler)
36 | .catch { _ in
37 | onErrorDriveWith.asObservable()
38 | }
39 | return Driver(source)
40 | }
41 |
42 | /**
43 | Converts observable sequence to `Driver` trait.
44 |
45 | - parameter onErrorRecover: Calculates driver that continues to drive the sequence in case of error.
46 | - returns: Driver trait.
47 | */
48 | public func asDriver(onErrorRecover: @escaping (_ error: Swift.Error) -> Driver) -> Driver {
49 | let source = self
50 | .asObservable()
51 | .observe(on:DriverSharingStrategy.scheduler)
52 | .catch { error in
53 | onErrorRecover(error).asObservable()
54 | }
55 | return Driver(source)
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SchedulerType+SharedSequence.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SchedulerType+SharedSequence.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 8/27/17.
6 | // Copyright © 2017 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import RxSwift
10 |
11 | public enum SharingScheduler {
12 | /// Default scheduler used in SharedSequence based traits.
13 | public private(set) static var make: () -> SchedulerType = { MainScheduler() }
14 |
15 | /**
16 | This method can be used in unit tests to ensure that built in shared sequences are using mock schedulers instead
17 | of main schedulers.
18 |
19 | **This shouldn't be used in normal release builds.**
20 | */
21 | static public func mock(scheduler: SchedulerType, action: () throws -> Void) rethrows {
22 | return try mock(makeScheduler: { scheduler }, action: action)
23 | }
24 |
25 | /**
26 | This method can be used in unit tests to ensure that built in shared sequences are using mock schedulers instead
27 | of main schedulers.
28 |
29 | **This shouldn't be used in normal release builds.**
30 | */
31 | static public func mock(makeScheduler: @escaping () -> SchedulerType, action: () throws -> Void) rethrows {
32 | let originalMake = make
33 | make = makeScheduler
34 | defer {
35 | make = originalMake
36 | }
37 |
38 | try action()
39 |
40 | // If you remove this line , compiler buggy optimizations will change behavior of this code
41 | _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(makeScheduler)
42 | // Scary, I know
43 | }
44 | }
45 |
46 | #if os(Linux)
47 | import Glibc
48 | #else
49 | import Foundation
50 | #endif
51 |
52 | func _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(_ scheduler: () -> SchedulerType) {
53 | let a: Int32 = 1
54 | #if os(Linux)
55 | let b = 314 + Int32(Glibc.random() & 1)
56 | #else
57 | let b = 314 + Int32(arc4random() & 1)
58 | #endif
59 | if a == b {
60 | print(scheduler())
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Traits/Signal/ControlEvent+Signal.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ControlEvent+Signal.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 11/1/17.
6 | // Copyright © 2017 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import RxSwift
10 |
11 | extension ControlEvent {
12 | /// Converts `ControlEvent` to `Signal` trait.
13 | ///
14 | /// `ControlEvent` already can't fail, so no special case needs to be handled.
15 | public func asSignal() -> Signal {
16 | return self.asSignal { _ -> Signal in
17 | #if DEBUG
18 | rxFatalError("Somehow signal received error from a source that shouldn't fail.")
19 | #else
20 | return Signal.empty()
21 | #endif
22 | }
23 | }
24 | }
25 |
26 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Traits/Signal/ObservableConvertibleType+Signal.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ObservableConvertibleType+Signal.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 9/19/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import RxSwift
10 |
11 | extension ObservableConvertibleType {
12 | /**
13 | Converts observable sequence to `Signal` trait.
14 |
15 | - parameter onErrorJustReturn: Element to return in case of error and after that complete the sequence.
16 | - returns: Signal trait.
17 | */
18 | public func asSignal(onErrorJustReturn: Element) -> Signal {
19 | let source = self
20 | .asObservable()
21 | .observe(on: SignalSharingStrategy.scheduler)
22 | .catchAndReturn(onErrorJustReturn)
23 | return Signal(source)
24 | }
25 |
26 | /**
27 | Converts observable sequence to `Signal` trait.
28 |
29 | - parameter onErrorSignalWith: Signal that continues to emit the sequence in case of error.
30 | - returns: Signal trait.
31 | */
32 | public func asSignal(onErrorSignalWith: Signal) -> Signal {
33 | let source = self
34 | .asObservable()
35 | .observe(on: SignalSharingStrategy.scheduler)
36 | .catch { _ in
37 | onErrorSignalWith.asObservable()
38 | }
39 | return Signal(source)
40 | }
41 |
42 | /**
43 | Converts observable sequence to `Signal` trait.
44 |
45 | - parameter onErrorRecover: Calculates signal that continues to emit the sequence in case of error.
46 | - returns: Signal trait.
47 | */
48 | public func asSignal(onErrorRecover: @escaping (_ error: Swift.Error) -> Signal) -> Signal {
49 | let source = self
50 | .asObservable()
51 | .observe(on: SignalSharingStrategy.scheduler)
52 | .catch { error in
53 | onErrorRecover(error).asObservable()
54 | }
55 | return Signal(source)
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Traits/Signal/PublishRelay+Signal.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PublishRelay+Signal.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 12/28/15.
6 | // Copyright © 2017 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import RxSwift
10 | import RxRelay
11 |
12 | extension PublishRelay {
13 | /// Converts `PublishRelay` to `Signal`.
14 | ///
15 | /// - returns: Observable sequence.
16 | public func asSignal() -> Signal {
17 | let source = self.asObservable()
18 | .observe(on:SignalSharingStrategy.scheduler)
19 | return SharedSequence(source)
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/Traits/Signal/Signal.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Signal.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 9/26/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import RxSwift
10 |
11 | /**
12 | Trait that represents observable sequence with following properties:
13 |
14 | - it never fails
15 | - it delivers events on `MainScheduler.instance`
16 | - `share(scope: .whileConnected)` sharing strategy
17 |
18 | Additional explanation:
19 | - all observers share sequence computation resources
20 | - there is no replaying of sequence elements on new observer subscription
21 | - computation of elements is reference counted with respect to the number of observers
22 | - if there are no subscribers, it will release sequence computation resources
23 |
24 | In case trait that models state propagation is required, please check `Driver`.
25 |
26 | `Signal` can be considered a builder pattern for observable sequences that model imperative events part of the application.
27 |
28 | To find out more about units and how to use them, please visit `Documentation/Traits.md`.
29 | */
30 | public typealias Signal = SharedSequence
31 |
32 | public struct SignalSharingStrategy: SharingStrategyProtocol {
33 | public static var scheduler: SchedulerType { SharingScheduler.make() }
34 |
35 | public static func share(_ source: Observable) -> Observable {
36 | source.share(scope: .whileConnected)
37 | }
38 | }
39 |
40 | extension SharedSequenceConvertibleType where SharingStrategy == SignalSharingStrategy {
41 | /// Adds `asPublisher` to `SharingSequence` with `PublishSharingStrategy`.
42 | public func asSignal() -> Signal {
43 | self.asSharedSequence()
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/Events/ItemEvents.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ItemEvents.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 6/20/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 | import UIKit
11 |
12 | public typealias ItemMovedEvent = (sourceIndex: IndexPath, destinationIndex: IndexPath)
13 | public typealias WillDisplayCellEvent = (cell: UITableViewCell, indexPath: IndexPath)
14 | public typealias DidEndDisplayingCellEvent = (cell: UITableViewCell, indexPath: IndexPath)
15 | #endif
16 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/NSTextStorage+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NSTextStorage+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Segii Shulga on 12/30/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 | import RxSwift
11 | import UIKit
12 |
13 | extension Reactive where Base: NSTextStorage {
14 |
15 | /// Reactive wrapper for `delegate`.
16 | ///
17 | /// For more information take a look at `DelegateProxyType` protocol documentation.
18 | public var delegate: DelegateProxy {
19 | return RxTextStorageDelegateProxy.proxy(for: base)
20 | }
21 |
22 | /// Reactive wrapper for `delegate` message.
23 | public var didProcessEditingRangeChangeInLength: Observable<(editedMask: NSTextStorage.EditActions, editedRange: NSRange, delta: Int)> {
24 | return delegate
25 | .methodInvoked(#selector(NSTextStorageDelegate.textStorage(_:didProcessEditing:range:changeInLength:)))
26 | .map { a in
27 | let editedMask = NSTextStorage.EditActions(rawValue: try castOrThrow(UInt.self, a[1]) )
28 | let editedRange = try castOrThrow(NSValue.self, a[2]).rangeValue
29 | let delta = try castOrThrow(Int.self, a[3])
30 |
31 | return (editedMask, editedRange, delta)
32 | }
33 | }
34 | }
35 | #endif
36 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/Protocols/RxCollectionViewDataSourceType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxCollectionViewDataSourceType.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 6/29/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 |
11 | import UIKit
12 | import RxSwift
13 |
14 | /// Marks data source as `UICollectionView` reactive data source enabling it to be used with one of the `bindTo` methods.
15 | public protocol RxCollectionViewDataSourceType /*: UICollectionViewDataSource*/ {
16 |
17 | /// Type of elements that can be bound to collection view.
18 | associatedtype Element
19 |
20 | /// New observable sequence event observed.
21 | ///
22 | /// - parameter collectionView: Bound collection view.
23 | /// - parameter observedEvent: Event
24 | func collectionView(_ collectionView: UICollectionView, observedEvent: Event)
25 | }
26 |
27 | #endif
28 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/Protocols/RxPickerViewDataSourceType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxPickerViewDataSourceType.swift
3 | // RxCocoa
4 | //
5 | // Created by Sergey Shulga on 05/07/2017.
6 | // Copyright © 2017 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS)
10 |
11 | import UIKit
12 | import RxSwift
13 |
14 | /// Marks data source as `UIPickerView` reactive data source enabling it to be used with one of the `bindTo` methods.
15 | public protocol RxPickerViewDataSourceType {
16 | /// Type of elements that can be bound to picker view.
17 | associatedtype Element
18 |
19 | /// New observable sequence event observed.
20 | ///
21 | /// - parameter pickerView: Bound picker view.
22 | /// - parameter observedEvent: Event
23 | func pickerView(_ pickerView: UIPickerView, observedEvent: Event)
24 | }
25 |
26 | #endif
27 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/Protocols/RxTableViewDataSourceType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxTableViewDataSourceType.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 6/26/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 |
11 | import UIKit
12 | import RxSwift
13 |
14 | /// Marks data source as `UITableView` reactive data source enabling it to be used with one of the `bindTo` methods.
15 | public protocol RxTableViewDataSourceType /*: UITableViewDataSource*/ {
16 |
17 | /// Type of elements that can be bound to table view.
18 | associatedtype Element
19 |
20 | /// New observable sequence event observed.
21 | ///
22 | /// - parameter tableView: Bound table view.
23 | /// - parameter observedEvent: Event
24 | func tableView(_ tableView: UITableView, observedEvent: Event)
25 | }
26 |
27 | #endif
28 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxCollectionViewDelegateProxy.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxCollectionViewDelegateProxy.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 6/29/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 |
11 | import UIKit
12 | import RxSwift
13 |
14 | /// For more information take a look at `DelegateProxyType`.
15 | open class RxCollectionViewDelegateProxy
16 | : RxScrollViewDelegateProxy
17 | , UICollectionViewDelegate
18 | , UICollectionViewDelegateFlowLayout {
19 |
20 | /// Typed parent object.
21 | public weak private(set) var collectionView: UICollectionView?
22 |
23 | /// Initializes `RxCollectionViewDelegateProxy`
24 | ///
25 | /// - parameter collectionView: Parent object for delegate proxy.
26 | public init(collectionView: UICollectionView) {
27 | self.collectionView = collectionView
28 | super.init(scrollView: collectionView)
29 | }
30 | }
31 |
32 | #endif
33 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxNavigationControllerDelegateProxy.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxNavigationControllerDelegateProxy.swift
3 | // RxCocoa
4 | //
5 | // Created by Diogo on 13/04/17.
6 | // Copyright © 2017 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 |
11 | import UIKit
12 | import RxSwift
13 |
14 | extension UINavigationController: HasDelegate {
15 | public typealias Delegate = UINavigationControllerDelegate
16 | }
17 |
18 | /// For more information take a look at `DelegateProxyType`.
19 | open class RxNavigationControllerDelegateProxy
20 | : DelegateProxy
21 | , DelegateProxyType
22 | , UINavigationControllerDelegate {
23 |
24 | /// Typed parent object.
25 | public weak private(set) var navigationController: UINavigationController?
26 |
27 | /// - parameter navigationController: Parent object for delegate proxy.
28 | public init(navigationController: ParentObject) {
29 | self.navigationController = navigationController
30 | super.init(parentObject: navigationController, delegateProxy: RxNavigationControllerDelegateProxy.self)
31 | }
32 |
33 | // Register known implementations
34 | public static func registerKnownImplementations() {
35 | self.register { RxNavigationControllerDelegateProxy(navigationController: $0) }
36 | }
37 | }
38 | #endif
39 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxPickerViewDelegateProxy.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxPickerViewDelegateProxy.swift
3 | // RxCocoa
4 | //
5 | // Created by Segii Shulga on 5/12/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS)
10 |
11 | import RxSwift
12 | import UIKit
13 |
14 | extension UIPickerView: HasDelegate {
15 | public typealias Delegate = UIPickerViewDelegate
16 | }
17 |
18 | open class RxPickerViewDelegateProxy
19 | : DelegateProxy
20 | , DelegateProxyType
21 | , UIPickerViewDelegate {
22 |
23 | /// Typed parent object.
24 | public weak private(set) var pickerView: UIPickerView?
25 |
26 | /// - parameter pickerView: Parent object for delegate proxy.
27 | public init(pickerView: ParentObject) {
28 | self.pickerView = pickerView
29 | super.init(parentObject: pickerView, delegateProxy: RxPickerViewDelegateProxy.self)
30 | }
31 |
32 | // Register known implementationss
33 | public static func registerKnownImplementations() {
34 | self.register { RxPickerViewDelegateProxy(pickerView: $0) }
35 | }
36 | }
37 | #endif
38 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxSearchBarDelegateProxy.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxSearchBarDelegateProxy.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 7/4/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 |
11 | import UIKit
12 | import RxSwift
13 |
14 | extension UISearchBar: HasDelegate {
15 | public typealias Delegate = UISearchBarDelegate
16 | }
17 |
18 | /// For more information take a look at `DelegateProxyType`.
19 | open class RxSearchBarDelegateProxy
20 | : DelegateProxy
21 | , DelegateProxyType
22 | , UISearchBarDelegate {
23 |
24 | /// Typed parent object.
25 | public weak private(set) var searchBar: UISearchBar?
26 |
27 | /// - parameter searchBar: Parent object for delegate proxy.
28 | public init(searchBar: ParentObject) {
29 | self.searchBar = searchBar
30 | super.init(parentObject: searchBar, delegateProxy: RxSearchBarDelegateProxy.self)
31 | }
32 |
33 | // Register known implementations
34 | public static func registerKnownImplementations() {
35 | self.register { RxSearchBarDelegateProxy(searchBar: $0) }
36 | }
37 | }
38 |
39 | #endif
40 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxSearchControllerDelegateProxy.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxSearchControllerDelegateProxy.swift
3 | // RxCocoa
4 | //
5 | // Created by Segii Shulga on 3/17/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS)
10 |
11 | import RxSwift
12 | import UIKit
13 |
14 | extension UISearchController: HasDelegate {
15 | public typealias Delegate = UISearchControllerDelegate
16 | }
17 |
18 | /// For more information take a look at `DelegateProxyType`.
19 | open class RxSearchControllerDelegateProxy
20 | : DelegateProxy
21 | , DelegateProxyType
22 | , UISearchControllerDelegate {
23 |
24 | /// Typed parent object.
25 | public weak private(set) var searchController: UISearchController?
26 |
27 | /// - parameter searchController: Parent object for delegate proxy.
28 | public init(searchController: UISearchController) {
29 | self.searchController = searchController
30 | super.init(parentObject: searchController, delegateProxy: RxSearchControllerDelegateProxy.self)
31 | }
32 |
33 | // Register known implementations
34 | public static func registerKnownImplementations() {
35 | self.register { RxSearchControllerDelegateProxy(searchController: $0) }
36 | }
37 | }
38 |
39 | #endif
40 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTabBarControllerDelegateProxy.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxTabBarControllerDelegateProxy.swift
3 | // RxCocoa
4 | //
5 | // Created by Yusuke Kita on 2016/12/07.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 |
11 | import UIKit
12 | import RxSwift
13 |
14 | extension UITabBarController: HasDelegate {
15 | public typealias Delegate = UITabBarControllerDelegate
16 | }
17 |
18 | /// For more information take a look at `DelegateProxyType`.
19 | open class RxTabBarControllerDelegateProxy
20 | : DelegateProxy
21 | , DelegateProxyType
22 | , UITabBarControllerDelegate {
23 |
24 | /// Typed parent object.
25 | public weak private(set) var tabBar: UITabBarController?
26 |
27 | /// - parameter tabBar: Parent object for delegate proxy.
28 | public init(tabBar: ParentObject) {
29 | self.tabBar = tabBar
30 | super.init(parentObject: tabBar, delegateProxy: RxTabBarControllerDelegateProxy.self)
31 | }
32 |
33 | // Register known implementations
34 | public static func registerKnownImplementations() {
35 | self.register { RxTabBarControllerDelegateProxy(tabBar: $0) }
36 | }
37 | }
38 |
39 | #endif
40 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTabBarDelegateProxy.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxTabBarDelegateProxy.swift
3 | // RxCocoa
4 | //
5 | // Created by Jesse Farless on 5/14/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 |
11 | import UIKit
12 | import RxSwift
13 |
14 | extension UITabBar: HasDelegate {
15 | public typealias Delegate = UITabBarDelegate
16 | }
17 |
18 | /// For more information take a look at `DelegateProxyType`.
19 | open class RxTabBarDelegateProxy
20 | : DelegateProxy
21 | , DelegateProxyType
22 | , UITabBarDelegate {
23 |
24 | /// Typed parent object.
25 | public weak private(set) var tabBar: UITabBar?
26 |
27 | /// - parameter tabBar: Parent object for delegate proxy.
28 | public init(tabBar: ParentObject) {
29 | self.tabBar = tabBar
30 | super.init(parentObject: tabBar, delegateProxy: RxTabBarDelegateProxy.self)
31 | }
32 |
33 | // Register known implementations
34 | public static func registerKnownImplementations() {
35 | self.register { RxTabBarDelegateProxy(tabBar: $0) }
36 | }
37 |
38 | /// For more information take a look at `DelegateProxyType`.
39 | open class func currentDelegate(for object: ParentObject) -> UITabBarDelegate? {
40 | object.delegate
41 | }
42 |
43 | /// For more information take a look at `DelegateProxyType`.
44 | open class func setCurrentDelegate(_ delegate: UITabBarDelegate?, to object: ParentObject) {
45 | object.delegate = delegate
46 | }
47 | }
48 |
49 | #endif
50 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTableViewDelegateProxy.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxTableViewDelegateProxy.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 6/15/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 |
11 | import UIKit
12 | import RxSwift
13 |
14 | /// For more information take a look at `DelegateProxyType`.
15 | open class RxTableViewDelegateProxy
16 | : RxScrollViewDelegateProxy
17 | , UITableViewDelegate {
18 |
19 | /// Typed parent object.
20 | public weak private(set) var tableView: UITableView?
21 |
22 | /// - parameter tableView: Parent object for delegate proxy.
23 | public init(tableView: UITableView) {
24 | self.tableView = tableView
25 | super.init(scrollView: tableView)
26 | }
27 |
28 | }
29 |
30 | #endif
31 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTextStorageDelegateProxy.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxTextStorageDelegateProxy.swift
3 | // RxCocoa
4 | //
5 | // Created by Segii Shulga on 12/30/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 |
11 | import RxSwift
12 | import UIKit
13 |
14 | extension NSTextStorage: HasDelegate {
15 | public typealias Delegate = NSTextStorageDelegate
16 | }
17 |
18 | open class RxTextStorageDelegateProxy
19 | : DelegateProxy
20 | , DelegateProxyType
21 | , NSTextStorageDelegate {
22 |
23 | /// Typed parent object.
24 | public weak private(set) var textStorage: NSTextStorage?
25 |
26 | /// - parameter textStorage: Parent object for delegate proxy.
27 | public init(textStorage: NSTextStorage) {
28 | self.textStorage = textStorage
29 | super.init(parentObject: textStorage, delegateProxy: RxTextStorageDelegateProxy.self)
30 | }
31 |
32 | // Register known implementations
33 | public static func registerKnownImplementations() {
34 | self.register { RxTextStorageDelegateProxy(textStorage: $0) }
35 | }
36 | }
37 | #endif
38 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTextViewDelegateProxy.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxTextViewDelegateProxy.swift
3 | // RxCocoa
4 | //
5 | // Created by Yuta ToKoRo on 7/19/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 |
11 | import UIKit
12 | import RxSwift
13 |
14 | /// For more information take a look at `DelegateProxyType`.
15 | open class RxTextViewDelegateProxy
16 | : RxScrollViewDelegateProxy
17 | , UITextViewDelegate {
18 |
19 | /// Typed parent object.
20 | public weak private(set) var textView: UITextView?
21 |
22 | /// - parameter textview: Parent object for delegate proxy.
23 | public init(textView: UITextView) {
24 | self.textView = textView
25 | super.init(scrollView: textView)
26 | }
27 |
28 | // MARK: delegate methods
29 |
30 | /// For more information take a look at `DelegateProxyType`.
31 | @objc open func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
32 | /**
33 | We've had some issues with observing text changes. This is here just in case we need the same hack in future and that
34 | we wouldn't need to change the public interface.
35 | */
36 | let forwardToDelegate = self.forwardToDelegate() as? UITextViewDelegate
37 | return forwardToDelegate?.textView?(textView,
38 | shouldChangeTextIn: range,
39 | replacementText: text) ?? true
40 | }
41 | }
42 |
43 | #endif
44 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxWKNavigationDelegateProxy.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxWKNavigationDelegateProxy.swift
3 | // RxCocoa
4 | //
5 | // Created by Giuseppe Lanza on 14/02/2020.
6 | // Copyright © 2020 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(macOS)
10 |
11 | import RxSwift
12 | import WebKit
13 |
14 | @available(iOS 8.0, OSX 10.10, OSXApplicationExtension 10.10, *)
15 | open class RxWKNavigationDelegateProxy
16 | : DelegateProxy
17 | , DelegateProxyType
18 | , WKNavigationDelegate {
19 |
20 | /// Typed parent object.
21 | public weak private(set) var webView: WKWebView?
22 |
23 | /// - parameter webView: Parent object for delegate proxy.
24 | public init(webView: ParentObject) {
25 | self.webView = webView
26 | super.init(parentObject: webView, delegateProxy: RxWKNavigationDelegateProxy.self)
27 | }
28 |
29 | // Register known implementations
30 | public static func registerKnownImplementations() {
31 | self.register { RxWKNavigationDelegateProxy(webView: $0) }
32 | }
33 |
34 | public static func currentDelegate(for object: WKWebView) -> WKNavigationDelegate? {
35 | object.navigationDelegate
36 | }
37 |
38 | public static func setCurrentDelegate(_ delegate: WKNavigationDelegate?, to object: WKWebView) {
39 | object.navigationDelegate = delegate
40 | }
41 | }
42 |
43 | #endif
44 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/UIActivityIndicatorView+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIActivityIndicatorView+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Ivan Persidskiy on 02/12/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 |
11 | import UIKit
12 | import RxSwift
13 |
14 | extension Reactive where Base: UIActivityIndicatorView {
15 | /// Bindable sink for `startAnimating()`, `stopAnimating()` methods.
16 | public var isAnimating: Binder {
17 | Binder(self.base) { activityIndicator, active in
18 | if active {
19 | activityIndicator.startAnimating()
20 | } else {
21 | activityIndicator.stopAnimating()
22 | }
23 | }
24 | }
25 | }
26 |
27 | #endif
28 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/UIDatePicker+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIDatePicker+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Daniel Tartaglia on 5/31/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS)
10 |
11 | import RxSwift
12 | import UIKit
13 |
14 | extension Reactive where Base: UIDatePicker {
15 | /// Reactive wrapper for `date` property.
16 | public var date: ControlProperty {
17 | value
18 | }
19 |
20 | /// Reactive wrapper for `date` property.
21 | public var value: ControlProperty {
22 | return base.rx.controlPropertyWithDefaultEvents(
23 | getter: { datePicker in
24 | datePicker.date
25 | }, setter: { datePicker, value in
26 | datePicker.date = value
27 | }
28 | )
29 | }
30 |
31 | /// Reactive wrapper for `countDownDuration` property.
32 | public var countDownDuration: ControlProperty {
33 | return base.rx.controlPropertyWithDefaultEvents(
34 | getter: { datePicker in
35 | datePicker.countDownDuration
36 | }, setter: { datePicker, value in
37 | datePicker.countDownDuration = value
38 | }
39 | )
40 | }
41 | }
42 |
43 | #endif
44 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/UINavigationController+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UINavigationController+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Diogo on 13/04/17.
6 | // Copyright © 2017 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 |
11 | import RxSwift
12 | import UIKit
13 |
14 | extension Reactive where Base: UINavigationController {
15 | public typealias ShowEvent = (viewController: UIViewController, animated: Bool)
16 |
17 | /// Reactive wrapper for `delegate`.
18 | ///
19 | /// For more information take a look at `DelegateProxyType` protocol documentation.
20 | public var delegate: DelegateProxy {
21 | RxNavigationControllerDelegateProxy.proxy(for: base)
22 | }
23 |
24 | /// Reactive wrapper for delegate method `navigationController(:willShow:animated:)`.
25 | public var willShow: ControlEvent {
26 | let source: Observable = delegate
27 | .methodInvoked(#selector(UINavigationControllerDelegate.navigationController(_:willShow:animated:)))
28 | .map { arg in
29 | let viewController = try castOrThrow(UIViewController.self, arg[1])
30 | let animated = try castOrThrow(Bool.self, arg[2])
31 | return (viewController, animated)
32 | }
33 | return ControlEvent(events: source)
34 | }
35 |
36 | /// Reactive wrapper for delegate method `navigationController(:didShow:animated:)`.
37 | public var didShow: ControlEvent {
38 | let source: Observable = delegate
39 | .methodInvoked(#selector(UINavigationControllerDelegate.navigationController(_:didShow:animated:)))
40 | .map { arg in
41 | let viewController = try castOrThrow(UIViewController.self, arg[1])
42 | let animated = try castOrThrow(Bool.self, arg[2])
43 | return (viewController, animated)
44 | }
45 | return ControlEvent(events: source)
46 | }
47 | }
48 |
49 | #endif
50 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/UIRefreshControl+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIRefreshControl+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Yosuke Ishikawa on 1/31/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS)
10 |
11 | import UIKit
12 | import RxSwift
13 |
14 | extension Reactive where Base: UIRefreshControl {
15 | /// Bindable sink for `beginRefreshing()`, `endRefreshing()` methods.
16 | public var isRefreshing: Binder {
17 | return Binder(self.base) { refreshControl, refresh in
18 | if refresh {
19 | refreshControl.beginRefreshing()
20 | } else {
21 | refreshControl.endRefreshing()
22 | }
23 | }
24 | }
25 |
26 | }
27 |
28 | #endif
29 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/UISegmentedControl+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UISegmentedControl+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Carlos García on 8/7/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 |
11 | import UIKit
12 | import RxSwift
13 |
14 | extension Reactive where Base: UISegmentedControl {
15 | /// Reactive wrapper for `selectedSegmentIndex` property.
16 | public var selectedSegmentIndex: ControlProperty {
17 | value
18 | }
19 |
20 | /// Reactive wrapper for `selectedSegmentIndex` property.
21 | public var value: ControlProperty {
22 | return base.rx.controlPropertyWithDefaultEvents(
23 | getter: { segmentedControl in
24 | segmentedControl.selectedSegmentIndex
25 | }, setter: { segmentedControl, value in
26 | segmentedControl.selectedSegmentIndex = value
27 | }
28 | )
29 | }
30 |
31 | /// Reactive wrapper for `setEnabled(_:forSegmentAt:)`
32 | public func enabledForSegment(at index: Int) -> Binder {
33 | return Binder(self.base) { segmentedControl, segmentEnabled -> Void in
34 | segmentedControl.setEnabled(segmentEnabled, forSegmentAt: index)
35 | }
36 | }
37 |
38 | /// Reactive wrapper for `setTitle(_:forSegmentAt:)`
39 | public func titleForSegment(at index: Int) -> Binder {
40 | return Binder(self.base) { segmentedControl, title -> Void in
41 | segmentedControl.setTitle(title, forSegmentAt: index)
42 | }
43 | }
44 |
45 | /// Reactive wrapper for `setImage(_:forSegmentAt:)`
46 | public func imageForSegment(at index: Int) -> Binder {
47 | return Binder(self.base) { segmentedControl, image -> Void in
48 | segmentedControl.setImage(image, forSegmentAt: index)
49 | }
50 | }
51 |
52 | }
53 |
54 | #endif
55 |
--------------------------------------------------------------------------------
/Pods/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 © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS)
10 |
11 | import RxSwift
12 | import UIKit
13 |
14 | extension Reactive where Base: UISlider {
15 |
16 | /// Reactive wrapper for `value` property.
17 | public var value: ControlProperty {
18 | return base.rx.controlPropertyWithDefaultEvents(
19 | getter: { slider in
20 | slider.value
21 | }, setter: { slider, value in
22 | slider.value = value
23 | }
24 | )
25 | }
26 |
27 | }
28 |
29 | #endif
30 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/UIStepper+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UIStepper+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Yuta ToKoRo on 9/1/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS)
10 |
11 | import UIKit
12 | import RxSwift
13 |
14 | extension Reactive where Base: UIStepper {
15 |
16 | /// Reactive wrapper for `value` property.
17 | public var value: ControlProperty {
18 | return base.rx.controlPropertyWithDefaultEvents(
19 | getter: { stepper in
20 | stepper.value
21 | }, setter: { stepper, value in
22 | stepper.value = value
23 | }
24 | )
25 | }
26 | }
27 |
28 | #endif
29 |
30 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/iOS/UISwitch+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // UISwitch+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Carlos García on 8/7/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS)
10 |
11 | import UIKit
12 | import RxSwift
13 |
14 | extension Reactive where Base: UISwitch {
15 |
16 | /// Reactive wrapper for `isOn` property.
17 | public var isOn: ControlProperty {
18 | value
19 | }
20 |
21 | /// Reactive wrapper for `isOn` property.
22 | ///
23 | /// ⚠️ Versions prior to iOS 10.2 were leaking `UISwitch`'s, so on those versions
24 | /// underlying observable sequence won't complete when nothing holds a strong reference
25 | /// to `UISwitch`.
26 | public var value: ControlProperty {
27 | return base.rx.controlPropertyWithDefaultEvents(
28 | getter: { uiSwitch in
29 | uiSwitch.isOn
30 | }, setter: { uiSwitch, value in
31 | uiSwitch.isOn = value
32 | }
33 | )
34 | }
35 |
36 | }
37 |
38 | #endif
39 |
--------------------------------------------------------------------------------
/Pods/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 © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 |
11 | import RxSwift
12 | import UIKit
13 |
14 | extension Reactive where Base: UITextField {
15 | /// Reactive wrapper for `text` property.
16 | public var text: ControlProperty {
17 | value
18 | }
19 |
20 | /// Reactive wrapper for `text` property.
21 | public var value: ControlProperty {
22 | return base.rx.controlPropertyWithDefaultEvents(
23 | getter: { textField in
24 | textField.text
25 | },
26 | setter: { textField, value in
27 | // This check is important because setting text value always clears control state
28 | // including marked text selection which is imporant for proper input
29 | // when IME input method is used.
30 | if textField.text != value {
31 | textField.text = value
32 | }
33 | }
34 | )
35 | }
36 |
37 | /// Bindable sink for `attributedText` property.
38 | public var attributedText: ControlProperty {
39 | return base.rx.controlPropertyWithDefaultEvents(
40 | getter: { textField in
41 | textField.attributedText
42 | },
43 | setter: { textField, value in
44 | // This check is important because setting text value always clears control state
45 | // including marked text selection which is imporant for proper input
46 | // when IME input method is used.
47 | if textField.attributedText != value {
48 | textField.attributedText = value
49 | }
50 | }
51 | )
52 | }
53 | }
54 |
55 | #endif
56 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/macOS/NSButton+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NSButton+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 5/17/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(macOS)
10 |
11 | import RxSwift
12 | import Cocoa
13 |
14 | extension Reactive where Base: NSButton {
15 |
16 | /// Reactive wrapper for control event.
17 | public var tap: ControlEvent {
18 | self.controlEvent
19 | }
20 |
21 | /// Reactive wrapper for `state` property`.
22 | public var state: ControlProperty {
23 | return self.base.rx.controlProperty(
24 | getter: { control in
25 | return control.state
26 | }, setter: { (control: NSButton, state: NSControl.StateValue) in
27 | control.state = state
28 | }
29 | )
30 | }
31 | }
32 |
33 | #endif
34 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/macOS/NSSlider+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NSSlider+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Junior B. on 24/05/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(macOS)
10 |
11 | import RxSwift
12 | import Cocoa
13 |
14 | extension Reactive where Base: NSSlider {
15 |
16 | /// Reactive wrapper for `value` property.
17 | public var value: ControlProperty {
18 | return self.base.rx.controlProperty(
19 | getter: { control -> Double in
20 | return control.doubleValue
21 | },
22 | setter: { control, value in
23 | control.doubleValue = value
24 | }
25 | )
26 | }
27 |
28 | }
29 |
30 | #endif
31 |
--------------------------------------------------------------------------------
/Pods/RxCocoa/RxCocoa/macOS/NSView+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NSView+Rx.swift
3 | // RxCocoa
4 | //
5 | // Created by Krunoslav Zaher on 12/6/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(macOS)
10 | import Cocoa
11 | import RxSwift
12 |
13 | extension Reactive where Base: NSView {
14 | /// Bindable sink for `alphaValue` property.
15 | public var alpha: Binder {
16 | return Binder(self.base) { view, value in
17 | view.alphaValue = value
18 | }
19 | }
20 | }
21 | #endif
22 |
--------------------------------------------------------------------------------
/Pods/RxDataSources/LICENSE.md:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 RxSwift Community
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/RxDataSources/Sources/RxDataSources/AnimationConfiguration.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AnimationConfiguration.swift
3 | // RxDataSources
4 | //
5 | // Created by Esteban Torres on 5/2/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 | import Foundation
11 | import UIKit
12 |
13 | /**
14 | Exposes custom animation styles for insertion, deletion and reloading behavior.
15 | */
16 | public struct AnimationConfiguration {
17 | public let insertAnimation: UITableView.RowAnimation
18 | public let reloadAnimation: UITableView.RowAnimation
19 | public let deleteAnimation: UITableView.RowAnimation
20 |
21 | public init(insertAnimation: UITableView.RowAnimation = .automatic,
22 | reloadAnimation: UITableView.RowAnimation = .automatic,
23 | deleteAnimation: UITableView.RowAnimation = .automatic) {
24 | self.insertAnimation = insertAnimation
25 | self.reloadAnimation = reloadAnimation
26 | self.deleteAnimation = deleteAnimation
27 | }
28 | }
29 | #endif
30 |
--------------------------------------------------------------------------------
/Pods/RxDataSources/Sources/RxDataSources/Array+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Array+Extensions.swift
3 | // RxDataSources
4 | //
5 | // Created by Krunoslav Zaher on 4/26/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 | import Foundation
11 |
12 | extension Array where Element: SectionModelType {
13 | mutating func moveFromSourceIndexPath(_ sourceIndexPath: IndexPath, destinationIndexPath: IndexPath) {
14 | let sourceSection = self[sourceIndexPath.section]
15 | var sourceItems = sourceSection.items
16 |
17 | let sourceItem = sourceItems.remove(at: sourceIndexPath.item)
18 |
19 | let sourceSectionNew = Element(original: sourceSection, items: sourceItems)
20 | self[sourceIndexPath.section] = sourceSectionNew
21 |
22 | let destinationSection = self[destinationIndexPath.section]
23 | var destinationItems = destinationSection.items
24 | destinationItems.insert(sourceItem, at: destinationIndexPath.item)
25 |
26 | self[destinationIndexPath.section] = Element(original: destinationSection, items: destinationItems)
27 | }
28 | }
29 | #endif
30 |
--------------------------------------------------------------------------------
/Pods/RxDataSources/Sources/RxDataSources/DataSources.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DataSources.swift
3 | // RxDataSources
4 | //
5 | // Created by Krunoslav Zaher on 1/8/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | @_exported import Differentiator
12 |
13 | enum RxDataSourceError: Error {
14 | case preconditionFailed(message: String)
15 | case outOfBounds(indexPath: IndexPath)
16 | }
17 |
18 | func rxPrecondition(_ condition: Bool, _ message: @autoclosure() -> String) throws {
19 | if condition {
20 | return
21 | }
22 | rxDebugFatalError("Precondition failed")
23 |
24 | throw RxDataSourceError.preconditionFailed(message: message())
25 | }
26 |
27 | func rxDebugFatalError(_ error: Error) {
28 | rxDebugFatalError("\(error)")
29 | }
30 |
31 | func rxDebugFatalError(_ message: String) {
32 | #if DEBUG
33 | fatalError(message)
34 | #else
35 | print(message)
36 | #endif
37 | }
38 |
--------------------------------------------------------------------------------
/Pods/RxDataSources/Sources/RxDataSources/Deprecated.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Deprecated.swift
3 | // RxDataSources
4 | //
5 | // Created by Krunoslav Zaher on 10/8/17.
6 | // Copyright © 2017 kzaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 | extension CollectionViewSectionedDataSource {
11 | @available(*, deprecated, renamed: "configureSupplementaryView")
12 | public var supplementaryViewFactory: ConfigureSupplementaryView? {
13 | get {
14 | return self.configureSupplementaryView
15 | }
16 | set {
17 | self.configureSupplementaryView = newValue
18 | }
19 | }
20 | }
21 | #endif
22 |
--------------------------------------------------------------------------------
/Pods/RxDataSources/Sources/RxDataSources/FloatingPointType+IdentifiableType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // FloatingPointType+IdentifiableType.swift
3 | // RxDataSources
4 | //
5 | // Created by Krunoslav Zaher on 7/4/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | extension FloatingPoint {
12 | typealias identity = Self
13 |
14 | public var identity: Self {
15 | return self
16 | }
17 | }
18 |
19 | extension Float : IdentifiableType {
20 |
21 | }
22 |
23 | extension Double : IdentifiableType {
24 |
25 | }
26 |
--------------------------------------------------------------------------------
/Pods/RxDataSources/Sources/RxDataSources/IntegerType+IdentifiableType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // IntegerType+IdentifiableType.swift
3 | // RxDataSources
4 | //
5 | // Created by Krunoslav Zaher on 7/4/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | extension BinaryInteger {
12 | typealias identity = Self
13 |
14 | public var identity: Self {
15 | return self
16 | }
17 | }
18 |
19 | extension Int : IdentifiableType {
20 |
21 | }
22 |
23 | extension Int8 : IdentifiableType {
24 |
25 | }
26 |
27 | extension Int16 : IdentifiableType {
28 |
29 | }
30 |
31 | extension Int32 : IdentifiableType {
32 |
33 | }
34 |
35 | extension Int64 : IdentifiableType {
36 |
37 | }
38 |
39 |
40 | extension UInt : IdentifiableType {
41 |
42 | }
43 |
44 | extension UInt8 : IdentifiableType {
45 |
46 | }
47 |
48 | extension UInt16 : IdentifiableType {
49 |
50 | }
51 |
52 | extension UInt32 : IdentifiableType {
53 |
54 | }
55 |
56 | extension UInt64 : IdentifiableType {
57 |
58 | }
59 |
60 |
--------------------------------------------------------------------------------
/Pods/RxDataSources/Sources/RxDataSources/RxCollectionViewSectionedReloadDataSource.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxCollectionViewSectionedReloadDataSource.swift
3 | // RxExample
4 | //
5 | // Created by Krunoslav Zaher on 7/2/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 | import Foundation
11 | import UIKit
12 | #if !RX_NO_MODULE
13 | import RxSwift
14 | import RxCocoa
15 | #endif
16 | import Differentiator
17 |
18 | open class RxCollectionViewSectionedReloadDataSource
19 | : CollectionViewSectionedDataSource
20 | , RxCollectionViewDataSourceType {
21 |
22 | public typealias Element = [Section]
23 |
24 | open func collectionView(_ collectionView: UICollectionView, observedEvent: Event) {
25 | Binder(self) { dataSource, element in
26 | #if DEBUG
27 | dataSource._dataSourceBound = true
28 | #endif
29 | dataSource.setSections(element)
30 | collectionView.reloadData()
31 | collectionView.collectionViewLayout.invalidateLayout()
32 | }.on(observedEvent)
33 | }
34 | }
35 | #endif
36 |
--------------------------------------------------------------------------------
/Pods/RxDataSources/Sources/RxDataSources/RxTableViewSectionedReloadDataSource.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxTableViewSectionedReloadDataSource.swift
3 | // RxExample
4 | //
5 | // Created by Krunoslav Zaher on 6/27/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(iOS) || os(tvOS)
10 | import Foundation
11 | import UIKit
12 | #if !RX_NO_MODULE
13 | import RxSwift
14 | import RxCocoa
15 | #endif
16 | import Differentiator
17 |
18 | open class RxTableViewSectionedReloadDataSource
19 | : TableViewSectionedDataSource
20 | , RxTableViewDataSourceType {
21 | public typealias Element = [Section]
22 |
23 | open func tableView(_ tableView: UITableView, observedEvent: Event) {
24 | Binder(self) { dataSource, element in
25 | #if DEBUG
26 | dataSource._dataSourceBound = true
27 | #endif
28 | dataSource.setSections(element)
29 | tableView.reloadData()
30 | }.on(observedEvent)
31 | }
32 | }
33 | #endif
34 |
--------------------------------------------------------------------------------
/Pods/RxDataSources/Sources/RxDataSources/String+IdentifiableType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+IdentifiableType.swift
3 | // RxDataSources
4 | //
5 | // Created by Krunoslav Zaher on 7/4/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | extension String : IdentifiableType {
12 | public typealias Identity = String
13 |
14 | public var identity: String {
15 | return self
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/Pods/RxDataSources/Sources/RxDataSources/ViewTransition.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewTransition.swift
3 | // RxDataSources
4 | //
5 | // Created by Krunoslav Zaher on 10/22/17.
6 | // Copyright © 2017 kzaher. All rights reserved.
7 | //
8 |
9 | /// Transition between two view states
10 | public enum ViewTransition {
11 | /// animated transition
12 | case animated
13 | /// refresh view without animations
14 | case reload
15 | }
16 |
17 |
--------------------------------------------------------------------------------
/Pods/RxRelay/LICENSE.md:
--------------------------------------------------------------------------------
1 | **The MIT License**
2 | **Copyright © 2015 Krunoslav Zaher, Shai Mishali**
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.
10 |
--------------------------------------------------------------------------------
/Pods/RxRelay/RxRelay/BehaviorRelay.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BehaviorRelay.swift
3 | // RxRelay
4 | //
5 | // Created by Krunoslav Zaher on 10/7/17.
6 | // Copyright © 2017 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import RxSwift
10 |
11 | /// BehaviorRelay is a wrapper for `BehaviorSubject`.
12 | ///
13 | /// Unlike `BehaviorSubject` it can't terminate with error or completed.
14 | public final class BehaviorRelay: ObservableType {
15 | private let subject: BehaviorSubject
16 |
17 | /// Accepts `event` and emits it to subscribers
18 | public func accept(_ event: Element) {
19 | self.subject.onNext(event)
20 | }
21 |
22 | /// Current value of behavior subject
23 | public var value: Element {
24 | // this try! is ok because subject can't error out or be disposed
25 | return try! self.subject.value()
26 | }
27 |
28 | /// Initializes behavior relay with initial value.
29 | public init(value: Element) {
30 | self.subject = BehaviorSubject(value: value)
31 | }
32 |
33 | /// Subscribes observer
34 | public func subscribe(_ observer: Observer) -> Disposable where Observer.Element == Element {
35 | self.subject.subscribe(observer)
36 | }
37 |
38 | /// - returns: Canonical interface for push style sequence
39 | public func asObservable() -> Observable {
40 | self.subject.asObservable()
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/Pods/RxRelay/RxRelay/PublishRelay.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PublishRelay.swift
3 | // RxRelay
4 | //
5 | // Created by Krunoslav Zaher on 3/28/15.
6 | // Copyright © 2017 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import RxSwift
10 |
11 | /// PublishRelay is a wrapper for `PublishSubject`.
12 | ///
13 | /// Unlike `PublishSubject` it can't terminate with error or completed.
14 | public final class PublishRelay: ObservableType {
15 | private let subject: PublishSubject
16 |
17 | // Accepts `event` and emits it to subscribers
18 | public func accept(_ event: Element) {
19 | self.subject.onNext(event)
20 | }
21 |
22 | /// Initializes with internal empty subject.
23 | public init() {
24 | self.subject = PublishSubject()
25 | }
26 |
27 | /// Subscribes observer
28 | public func subscribe(_ observer: Observer) -> Disposable where Observer.Element == Element {
29 | self.subject.subscribe(observer)
30 | }
31 |
32 | /// - returns: Canonical interface for push style sequence
33 | public func asObservable() -> Observable {
34 | self.subject.asObservable()
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Pods/RxRelay/RxRelay/ReplayRelay.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ReplayRelay.swift
3 | // RxRelay
4 | //
5 | // Created by Zsolt Kovacs on 12/22/19.
6 | // Copyright © 2019 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import RxSwift
10 |
11 | /// ReplayRelay is a wrapper for `ReplaySubject`.
12 | ///
13 | /// Unlike `ReplaySubject` it can't terminate with an error or complete.
14 | public final class ReplayRelay: ObservableType {
15 | private let subject: ReplaySubject
16 |
17 | // Accepts `event` and emits it to subscribers
18 | public func accept(_ event: Element) {
19 | self.subject.onNext(event)
20 | }
21 |
22 | private init(subject: ReplaySubject) {
23 | self.subject = subject
24 | }
25 |
26 | /// Creates new instance of `ReplayRelay` that replays at most `bufferSize` last elements sent to it.
27 | ///
28 | /// - parameter bufferSize: Maximal number of elements to replay to observers after subscription.
29 | /// - returns: New instance of replay relay.
30 | public static func create(bufferSize: Int) -> ReplayRelay {
31 | ReplayRelay(subject: ReplaySubject.create(bufferSize: bufferSize))
32 | }
33 |
34 | /// Creates a new instance of `ReplayRelay` that buffers all the sent to it.
35 | /// To avoid filling up memory, developer needs to make sure that the use case will only ever store a 'reasonable'
36 | /// number of elements.
37 | public static func createUnbound() -> ReplayRelay {
38 | ReplayRelay(subject: ReplaySubject.createUnbounded())
39 | }
40 |
41 | /// Subscribes observer
42 | public func subscribe(_ observer: Observer) -> Disposable where Observer.Element == Element {
43 | self.subject.subscribe(observer)
44 | }
45 |
46 | /// - returns: Canonical interface for push style sequence
47 | public func asObservable() -> Observable {
48 | self.subject.asObserver()
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/Pods/RxRelay/RxRelay/Utils.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Utils.swift
3 | // RxRelay
4 | //
5 | // Created by Shai Mishali on 09/04/2019.
6 | // Copyright © 2019 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | func rxFatalErrorInDebug(_ lastMessage: @autoclosure () -> String, file: StaticString = #file, line: UInt = #line) {
12 | #if DEBUG
13 | fatalError(lastMessage(), file: file, line: line)
14 | #else
15 | print("\(file):\(line): \(lastMessage())")
16 | #endif
17 | }
18 |
--------------------------------------------------------------------------------
/Pods/RxSwift/LICENSE.md:
--------------------------------------------------------------------------------
1 | **The MIT License**
2 | **Copyright © 2015 Krunoslav Zaher, Shai Mishali**
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.
10 |
--------------------------------------------------------------------------------
/Pods/RxSwift/Platform/AtomicInt.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AtomicInt.swift
3 | // Platform
4 | //
5 | // Created by Krunoslav Zaher on 10/28/18.
6 | // Copyright © 2018 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | final class AtomicInt: NSLock {
12 | fileprivate var value: Int32
13 | public init(_ value: Int32 = 0) {
14 | self.value = value
15 | }
16 | }
17 |
18 | @discardableResult
19 | @inline(__always)
20 | func add(_ this: AtomicInt, _ value: Int32) -> Int32 {
21 | this.lock()
22 | let oldValue = this.value
23 | this.value += value
24 | this.unlock()
25 | return oldValue
26 | }
27 |
28 | @discardableResult
29 | @inline(__always)
30 | func sub(_ this: AtomicInt, _ value: Int32) -> Int32 {
31 | this.lock()
32 | let oldValue = this.value
33 | this.value -= value
34 | this.unlock()
35 | return oldValue
36 | }
37 |
38 | @discardableResult
39 | @inline(__always)
40 | func fetchOr(_ this: AtomicInt, _ mask: Int32) -> Int32 {
41 | this.lock()
42 | let oldValue = this.value
43 | this.value |= mask
44 | this.unlock()
45 | return oldValue
46 | }
47 |
48 | @inline(__always)
49 | func load(_ this: AtomicInt) -> Int32 {
50 | this.lock()
51 | let oldValue = this.value
52 | this.unlock()
53 | return oldValue
54 | }
55 |
56 | @discardableResult
57 | @inline(__always)
58 | func increment(_ this: AtomicInt) -> Int32 {
59 | add(this, 1)
60 | }
61 |
62 | @discardableResult
63 | @inline(__always)
64 | func decrement(_ this: AtomicInt) -> Int32 {
65 | sub(this, 1)
66 | }
67 |
68 | @inline(__always)
69 | func isFlagSet(_ this: AtomicInt, _ mask: Int32) -> Bool {
70 | (load(this) & mask) != 0
71 | }
72 |
--------------------------------------------------------------------------------
/Pods/RxSwift/Platform/DataStructures/InfiniteSequence.swift:
--------------------------------------------------------------------------------
1 | //
2 | // InfiniteSequence.swift
3 | // Platform
4 | //
5 | // Created by Krunoslav Zaher on 6/13/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Sequence that repeats `repeatedValue` infinite number of times.
10 | struct InfiniteSequence : Sequence {
11 | typealias Iterator = AnyIterator
12 |
13 | private let repeatedValue: Element
14 |
15 | init(repeatedValue: Element) {
16 | self.repeatedValue = repeatedValue
17 | }
18 |
19 | func makeIterator() -> Iterator {
20 | let repeatedValue = self.repeatedValue
21 | return AnyIterator { repeatedValue }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Pods/RxSwift/Platform/DispatchQueue+Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DispatchQueue+Extensions.swift
3 | // Platform
4 | //
5 | // Created by Krunoslav Zaher on 10/22/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Dispatch
10 |
11 | extension DispatchQueue {
12 | private static var token: DispatchSpecificKey<()> = {
13 | let key = DispatchSpecificKey<()>()
14 | DispatchQueue.main.setSpecific(key: key, value: ())
15 | return key
16 | }()
17 |
18 | static var isMain: Bool {
19 | DispatchQueue.getSpecific(key: token) != nil
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Pods/RxSwift/Platform/Platform.Darwin.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Platform.Darwin.swift
3 | // Platform
4 | //
5 | // Created by Krunoslav Zaher on 12/29/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)
10 |
11 | import Darwin
12 | import Foundation
13 |
14 | extension Thread {
15 | static func setThreadLocalStorageValue(_ value: T?, forKey key: NSCopying) {
16 | let currentThread = Thread.current
17 | let threadDictionary = currentThread.threadDictionary
18 |
19 | if let newValue = value {
20 | threadDictionary[key] = newValue
21 | }
22 | else {
23 | threadDictionary[key] = nil
24 | }
25 | }
26 |
27 | static func getThreadLocalStorageValueForKey(_ key: NSCopying) -> T? {
28 | let currentThread = Thread.current
29 | let threadDictionary = currentThread.threadDictionary
30 |
31 | return threadDictionary[key] as? T
32 | }
33 | }
34 |
35 | #endif
36 |
--------------------------------------------------------------------------------
/Pods/RxSwift/Platform/Platform.Linux.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Platform.Linux.swift
3 | // Platform
4 | //
5 | // Created by Krunoslav Zaher on 12/29/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(Linux)
10 |
11 | import Foundation
12 |
13 | extension Thread {
14 |
15 | static func setThreadLocalStorageValue(_ value: T?, forKey key: String) {
16 | if let newValue = value {
17 | Thread.current.threadDictionary[key] = newValue
18 | }
19 | else {
20 | Thread.current.threadDictionary[key] = nil
21 | }
22 | }
23 |
24 | static func getThreadLocalStorageValueForKey(_ key: String) -> T? {
25 | let currentThread = Thread.current
26 | let threadDictionary = currentThread.threadDictionary
27 |
28 | return threadDictionary[key] as? T
29 | }
30 | }
31 |
32 | #endif
33 |
--------------------------------------------------------------------------------
/Pods/RxSwift/Platform/RecursiveLock.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RecursiveLock.swift
3 | // Platform
4 | //
5 | // Created by Krunoslav Zaher on 12/18/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | #if TRACE_RESOURCES
12 | class RecursiveLock: NSRecursiveLock {
13 | override init() {
14 | _ = Resources.incrementTotal()
15 | super.init()
16 | }
17 |
18 | override func lock() {
19 | super.lock()
20 | _ = Resources.incrementTotal()
21 | }
22 |
23 | override func unlock() {
24 | super.unlock()
25 | _ = Resources.decrementTotal()
26 | }
27 |
28 | deinit {
29 | _ = Resources.decrementTotal()
30 | }
31 | }
32 | #else
33 | typealias RecursiveLock = NSRecursiveLock
34 | #endif
35 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Cancelable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Cancelable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 3/12/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents disposable resource with state tracking.
10 | public protocol Cancelable : Disposable {
11 | /// Was resource disposed.
12 | var isDisposed: Bool { get }
13 | }
14 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Concurrency/Lock.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Lock.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 3/31/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | protocol Lock {
10 | func lock()
11 | func unlock()
12 | }
13 |
14 | // https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20151214/000321.html
15 | typealias SpinLock = RecursiveLock
16 |
17 | extension RecursiveLock : Lock {
18 | @inline(__always)
19 | final func performLocked(_ action: () -> T) -> T {
20 | self.lock(); defer { self.unlock() }
21 | return action()
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Concurrency/LockOwnerType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // LockOwnerType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 10/25/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | protocol LockOwnerType: AnyObject, Lock {
10 | var lock: RecursiveLock { get }
11 | }
12 |
13 | extension LockOwnerType {
14 | func lock() { self.lock.lock() }
15 | func unlock() { self.lock.unlock() }
16 | }
17 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Concurrency/SynchronizedDisposeType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SynchronizedDisposeType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 10/25/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | protocol SynchronizedDisposeType: AnyObject, Disposable, Lock {
10 | func synchronized_dispose()
11 | }
12 |
13 | extension SynchronizedDisposeType {
14 | func synchronizedDispose() {
15 | self.lock(); defer { self.unlock() }
16 | self.synchronized_dispose()
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Concurrency/SynchronizedOnType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SynchronizedOnType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 10/25/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | protocol SynchronizedOnType: AnyObject, ObserverType, Lock {
10 | func synchronized_on(_ event: Event)
11 | }
12 |
13 | extension SynchronizedOnType {
14 | func synchronizedOn(_ event: Event) {
15 | self.lock(); defer { self.unlock() }
16 | self.synchronized_on(event)
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Concurrency/SynchronizedUnsubscribeType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SynchronizedUnsubscribeType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 10/25/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | protocol SynchronizedUnsubscribeType: AnyObject {
10 | associatedtype DisposeKey
11 |
12 | func synchronizedUnsubscribe(_ disposeKey: DisposeKey)
13 | }
14 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/ConnectableObservableType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ConnectableObservableType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 3/1/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /**
10 | Represents an observable sequence wrapper that can be connected and disconnected from its underlying observable sequence.
11 | */
12 | public protocol ConnectableObservableType : ObservableType {
13 | /**
14 | Connects the observable wrapper to its source. All subscribed observers will receive values from the underlying observable sequence as long as the connection is established.
15 |
16 | - returns: Disposable used to disconnect the observable wrapper from its source, causing subscribed observer to stop receiving values from the underlying observable sequence.
17 | */
18 | func connect() -> Disposable
19 | }
20 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Disposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Disposable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/8/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents a disposable resource.
10 | public protocol Disposable {
11 | /// Dispose resource.
12 | func dispose()
13 | }
14 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Disposables/BinaryDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BinaryDisposable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 6/12/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents two disposable resources that are disposed together.
10 | private final class BinaryDisposable : DisposeBase, Cancelable {
11 |
12 | private let disposed = AtomicInt(0)
13 |
14 | // state
15 | private var disposable1: Disposable?
16 | private var disposable2: Disposable?
17 |
18 | /// - returns: Was resource disposed.
19 | var isDisposed: Bool {
20 | isFlagSet(self.disposed, 1)
21 | }
22 |
23 | /// Constructs new binary disposable from two disposables.
24 | ///
25 | /// - parameter disposable1: First disposable
26 | /// - parameter disposable2: Second disposable
27 | init(_ disposable1: Disposable, _ disposable2: Disposable) {
28 | self.disposable1 = disposable1
29 | self.disposable2 = disposable2
30 | super.init()
31 | }
32 |
33 | /// Calls the disposal action if and only if the current instance hasn't been disposed yet.
34 | ///
35 | /// After invoking disposal action, disposal action will be dereferenced.
36 | func dispose() {
37 | if fetchOr(self.disposed, 1) == 0 {
38 | self.disposable1?.dispose()
39 | self.disposable2?.dispose()
40 | self.disposable1 = nil
41 | self.disposable2 = nil
42 | }
43 | }
44 | }
45 |
46 | extension Disposables {
47 |
48 | /// Creates a disposable with the given disposables.
49 | public static func create(_ disposable1: Disposable, _ disposable2: Disposable) -> Cancelable {
50 | BinaryDisposable(disposable1, disposable2)
51 | }
52 |
53 | }
54 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Disposables/BooleanDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // BooleanDisposable.swift
3 | // RxSwift
4 | //
5 | // Created by Junior B. on 10/29/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents a disposable resource that can be checked for disposal status.
10 | public final class BooleanDisposable : Cancelable {
11 |
12 | internal static let BooleanDisposableTrue = BooleanDisposable(isDisposed: true)
13 | private var disposed = false
14 |
15 | /// Initializes a new instance of the `BooleanDisposable` class
16 | public init() {
17 | }
18 |
19 | /// Initializes a new instance of the `BooleanDisposable` class with given value
20 | public init(isDisposed: Bool) {
21 | self.disposed = isDisposed
22 | }
23 |
24 | /// - returns: Was resource disposed.
25 | public var isDisposed: Bool {
26 | self.disposed
27 | }
28 |
29 | /// Sets the status to disposed, which can be observer through the `isDisposed` property.
30 | public func dispose() {
31 | self.disposed = true
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Disposables/Disposables.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Disposables.swift
3 | // RxSwift
4 | //
5 | // Created by Mohsen Ramezanpoor on 01/08/2016.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// A collection of utility methods for common disposable operations.
10 | public struct Disposables {
11 | private init() {}
12 | }
13 |
14 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Disposables/DisposeBase.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DisposeBase.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 4/4/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Base class for all disposables.
10 | public class DisposeBase {
11 | init() {
12 | #if TRACE_RESOURCES
13 | _ = Resources.incrementTotal()
14 | #endif
15 | }
16 |
17 | deinit {
18 | #if TRACE_RESOURCES
19 | _ = Resources.decrementTotal()
20 | #endif
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Disposables/NopDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NopDisposable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/15/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents a disposable that does nothing on disposal.
10 | ///
11 | /// Nop = No Operation
12 | private struct NopDisposable : Disposable {
13 |
14 | fileprivate static let noOp: Disposable = NopDisposable()
15 |
16 | private init() {
17 |
18 | }
19 |
20 | /// Does nothing.
21 | public func dispose() {
22 | }
23 | }
24 |
25 | extension Disposables {
26 | /**
27 | Creates a disposable that does nothing on disposal.
28 | */
29 | static public func create() -> Disposable { NopDisposable.noOp }
30 | }
31 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Disposables/ScheduledDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ScheduledDisposable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 6/13/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | private let disposeScheduledDisposable: (ScheduledDisposable) -> Disposable = { sd in
10 | sd.disposeInner()
11 | return Disposables.create()
12 | }
13 |
14 | /// Represents a disposable resource whose disposal invocation will be scheduled on the specified scheduler.
15 | public final class ScheduledDisposable : Cancelable {
16 | public let scheduler: ImmediateSchedulerType
17 |
18 | private let disposed = AtomicInt(0)
19 |
20 | // state
21 | private var disposable: Disposable?
22 |
23 | /// - returns: Was resource disposed.
24 | public var isDisposed: Bool {
25 | isFlagSet(self.disposed, 1)
26 | }
27 |
28 | /**
29 | Initializes a new instance of the `ScheduledDisposable` that uses a `scheduler` on which to dispose the `disposable`.
30 |
31 | - parameter scheduler: Scheduler where the disposable resource will be disposed on.
32 | - parameter disposable: Disposable resource to dispose on the given scheduler.
33 | */
34 | public init(scheduler: ImmediateSchedulerType, disposable: Disposable) {
35 | self.scheduler = scheduler
36 | self.disposable = disposable
37 | }
38 |
39 | /// Disposes the wrapped disposable on the provided scheduler.
40 | public func dispose() {
41 | _ = self.scheduler.schedule(self, action: disposeScheduledDisposable)
42 | }
43 |
44 | func disposeInner() {
45 | if fetchOr(self.disposed, 1) == 0 {
46 | self.disposable!.dispose()
47 | self.disposable = nil
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Disposables/SubscriptionDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SubscriptionDisposable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 10/25/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | struct SubscriptionDisposable : Disposable {
10 | private let key: T.DisposeKey
11 | private weak var owner: T?
12 |
13 | init(owner: T, key: T.DisposeKey) {
14 | self.owner = owner
15 | self.key = key
16 | }
17 |
18 | func dispose() {
19 | self.owner?.synchronizedUnsubscribe(self.key)
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Errors.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Errors.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 3/28/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | let RxErrorDomain = "RxErrorDomain"
10 | let RxCompositeFailures = "RxCompositeFailures"
11 |
12 | /// Generic Rx error codes.
13 | public enum RxError
14 | : Swift.Error
15 | , CustomDebugStringConvertible {
16 | /// Unknown error occurred.
17 | case unknown
18 | /// Performing an action on disposed object.
19 | case disposed(object: AnyObject)
20 | /// Arithmetic overflow error.
21 | case overflow
22 | /// Argument out of range error.
23 | case argumentOutOfRange
24 | /// Sequence doesn't contain any elements.
25 | case noElements
26 | /// Sequence contains more than one element.
27 | case moreThanOneElement
28 | /// Timeout error.
29 | case timeout
30 | }
31 |
32 | extension RxError {
33 | /// A textual representation of `self`, suitable for debugging.
34 | public var debugDescription: String {
35 | switch self {
36 | case .unknown:
37 | return "Unknown error occurred."
38 | case .disposed(let object):
39 | return "Object `\(object)` was already disposed."
40 | case .overflow:
41 | return "Arithmetic overflow occurred."
42 | case .argumentOutOfRange:
43 | return "Argument out of range."
44 | case .noElements:
45 | return "Sequence doesn't contain any elements."
46 | case .moreThanOneElement:
47 | return "Sequence contains more than one element."
48 | case .timeout:
49 | return "Sequence timeout."
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Extensions/Bag+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Bag+Rx.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 10/19/16.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 |
10 | // MARK: forEach
11 |
12 | @inline(__always)
13 | func dispatch(_ bag: Bag<(Event) -> Void>, _ event: Event) {
14 | bag._value0?(event)
15 |
16 | if bag._onlyFastPath {
17 | return
18 | }
19 |
20 | let pairs = bag._pairs
21 | for i in 0 ..< pairs.count {
22 | pairs[i].value(event)
23 | }
24 |
25 | if let dictionary = bag._dictionary {
26 | for element in dictionary.values {
27 | element(event)
28 | }
29 | }
30 | }
31 |
32 | /// Dispatches `dispose` to all disposables contained inside bag.
33 | func disposeAll(in bag: Bag) {
34 | bag._value0?.dispose()
35 |
36 | if bag._onlyFastPath {
37 | return
38 | }
39 |
40 | let pairs = bag._pairs
41 | for i in 0 ..< pairs.count {
42 | pairs[i].value.dispose()
43 | }
44 |
45 | if let dictionary = bag._dictionary {
46 | for element in dictionary.values {
47 | element.dispose()
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/GroupedObservable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // GroupedObservable.swift
3 | // RxSwift
4 | //
5 | // Created by Tomi Koskinen on 01/12/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents an observable sequence of elements that have a common key.
10 | public struct GroupedObservable : ObservableType {
11 | /// Gets the common key.
12 | public let key: Key
13 |
14 | private let source: Observable
15 |
16 | /// Initializes grouped observable sequence with key and source observable sequence.
17 | ///
18 | /// - parameter key: Grouped observable sequence key
19 | /// - parameter source: Observable sequence that represents sequence of elements for the key
20 | /// - returns: Grouped observable sequence of elements for the specific key
21 | public init(key: Key, source: Observable) {
22 | self.key = key
23 | self.source = source
24 | }
25 |
26 | /// Subscribes `observer` to receive events for this sequence.
27 | public func subscribe(_ observer: Observer) -> Disposable where Observer.Element == Element {
28 | self.source.subscribe(observer)
29 | }
30 |
31 | /// Converts `self` to `Observable` sequence.
32 | public func asObservable() -> Observable {
33 | self.source
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/ImmediateSchedulerType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ImmediateSchedulerType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 5/31/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents an object that immediately schedules units of work.
10 | public protocol ImmediateSchedulerType {
11 | /**
12 | Schedules an action to be executed immediately.
13 |
14 | - parameter state: State passed to the action to be executed.
15 | - parameter action: Action to be executed.
16 | - returns: The disposable object used to cancel the scheduled action (best effort).
17 | */
18 | func schedule(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable
19 | }
20 |
21 | extension ImmediateSchedulerType {
22 | /**
23 | Schedules an action to be executed recursively.
24 |
25 | - parameter state: State passed to the action to be executed.
26 | - parameter action: Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.
27 | - returns: The disposable object used to cancel the scheduled action (best effort).
28 | */
29 | public func scheduleRecursive(_ state: State, action: @escaping (_ state: State, _ recurse: (State) -> Void) -> Void) -> Disposable {
30 | let recursiveScheduler = RecursiveImmediateScheduler(action: action, scheduler: self)
31 |
32 | recursiveScheduler.schedule(state)
33 |
34 | return Disposables.create(with: recursiveScheduler.dispose)
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Observable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Observable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/8/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// A type-erased `ObservableType`.
10 | ///
11 | /// It represents a push style sequence.
12 | public class Observable : ObservableType {
13 | init() {
14 | #if TRACE_RESOURCES
15 | _ = Resources.incrementTotal()
16 | #endif
17 | }
18 |
19 | public func subscribe(_ observer: Observer) -> Disposable where Observer.Element == Element {
20 | rxAbstractMethod()
21 | }
22 |
23 | public func asObservable() -> Observable { self }
24 |
25 | deinit {
26 | #if TRACE_RESOURCES
27 | _ = Resources.decrementTotal()
28 | #endif
29 | }
30 | }
31 |
32 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/ObservableConvertibleType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ObservableConvertibleType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 9/17/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Type that can be converted to observable sequence (`Observable`).
10 | public protocol ObservableConvertibleType {
11 | /// Type of elements in sequence.
12 | associatedtype Element
13 |
14 | /// Converts `self` to `Observable` sequence.
15 | ///
16 | /// - returns: Observable sequence that represents `self`.
17 | func asObservable() -> Observable
18 | }
19 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/ObservableType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ObservableType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 8/8/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents a push style sequence.
10 | public protocol ObservableType: ObservableConvertibleType {
11 | /**
12 | Subscribes `observer` to receive events for this sequence.
13 |
14 | ### Grammar
15 |
16 | **Next\* (Error | Completed)?**
17 |
18 | * sequences can produce zero or more elements so zero or more `Next` events can be sent to `observer`
19 | * once an `Error` or `Completed` event is sent, the sequence terminates and can't produce any other elements
20 |
21 | It is possible that events are sent from different threads, but no two events can be sent concurrently to
22 | `observer`.
23 |
24 | ### Resource Management
25 |
26 | When sequence sends `Complete` or `Error` event all internal resources that compute sequence elements
27 | will be freed.
28 |
29 | To cancel production of sequence elements and free resources immediately, call `dispose` on returned
30 | subscription.
31 |
32 | - returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources.
33 | */
34 | func subscribe(_ observer: Observer) -> Disposable where Observer.Element == Element
35 | }
36 |
37 | extension ObservableType {
38 |
39 | /// Default implementation of converting `ObservableType` to `Observable`.
40 | public func asObservable() -> Observable {
41 | // temporary workaround
42 | //return Observable.create(subscribe: self.subscribe)
43 | Observable.create { o in self.subscribe(o) }
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Observables/AddRef.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AddRef.swift
3 | // RxSwift
4 | //
5 | // Created by Junior B. on 30/10/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class AddRefSink : Sink, ObserverType {
10 | typealias Element = Observer.Element
11 |
12 | override init(observer: Observer, cancel: Cancelable) {
13 | super.init(observer: observer, cancel: cancel)
14 | }
15 |
16 | func on(_ event: Event) {
17 | switch event {
18 | case .next:
19 | self.forwardOn(event)
20 | case .completed, .error:
21 | self.forwardOn(event)
22 | self.dispose()
23 | }
24 | }
25 | }
26 |
27 | final class AddRef : Producer {
28 |
29 | private let source: Observable
30 | private let refCount: RefCountDisposable
31 |
32 | init(source: Observable, refCount: RefCountDisposable) {
33 | self.source = source
34 | self.refCount = refCount
35 | }
36 |
37 | override func run(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {
38 | let releaseDisposable = self.refCount.retain()
39 | let sink = AddRefSink(observer: observer, cancel: cancel)
40 | let subscription = Disposables.create(releaseDisposable, self.source.subscribe(sink))
41 |
42 | return (sink: sink, subscription: subscription)
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Observables/AsMaybe.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AsMaybe.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 3/12/17.
6 | // Copyright © 2017 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | private final class AsMaybeSink : Sink, ObserverType {
10 | typealias Element = Observer.Element
11 |
12 | private var element: Event?
13 |
14 | func on(_ event: Event) {
15 | switch event {
16 | case .next:
17 | if self.element != nil {
18 | self.forwardOn(.error(RxError.moreThanOneElement))
19 | self.dispose()
20 | }
21 |
22 | self.element = event
23 | case .error:
24 | self.forwardOn(event)
25 | self.dispose()
26 | case .completed:
27 | if let element = self.element {
28 | self.forwardOn(element)
29 | }
30 | self.forwardOn(.completed)
31 | self.dispose()
32 | }
33 | }
34 | }
35 |
36 | final class AsMaybe: Producer {
37 | private let source: Observable
38 |
39 | init(source: Observable) {
40 | self.source = source
41 | }
42 |
43 | override func run(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {
44 | let sink = AsMaybeSink(observer: observer, cancel: cancel)
45 | let subscription = self.source.subscribe(sink)
46 | return (sink: sink, subscription: subscription)
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Observables/AsSingle.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AsSingle.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 3/12/17.
6 | // Copyright © 2017 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | private final class AsSingleSink : Sink, ObserverType {
10 | typealias Element = Observer.Element
11 |
12 | private var element: Event?
13 |
14 | func on(_ event: Event) {
15 | switch event {
16 | case .next:
17 | if self.element != nil {
18 | self.forwardOn(.error(RxError.moreThanOneElement))
19 | self.dispose()
20 | }
21 |
22 | self.element = event
23 | case .error:
24 | self.forwardOn(event)
25 | self.dispose()
26 | case .completed:
27 | if let element = self.element {
28 | self.forwardOn(element)
29 | self.forwardOn(.completed)
30 | }
31 | else {
32 | self.forwardOn(.error(RxError.noElements))
33 | }
34 | self.dispose()
35 | }
36 | }
37 | }
38 |
39 | final class AsSingle: Producer {
40 | private let source: Observable
41 |
42 | init(source: Observable) {
43 | self.source = source
44 | }
45 |
46 | override func run(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {
47 | let sink = AsSingleSink(observer: observer, cancel: cancel)
48 | let subscription = self.source.subscribe(sink)
49 | return (sink: sink, subscription: subscription)
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Observables/Decode.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Decode.swift
3 | // RxSwift
4 | //
5 | // Created by Shai Mishali on 24/07/2020.
6 | // Copyright © 2020 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public extension ObservableType where Element == Data {
12 | /// Attempt to decode the emitted `Data` using a provided decoder.
13 | ///
14 | /// - parameter type: A `Decodable`-conforming type to attempt to decode to
15 | /// - parameter decoder: A capable decoder, e.g. `JSONDecoder` or `PropertyListDecoder`
16 | ///
17 | /// - note: If using a custom decoder, it must conform to the `DataDecoder` protocol.
18 | ///
19 | /// - returns: An `Observable` of the decoded type
20 | func decode(type: Item.Type,
22 | decoder: Decoder) -> Observable- {
23 | map { try decoder.decode(type, from: $0) }
24 | }
25 | }
26 |
27 | /// Represents an entity capable of decoding raw `Data`
28 | /// into a concrete `Decodable` type
29 | public protocol DataDecoder {
30 | func decode(_ type: Item.Type, from data: Data) throws -> Item
31 | }
32 |
33 | extension JSONDecoder: DataDecoder {}
34 | extension PropertyListDecoder: DataDecoder {}
35 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Observables/Dematerialize.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Dematerialize.swift
3 | // RxSwift
4 | //
5 | // Created by Jamie Pinkham on 3/13/17.
6 | // Copyright © 2017 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType where Element: EventConvertible {
10 | /**
11 | Convert any previously materialized Observable into it's original form.
12 | - seealso: [materialize operator on reactivex.io](http://reactivex.io/documentation/operators/materialize-dematerialize.html)
13 | - returns: The dematerialized observable sequence.
14 | */
15 | public func dematerialize() -> Observable {
16 | Dematerialize(source: self.asObservable())
17 | }
18 |
19 | }
20 |
21 | private final class DematerializeSink: Sink, ObserverType where Observer.Element == T.Element {
22 | fileprivate func on(_ event: Event) {
23 | switch event {
24 | case .next(let element):
25 | self.forwardOn(element.event)
26 | if element.event.isStopEvent {
27 | self.dispose()
28 | }
29 | case .completed:
30 | self.forwardOn(.completed)
31 | self.dispose()
32 | case .error(let error):
33 | self.forwardOn(.error(error))
34 | self.dispose()
35 | }
36 | }
37 | }
38 |
39 | final private class Dematerialize: Producer {
40 | private let source: Observable
41 |
42 | init(source: Observable) {
43 | self.source = source
44 | }
45 |
46 | override func run(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == T.Element {
47 | let sink = DematerializeSink(observer: observer, cancel: cancel)
48 | let subscription = self.source.subscribe(sink)
49 | return (sink: sink, subscription: subscription)
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Observables/Empty.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Empty.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 8/30/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType {
10 | /**
11 | Returns an empty observable sequence, using the specified scheduler to send out the single `Completed` message.
12 |
13 | - seealso: [empty operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)
14 |
15 | - returns: An observable sequence with no elements.
16 | */
17 | public static func empty() -> Observable {
18 | EmptyProducer()
19 | }
20 | }
21 |
22 | final private class EmptyProducer: Producer {
23 | override func subscribe(_ observer: Observer) -> Disposable where Observer.Element == Element {
24 | observer.on(.completed)
25 | return Disposables.create()
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Observables/Error.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Error.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 8/30/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType {
10 | /**
11 | Returns an observable sequence that terminates with an `error`.
12 |
13 | - seealso: [throw operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)
14 |
15 | - returns: The observable sequence that terminates with specified error.
16 | */
17 | public static func error(_ error: Swift.Error) -> Observable {
18 | ErrorProducer(error: error)
19 | }
20 | }
21 |
22 | final private class ErrorProducer: Producer {
23 | private let error: Swift.Error
24 |
25 | init(error: Swift.Error) {
26 | self.error = error
27 | }
28 |
29 | override func subscribe(_ observer: Observer) -> Disposable where Observer.Element == Element {
30 | observer.on(.error(self.error))
31 | return Disposables.create()
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Observables/First.swift:
--------------------------------------------------------------------------------
1 | //
2 | // First.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 7/31/17.
6 | // Copyright © 2017 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | private final class FirstSink : Sink, ObserverType where Observer.Element == Element? {
10 | typealias Parent = First
11 |
12 | func on(_ event: Event) {
13 | switch event {
14 | case .next(let value):
15 | self.forwardOn(.next(value))
16 | self.forwardOn(.completed)
17 | self.dispose()
18 | case .error(let error):
19 | self.forwardOn(.error(error))
20 | self.dispose()
21 | case .completed:
22 | self.forwardOn(.next(nil))
23 | self.forwardOn(.completed)
24 | self.dispose()
25 | }
26 | }
27 | }
28 |
29 | final class First: Producer {
30 | private let source: Observable
31 |
32 | init(source: Observable) {
33 | self.source = source
34 | }
35 |
36 | override func run(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element? {
37 | let sink = FirstSink(observer: observer, cancel: cancel)
38 | let subscription = self.source.subscribe(sink)
39 | return (sink: sink, subscription: subscription)
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Observables/Materialize.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Materialize.swift
3 | // RxSwift
4 | //
5 | // Created by sergdort on 08/03/2017.
6 | // Copyright © 2017 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType {
10 | /**
11 | Convert any Observable into an Observable of its events.
12 | - seealso: [materialize operator on reactivex.io](http://reactivex.io/documentation/operators/materialize-dematerialize.html)
13 | - returns: An observable sequence that wraps events in an Event. The returned Observable never errors, but it does complete after observing all of the events of the underlying Observable.
14 | */
15 | public func materialize() -> Observable> {
16 | Materialize(source: self.asObservable())
17 | }
18 | }
19 |
20 | private final class MaterializeSink: Sink, ObserverType where Observer.Element == Event {
21 |
22 | func on(_ event: Event) {
23 | self.forwardOn(.next(event))
24 | if event.isStopEvent {
25 | self.forwardOn(.completed)
26 | self.dispose()
27 | }
28 | }
29 | }
30 |
31 | final private class Materialize: Producer> {
32 | private let source: Observable
33 |
34 | init(source: Observable) {
35 | self.source = source
36 | }
37 |
38 | override func run(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {
39 | let sink = MaterializeSink(observer: observer, cancel: cancel)
40 | let subscription = self.source.subscribe(sink)
41 |
42 | return (sink: sink, subscription: subscription)
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Observables/Never.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Never.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 8/30/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType {
10 |
11 | /**
12 | Returns a non-terminating observable sequence, which can be used to denote an infinite duration.
13 |
14 | - seealso: [never operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)
15 |
16 | - returns: An observable sequence whose observers will never get called.
17 | */
18 | public static func never() -> Observable {
19 | NeverProducer()
20 | }
21 | }
22 |
23 | final private class NeverProducer: Producer {
24 | override func subscribe(_ observer: Observer) -> Disposable where Observer.Element == Element {
25 | Disposables.create()
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Observables/Sink.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Sink.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/19/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | class Sink: Disposable {
10 | fileprivate let observer: Observer
11 | fileprivate let cancel: Cancelable
12 | private let disposed = AtomicInt(0)
13 |
14 | #if DEBUG
15 | private let synchronizationTracker = SynchronizationTracker()
16 | #endif
17 |
18 | init(observer: Observer, cancel: Cancelable) {
19 | #if TRACE_RESOURCES
20 | _ = Resources.incrementTotal()
21 | #endif
22 | self.observer = observer
23 | self.cancel = cancel
24 | }
25 |
26 | final func forwardOn(_ event: Event) {
27 | #if DEBUG
28 | self.synchronizationTracker.register(synchronizationErrorMessage: .default)
29 | defer { self.synchronizationTracker.unregister() }
30 | #endif
31 | if isFlagSet(self.disposed, 1) {
32 | return
33 | }
34 | self.observer.on(event)
35 | }
36 |
37 | final func forwarder() -> SinkForward {
38 | SinkForward(forward: self)
39 | }
40 |
41 | final var isDisposed: Bool {
42 | isFlagSet(self.disposed, 1)
43 | }
44 |
45 | func dispose() {
46 | fetchOr(self.disposed, 1)
47 | self.cancel.dispose()
48 | }
49 |
50 | deinit {
51 | #if TRACE_RESOURCES
52 | _ = Resources.decrementTotal()
53 | #endif
54 | }
55 | }
56 |
57 | final class SinkForward: ObserverType {
58 | typealias Element = Observer.Element
59 |
60 | private let forward: Sink
61 |
62 | init(forward: Sink) {
63 | self.forward = forward
64 | }
65 |
66 | final func on(_ event: Event) {
67 | switch event {
68 | case .next:
69 | self.forward.observer.on(event)
70 | case .error, .completed:
71 | self.forward.observer.on(event)
72 | self.forward.cancel.dispose()
73 | }
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Observables/StartWith.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StartWith.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 4/6/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType {
10 |
11 | /**
12 | Prepends a sequence of values to an observable sequence.
13 |
14 | - seealso: [startWith operator on reactivex.io](http://reactivex.io/documentation/operators/startwith.html)
15 |
16 | - parameter elements: Elements to prepend to the specified sequence.
17 | - returns: The source sequence prepended with the specified values.
18 | */
19 | public func startWith(_ elements: Element ...)
20 | -> Observable {
21 | return StartWith(source: self.asObservable(), elements: elements)
22 | }
23 | }
24 |
25 | final private class StartWith: Producer {
26 | let elements: [Element]
27 | let source: Observable
28 |
29 | init(source: Observable, elements: [Element]) {
30 | self.source = source
31 | self.elements = elements
32 | super.init()
33 | }
34 |
35 | override func run(_ observer: Observer, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where Observer.Element == Element {
36 | for e in self.elements {
37 | observer.on(.next(e))
38 | }
39 |
40 | return (sink: Disposables.create(), subscription: self.source.subscribe(observer))
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/ObserverType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ObserverType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/8/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Supports push-style iteration over an observable sequence.
10 | public protocol ObserverType {
11 | /// The type of elements in sequence that observer can observe.
12 | associatedtype Element
13 |
14 | /// Notify observer about sequence event.
15 | ///
16 | /// - parameter event: Event that occurred.
17 | func on(_ event: Event)
18 | }
19 |
20 | /// Convenience API extensions to provide alternate next, error, completed events
21 | extension ObserverType {
22 |
23 | /// Convenience method equivalent to `on(.next(element: Element))`
24 | ///
25 | /// - parameter element: Next element to send to observer(s)
26 | public func onNext(_ element: Element) {
27 | self.on(.next(element))
28 | }
29 |
30 | /// Convenience method equivalent to `on(.completed)`
31 | public func onCompleted() {
32 | self.on(.completed)
33 | }
34 |
35 | /// Convenience method equivalent to `on(.error(Swift.Error))`
36 | /// - parameter error: Swift.Error to send to observer(s)
37 | public func onError(_ error: Swift.Error) {
38 | self.on(.error(error))
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Observers/AnonymousObserver.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AnonymousObserver.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/8/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | final class AnonymousObserver: ObserverBase {
10 | typealias EventHandler = (Event) -> Void
11 |
12 | private let eventHandler : EventHandler
13 |
14 | init(_ eventHandler: @escaping EventHandler) {
15 | #if TRACE_RESOURCES
16 | _ = Resources.incrementTotal()
17 | #endif
18 | self.eventHandler = eventHandler
19 | }
20 |
21 | override func onCore(_ event: Event) {
22 | self.eventHandler(event)
23 | }
24 |
25 | #if TRACE_RESOURCES
26 | deinit {
27 | _ = Resources.decrementTotal()
28 | }
29 | #endif
30 | }
31 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Observers/ObserverBase.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ObserverBase.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/15/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | class ObserverBase : Disposable, ObserverType {
10 | private let isStopped = AtomicInt(0)
11 |
12 | func on(_ event: Event) {
13 | switch event {
14 | case .next:
15 | if load(self.isStopped) == 0 {
16 | self.onCore(event)
17 | }
18 | case .error, .completed:
19 | if fetchOr(self.isStopped, 1) == 0 {
20 | self.onCore(event)
21 | }
22 | }
23 | }
24 |
25 | func onCore(_ event: Event) {
26 | rxAbstractMethod()
27 | }
28 |
29 | func dispose() {
30 | fetchOr(self.isStopped, 1)
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/RxMutableBox.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RxMutableBox.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 5/22/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | #if os(Linux)
10 | /// As Swift 5 was released, A patch to `Thread` for Linux
11 | /// changed `threadDictionary` to a `NSMutableDictionary` instead of
12 | /// a `Dictionary`: https://github.com/apple/swift-corelibs-foundation/pull/1762/files
13 | ///
14 | /// This means that on Linux specifically, `RxMutableBox` must be a `NSObject`
15 | /// or it won't be possible to store it in `Thread.threadDictionary`.
16 | ///
17 | /// For more information, read the discussion at:
18 | /// https://github.com/ReactiveX/RxSwift/issues/1911#issuecomment-479723298
19 | import Foundation
20 |
21 | /// Creates mutable reference wrapper for any type.
22 | final class RxMutableBox: NSObject {
23 | /// Wrapped value
24 | var value: T
25 |
26 | /// Creates reference wrapper for `value`.
27 | ///
28 | /// - parameter value: Value to wrap.
29 | init (_ value: T) {
30 | self.value = value
31 | }
32 | }
33 | #else
34 | /// Creates mutable reference wrapper for any type.
35 | final class RxMutableBox: CustomDebugStringConvertible {
36 | /// Wrapped value
37 | var value: T
38 |
39 | /// Creates reference wrapper for `value`.
40 | ///
41 | /// - parameter value: Value to wrap.
42 | init (_ value: T) {
43 | self.value = value
44 | }
45 | }
46 |
47 | extension RxMutableBox {
48 | /// - returns: Box description.
49 | var debugDescription: String {
50 | "MutatingBox(\(self.value))"
51 | }
52 | }
53 | #endif
54 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Schedulers/HistoricalScheduler.swift:
--------------------------------------------------------------------------------
1 | //
2 | // HistoricalScheduler.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 12/27/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | /// Provides a virtual time scheduler that uses `Date` for absolute time and `NSTimeInterval` for relative time.
12 | public class HistoricalScheduler : VirtualTimeScheduler {
13 |
14 | /**
15 | Creates a new historical scheduler with initial clock value.
16 |
17 | - parameter initialClock: Initial value for virtual clock.
18 | */
19 | public init(initialClock: RxTime = Date(timeIntervalSince1970: 0)) {
20 | super.init(initialClock: initialClock, converter: HistoricalSchedulerTimeConverter())
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Schedulers/Internal/InvocableScheduledItem.swift:
--------------------------------------------------------------------------------
1 | //
2 | // InvocableScheduledItem.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 11/7/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | struct InvocableScheduledItem : InvocableType {
10 |
11 | let invocable: I
12 | let state: I.Value
13 |
14 | init(invocable: I, state: I.Value) {
15 | self.invocable = invocable
16 | self.state = state
17 | }
18 |
19 | func invoke() {
20 | self.invocable.invoke(self.state)
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Schedulers/Internal/InvocableType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // InvocableType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 11/7/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | protocol InvocableType {
10 | func invoke()
11 | }
12 |
13 | protocol InvocableWithValueType {
14 | associatedtype Value
15 |
16 | func invoke(_ value: Value)
17 | }
18 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Schedulers/Internal/ScheduledItem.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ScheduledItem.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 9/2/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | struct ScheduledItem
10 | : ScheduledItemType
11 | , InvocableType {
12 | typealias Action = (T) -> Disposable
13 |
14 | private let action: Action
15 | private let state: T
16 |
17 | private let disposable = SingleAssignmentDisposable()
18 |
19 | var isDisposed: Bool {
20 | self.disposable.isDisposed
21 | }
22 |
23 | init(action: @escaping Action, state: T) {
24 | self.action = action
25 | self.state = state
26 | }
27 |
28 | func invoke() {
29 | self.disposable.setDisposable(self.action(self.state))
30 | }
31 |
32 | func dispose() {
33 | self.disposable.dispose()
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Schedulers/Internal/ScheduledItemType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ScheduledItemType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 11/7/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | protocol ScheduledItemType
10 | : Cancelable
11 | , InvocableType {
12 | func invoke()
13 | }
14 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Subjects/SubjectType.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SubjectType.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 3/1/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// Represents an object that is both an observable sequence as well as an observer.
10 | public protocol SubjectType : ObservableType {
11 | /// The type of the observer that represents this subject.
12 | ///
13 | /// Usually this type is type of subject itself, but it doesn't have to be.
14 | associatedtype Observer: ObserverType
15 |
16 | /// Returns observer interface for subject.
17 | ///
18 | /// - returns: Observer interface for subject.
19 | func asObserver() -> Observer
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/SwiftSupport/SwiftSupport.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftSupport.swift
3 | // RxSwift
4 | //
5 | // Created by Volodymyr Gorbenko on 3/6/17.
6 | // Copyright © 2017 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | typealias IntMax = Int64
12 | public typealias RxAbstractInteger = FixedWidthInteger
13 |
14 | extension SignedInteger {
15 | func toIntMax() -> IntMax {
16 | IntMax(self)
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Traits/Infallible/Infallible+Create.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Infallible+Create.swift
3 | // RxSwift
4 | //
5 | // Created by Shai Mishali on 27/08/2020.
6 | // Copyright © 2020 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public enum InfallibleEvent {
12 | /// Next element is produced.
13 | case next(Element)
14 |
15 | /// Sequence completed successfully.
16 | case completed
17 | }
18 |
19 | extension Infallible {
20 | public typealias InfallibleObserver = (InfallibleEvent) -> Void
21 |
22 | /**
23 | Creates an observable sequence from a specified subscribe method implementation.
24 |
25 | - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)
26 |
27 | - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method.
28 | - returns: The observable sequence with the specified implementation for the `subscribe` method.
29 | */
30 | public static func create(subscribe: @escaping (@escaping InfallibleObserver) -> Disposable) -> Infallible {
31 | let source = Observable.create { observer in
32 | subscribe { event in
33 | switch event {
34 | case .next(let element):
35 | observer.onNext(element)
36 | case .completed:
37 | observer.onCompleted()
38 | }
39 | }
40 | }
41 |
42 | return Infallible(source)
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/Pods/RxSwift/RxSwift/Traits/Infallible/ObservableConvertibleType+Infallible.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ObservableConvertibleType+Infallible.swift
3 | // RxSwift
4 | //
5 | // Created by Shai Mishali on 27/08/2020.
6 | // Copyright © 2020 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | public extension ObservableConvertibleType {
10 | /// Convert to an `Infallible`
11 | ///
12 | /// - returns: `Infallible`
13 | func asInfallible(onErrorJustReturn element: Element) -> Infallible {
14 | Infallible(self.asObservable().catchAndReturn(element))
15 | }
16 |
17 | /// Convert to an `Infallible`
18 | ///
19 | /// - parameter onErroFallbackTo: Fall back to this provided infallible on error
20 | ///
21 | ///
22 | /// - returns: `Infallible`
23 | func asInfallible(onErrorFallbackTo infallible: Infallible) -> Infallible {
24 | Infallible(self.asObservable().catch { _ in infallible.asObservable() })
25 | }
26 |
27 | /// Convert to an `Infallible`
28 | ///
29 | /// - parameter onErrorRecover: Recover with the this infallible closure
30 | ///
31 | /// - returns: `Infallible`
32 | func asInfallible(onErrorRecover: @escaping (Swift.Error) -> Infallible) -> Infallible {
33 | Infallible(asObservable().catch { onErrorRecover($0).asObservable() })
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Differentiator/Differentiator-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |