├── .gitignore
├── .travis.yml
├── Example
├── Podfile
├── Podfile.lock
├── Pods
│ ├── Local Podspecs
│ │ └── RxSmartBag.podspec.json
│ ├── Manifest.lock
│ ├── Pods.xcodeproj
│ │ ├── project.pbxproj
│ │ └── project.xcworkspace
│ │ │ └── contents.xcworkspacedata
│ ├── RxSwift
│ │ ├── 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
│ │ └── RxSwift
│ │ │ ├── AnyObserver.swift
│ │ │ ├── Cancelable.swift
│ │ │ ├── Concurrency
│ │ │ ├── AsyncLock.swift
│ │ │ ├── Lock.swift
│ │ │ ├── LockOwnerType.swift
│ │ │ ├── SynchronizedDisposeType.swift
│ │ │ ├── SynchronizedOnType.swift
│ │ │ └── SynchronizedUnsubscribeType.swift
│ │ │ ├── ConnectableObservableType.swift
│ │ │ ├── Deprecated.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
│ │ │ └── String+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
│ │ │ ├── Concat.swift
│ │ │ ├── Create.swift
│ │ │ ├── Debounce.swift
│ │ │ ├── Debug.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
│ │ │ ├── TakeUntil.swift
│ │ │ ├── TakeWhile.swift
│ │ │ ├── Throttle.swift
│ │ │ ├── Timeout.swift
│ │ │ ├── Timer.swift
│ │ │ ├── ToArray.swift
│ │ │ ├── Using.swift
│ │ │ ├── Window.swift
│ │ │ ├── WithLatestFrom.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
│ │ │ ├── Completable+AndThen.swift
│ │ │ ├── Completable.swift
│ │ │ ├── Maybe.swift
│ │ │ ├── ObservableType+PrimitiveSequence.swift
│ │ │ ├── PrimitiveSequence+Zip+arity.swift
│ │ │ ├── PrimitiveSequence.swift
│ │ │ └── Single.swift
│ └── Target Support Files
│ │ ├── Pods-RxSmartBag_Example
│ │ ├── Info.plist
│ │ ├── Pods-RxSmartBag_Example-acknowledgements.markdown
│ │ ├── Pods-RxSmartBag_Example-acknowledgements.plist
│ │ ├── Pods-RxSmartBag_Example-dummy.m
│ │ ├── Pods-RxSmartBag_Example-frameworks.sh
│ │ ├── Pods-RxSmartBag_Example-resources.sh
│ │ ├── Pods-RxSmartBag_Example-umbrella.h
│ │ ├── Pods-RxSmartBag_Example.debug.xcconfig
│ │ ├── Pods-RxSmartBag_Example.modulemap
│ │ └── Pods-RxSmartBag_Example.release.xcconfig
│ │ ├── Pods-RxSmartBag_Tests
│ │ ├── Info.plist
│ │ ├── Pods-RxSmartBag_Tests-acknowledgements.markdown
│ │ ├── Pods-RxSmartBag_Tests-acknowledgements.plist
│ │ ├── Pods-RxSmartBag_Tests-dummy.m
│ │ ├── Pods-RxSmartBag_Tests-frameworks.sh
│ │ ├── Pods-RxSmartBag_Tests-resources.sh
│ │ ├── Pods-RxSmartBag_Tests-umbrella.h
│ │ ├── Pods-RxSmartBag_Tests.debug.xcconfig
│ │ ├── Pods-RxSmartBag_Tests.modulemap
│ │ └── Pods-RxSmartBag_Tests.release.xcconfig
│ │ ├── RxSmartBag
│ │ ├── Info.plist
│ │ ├── RxSmartBag-dummy.m
│ │ ├── RxSmartBag-prefix.pch
│ │ ├── RxSmartBag-umbrella.h
│ │ ├── RxSmartBag.modulemap
│ │ └── RxSmartBag.xcconfig
│ │ └── RxSwift
│ │ ├── Info.plist
│ │ ├── RxSwift-dummy.m
│ │ ├── RxSwift-prefix.pch
│ │ ├── RxSwift-umbrella.h
│ │ ├── RxSwift.modulemap
│ │ └── RxSwift.xcconfig
├── RxSmartBag.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ └── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── RxSmartBag-Example.xcscheme
├── RxSmartBag.xcworkspace
│ └── contents.xcworkspacedata
├── RxSmartBag
│ ├── AppDelegate.swift
│ ├── Base.lproj
│ │ ├── LaunchScreen.xib
│ │ └── Main.storyboard
│ ├── Images.xcassets
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── Info.plist
│ ├── UIViewControllerExtension.swift
│ └── ViewController.swift
└── Tests
│ └── Info.plist
├── LICENSE
├── README.md
├── RxSmartBag.podspec
├── RxSmartBag
├── Assets
│ └── .gitkeep
└── Classes
│ ├── .gitkeep
│ └── RxSmartBag.swift
└── _Pods.xcodeproj
/.gitignore:
--------------------------------------------------------------------------------
1 | # OS X
2 | .DS_Store
3 |
4 | ## Build generated
5 | build/
6 | DerivedData/
7 |
8 | ## Various settings
9 | *.pbxuser
10 | !default.pbxuser
11 | *.mode1v3
12 | !default.mode1v3
13 | *.mode2v3
14 | !default.mode2v3
15 | *.perspectivev3
16 | !default.perspectivev3
17 | xcuserdata/
18 | *.xccheckout
19 | profile
20 | *.moved-aside
21 | DerivedData
22 | *.hmap
23 | *.ipa
24 |
25 | # Bundler
26 | .bundle
27 |
28 | Carthage
29 | # We recommend against adding the Pods directory to your .gitignore. However
30 | # you should judge for yourself, the pros and cons are mentioned at:
31 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
32 | #
33 | # Note: if you ignore the Pods directory, make sure to uncomment
34 | # `pod install` in .travis.yml
35 | #
36 | # Pods/
37 |
38 | ## Other
39 | *.moved-aside
40 | *.xcuserstate
41 |
42 | ## Obj-C/Swift specific
43 | *.hmap
44 | *.ipa
45 | *.dSYM.zip
46 | *.dSYM
47 |
48 | ## Playgrounds
49 | timeline.xctimeline
50 | playground.xcworkspace
51 |
52 | # Swift Package Manager
53 | #
54 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
55 | # Packages/
56 | .build/
57 |
58 | # CocoaPods
59 | #
60 | # We recommend against adding the Pods directory to your .gitignore. However
61 | # you should judge for yourself, the pros and cons are mentioned at:
62 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
63 | #
64 | # Pods/
65 |
66 | # Carthage
67 | #
68 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
69 | # Carthage/Checkouts
70 |
71 | Carthage/Build
72 |
73 | # fastlane
74 | #
75 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
76 | # screenshots whenever they are needed.
77 | # For more information about the recommended setup visit:
78 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md
79 |
80 | fastlane/report.xml
81 | fastlane/Preview.html
82 | fastlane/screenshots
83 | fastlane/test_output
84 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | # references:
2 | # * http://www.objc.io/issue-6/travis-ci.html
3 | # * https://github.com/supermarin/xcpretty#usage
4 |
5 | osx_image: xcode7.3
6 | language: objective-c
7 | # cache: cocoapods
8 | # podfile: Example/Podfile
9 | # before_install:
10 | # - gem install cocoapods # Since Travis is not always on latest version
11 | # - pod install --project-directory=Example
12 | script:
13 | - set -o pipefail && xcodebuild test -workspace Example/RxSmartBag.xcworkspace -scheme RxSmartBag-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty
14 | - pod lib lint
15 |
--------------------------------------------------------------------------------
/Example/Podfile:
--------------------------------------------------------------------------------
1 | use_frameworks!
2 |
3 | target 'RxSmartBag_Example' do
4 | pod 'RxSmartBag', :path => '../'
5 | target 'RxSmartBag_Tests' do
6 | inherit! :search_paths
7 | end
8 | end
9 |
--------------------------------------------------------------------------------
/Example/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - RxSmartBag (2.0.0):
3 | - RxSwift (~> 4.0)
4 | - RxSwift (4.0.0)
5 |
6 | DEPENDENCIES:
7 | - RxSmartBag (from `../`)
8 |
9 | EXTERNAL SOURCES:
10 | RxSmartBag:
11 | :path: ../
12 |
13 | SPEC CHECKSUMS:
14 | RxSmartBag: c1f54b5d0e1ccfc583db60253083479465f2c038
15 | RxSwift: fd680d75283beb5e2559486f3c0ff852f0d35334
16 |
17 | PODFILE CHECKSUM: a425ec67ec5739ed326ab08a62b5e07b0e809f03
18 |
19 | COCOAPODS: 1.2.1
20 |
--------------------------------------------------------------------------------
/Example/Pods/Local Podspecs/RxSmartBag.podspec.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "RxSmartBag",
3 | "version": "2.0.0",
4 | "summary": "A useful dispose bag for RxSwift.",
5 | "description": "A simple way to omit declararing DisposeBag.",
6 | "homepage": "https://github.com/rinov/RxSmartBag",
7 | "license": {
8 | "type": "MIT",
9 | "file": "LICENSE"
10 | },
11 | "authors": {
12 | "rinov": "rinov@rinov.jp"
13 | },
14 | "source": {
15 | "git": "https://github.com/rinov/RxSmartBag.git",
16 | "tag": "2.0.0"
17 | },
18 | "platforms": {
19 | "ios": "8.0"
20 | },
21 | "source_files": "RxSmartBag/Classes/**/*",
22 | "dependencies": {
23 | "RxSwift": [
24 | "~> 4.0"
25 | ]
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Example/Pods/Manifest.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - RxSmartBag (2.0.0):
3 | - RxSwift (~> 4.0)
4 | - RxSwift (4.0.0)
5 |
6 | DEPENDENCIES:
7 | - RxSmartBag (from `../`)
8 |
9 | EXTERNAL SOURCES:
10 | RxSmartBag:
11 | :path: ../
12 |
13 | SPEC CHECKSUMS:
14 | RxSmartBag: c1f54b5d0e1ccfc583db60253083479465f2c038
15 | RxSwift: fd680d75283beb5e2559486f3c0ff852f0d35334
16 |
17 | PODFILE CHECKSUM: a425ec67ec5739ed326ab08a62b5e07b0e809f03
18 |
19 | COCOAPODS: 1.2.1
20 |
--------------------------------------------------------------------------------
/Example/Pods/Pods.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/LICENSE.md:
--------------------------------------------------------------------------------
1 | **The MIT License**
2 | **Copyright © 2015 Krunoslav Zaher**
3 | **All rights reserved.**
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6 |
7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8 |
9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
/Example/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 Element = E
12 | typealias Iterator = AnyIterator
13 |
14 | private let _repeatedValue: E
15 |
16 | init(repeatedValue: E) {
17 | _repeatedValue = repeatedValue
18 | }
19 |
20 | func makeIterator() -> Iterator {
21 | let repeatedValue = _repeatedValue
22 | return AnyIterator {
23 | return repeatedValue
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Example/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 | return DispatchQueue.getSpecific(key: token) != nil
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Example/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 class Foundation.Thread
13 | import func Foundation.OSAtomicCompareAndSwap32Barrier
14 | import func Foundation.OSAtomicIncrement32Barrier
15 | import func Foundation.OSAtomicDecrement32Barrier
16 | import protocol Foundation.NSCopying
17 |
18 | typealias AtomicInt = Int32
19 |
20 | fileprivate func castToUInt32Pointer(_ pointer: UnsafeMutablePointer) -> UnsafeMutablePointer {
21 | let raw = UnsafeMutableRawPointer(pointer)
22 | return raw.assumingMemoryBound(to: UInt32.self)
23 | }
24 |
25 | let AtomicCompareAndSwap = OSAtomicCompareAndSwap32Barrier
26 | let AtomicIncrement = OSAtomicIncrement32Barrier
27 | let AtomicDecrement = OSAtomicDecrement32Barrier
28 | func AtomicOr(_ mask: UInt32, _ theValue : UnsafeMutablePointer) -> Int32 {
29 | return OSAtomicOr32OrigBarrier(mask, castToUInt32Pointer(theValue))
30 | }
31 | func AtomicFlagSet(_ mask: UInt32, _ theValue : UnsafeMutablePointer) -> Bool {
32 | // just used to create a barrier
33 | OSAtomicXor32OrigBarrier(0, castToUInt32Pointer(theValue))
34 | return (theValue.pointee & Int32(mask)) != 0
35 | }
36 |
37 | extension Thread {
38 |
39 | static func setThreadLocalStorageValue(_ value: T?, forKey key: NSCopying
40 | ) {
41 | let currentThread = Thread.current
42 | let threadDictionary = currentThread.threadDictionary
43 |
44 | if let newValue = value {
45 | threadDictionary[key] = newValue
46 | }
47 | else {
48 | threadDictionary[key] = nil
49 | }
50 |
51 | }
52 | static func getThreadLocalStorageValueForKey(_ key: NSCopying) -> T? {
53 | let currentThread = Thread.current
54 | let threadDictionary = currentThread.threadDictionary
55 |
56 | return threadDictionary[key] as? T
57 | }
58 | }
59 |
60 | extension AtomicInt {
61 | func valueSnapshot() -> Int32 {
62 | return self
63 | }
64 | }
65 |
66 | #endif
67 |
--------------------------------------------------------------------------------
/Example/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 XCTest
12 | import Glibc
13 | import SwiftShims
14 | import class Foundation.Thread
15 |
16 | final class AtomicInt {
17 | typealias IntegerLiteralType = Int
18 | fileprivate var value: Int32 = 0
19 | fileprivate var _lock = RecursiveLock()
20 |
21 | func lock() {
22 | _lock.lock()
23 | }
24 | func unlock() {
25 | _lock.unlock()
26 | }
27 |
28 | func valueSnapshot() -> Int32 {
29 | return value
30 | }
31 | }
32 |
33 | extension AtomicInt: ExpressibleByIntegerLiteral {
34 | convenience init(integerLiteral value: Int) {
35 | self.init()
36 | self.value = Int32(value)
37 | }
38 | }
39 |
40 | func >(lhs: AtomicInt, rhs: Int32) -> Bool {
41 | return lhs.value > rhs
42 | }
43 | func ==(lhs: AtomicInt, rhs: Int32) -> Bool {
44 | return lhs.value == rhs
45 | }
46 |
47 | func AtomicFlagSet(_ mask: UInt32, _ atomic: inout AtomicInt) -> Bool {
48 | atomic.lock(); defer { atomic.unlock() }
49 | return (atomic.value & Int32(mask)) != 0
50 | }
51 |
52 | func AtomicOr(_ mask: UInt32, _ atomic: inout AtomicInt) -> Int32 {
53 | atomic.lock(); defer { atomic.unlock() }
54 | let value = atomic.value
55 | atomic.value |= Int32(mask)
56 | return value
57 | }
58 |
59 | func AtomicIncrement(_ atomic: inout AtomicInt) -> Int32 {
60 | atomic.lock(); defer { atomic.unlock() }
61 | atomic.value += 1
62 | return atomic.value
63 | }
64 |
65 | func AtomicDecrement(_ atomic: inout AtomicInt) -> Int32 {
66 | atomic.lock(); defer { atomic.unlock() }
67 | atomic.value -= 1
68 | return atomic.value
69 | }
70 |
71 | func AtomicCompareAndSwap(_ l: Int32, _ r: Int32, _ atomic: inout AtomicInt) -> Bool {
72 | atomic.lock(); defer { atomic.unlock() }
73 | if atomic.value == l {
74 | atomic.value = r
75 | return true
76 | }
77 |
78 | return false
79 | }
80 |
81 | extension Thread {
82 |
83 | static func setThreadLocalStorageValue(_ value: T?, forKey key: String) {
84 | let currentThread = Thread.current
85 | var threadDictionary = currentThread.threadDictionary
86 |
87 | if let newValue = value {
88 | threadDictionary[key] = newValue
89 | }
90 | else {
91 | threadDictionary[key] = nil
92 | }
93 |
94 | currentThread.threadDictionary = threadDictionary
95 | }
96 |
97 | static func getThreadLocalStorageValueForKey(_ key: String) -> T? {
98 | let currentThread = Thread.current
99 | let threadDictionary = currentThread.threadDictionary
100 |
101 | return threadDictionary[key] as? T
102 | }
103 | }
104 |
105 | #endif
106 |
--------------------------------------------------------------------------------
/Example/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 class Foundation.NSRecursiveLock
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 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/AnyObserver.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AnyObserver.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/28/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /// A type-erased `ObserverType`.
10 | ///
11 | /// Forwards operations to an arbitrary underlying observer with the same `Element` type, hiding the specifics of the underlying observer type.
12 | public struct AnyObserver : ObserverType {
13 | /// The type of elements in sequence that observer can observe.
14 | public typealias E = Element
15 |
16 | /// Anonymous event handler type.
17 | public typealias EventHandler = (Event) -> Void
18 |
19 | private let observer: EventHandler
20 |
21 | /// Construct an instance whose `on(event)` calls `eventHandler(event)`
22 | ///
23 | /// - parameter eventHandler: Event handler that observes sequences events.
24 | public init(eventHandler: @escaping EventHandler) {
25 | self.observer = eventHandler
26 | }
27 |
28 | /// Construct an instance whose `on(event)` calls `observer.on(event)`
29 | ///
30 | /// - parameter observer: Observer that receives sequence events.
31 | public init(_ observer: O) where O.E == Element {
32 | self.observer = observer.on
33 | }
34 |
35 | /// Send `event` to this observer.
36 | ///
37 | /// - parameter event: Event instance.
38 | public func on(_ event: Event) {
39 | return self.observer(event)
40 | }
41 |
42 | /// Erases type of observer and returns canonical observer.
43 | ///
44 | /// - returns: type erased observer.
45 | public func asObserver() -> AnyObserver {
46 | return self
47 | }
48 | }
49 |
50 | extension AnyObserver {
51 | /// Collection of `AnyObserver`s
52 | typealias s = Bag<(Event) -> ()>
53 | }
54 |
55 | extension ObserverType {
56 | /// Erases type of observer and returns canonical observer.
57 | ///
58 | /// - returns: type erased observer.
59 | public func asObserver() -> AnyObserver {
60 | return AnyObserver(self)
61 | }
62 |
63 | /// Transforms observer of type R to type E using custom transform method.
64 | /// Each event sent to result observer is transformed and sent to `self`.
65 | ///
66 | /// - returns: observer that transforms events.
67 | public func mapObserver(_ transform: @escaping (R) throws -> E) -> AnyObserver {
68 | return AnyObserver { e in
69 | self.on(e.map(transform))
70 | }
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/Example/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 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Concurrency/AsyncLock.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AsyncLock.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 3/21/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /**
10 | In case nobody holds this lock, the work will be queued and executed immediately
11 | on thread that is requesting lock.
12 |
13 | In case there is somebody currently holding that lock, action will be enqueued.
14 | When owned of the lock finishes with it's processing, it will also execute
15 | and pending work.
16 |
17 | That means that enqueued work could possibly be executed later on a different thread.
18 | */
19 | final class AsyncLock
20 | : Disposable
21 | , Lock
22 | , SynchronizedDisposeType {
23 | typealias Action = () -> Void
24 |
25 | var _lock = SpinLock()
26 |
27 | private var _queue: Queue = Queue(capacity: 0)
28 |
29 | private var _isExecuting: Bool = false
30 | private var _hasFaulted: Bool = false
31 |
32 | // lock {
33 | func lock() {
34 | _lock.lock()
35 | }
36 |
37 | func unlock() {
38 | _lock.unlock()
39 | }
40 | // }
41 |
42 | private func enqueue(_ action: I) -> I? {
43 | _lock.lock(); defer { _lock.unlock() } // {
44 | if _hasFaulted {
45 | return nil
46 | }
47 |
48 | if _isExecuting {
49 | _queue.enqueue(action)
50 | return nil
51 | }
52 |
53 | _isExecuting = true
54 |
55 | return action
56 | // }
57 | }
58 |
59 | private func dequeue() -> I? {
60 | _lock.lock(); defer { _lock.unlock() } // {
61 | if _queue.count > 0 {
62 | return _queue.dequeue()
63 | }
64 | else {
65 | _isExecuting = false
66 | return nil
67 | }
68 | // }
69 | }
70 |
71 | func invoke(_ action: I) {
72 | let firstEnqueuedAction = enqueue(action)
73 |
74 | if let firstEnqueuedAction = firstEnqueuedAction {
75 | firstEnqueuedAction.invoke()
76 | }
77 | else {
78 | // action is enqueued, it's somebody else's concern now
79 | return
80 | }
81 |
82 | while true {
83 | let nextAction = dequeue()
84 |
85 | if let nextAction = nextAction {
86 | nextAction.invoke()
87 | }
88 | else {
89 | return
90 | }
91 | }
92 | }
93 |
94 | func dispose() {
95 | synchronizedDispose()
96 | }
97 |
98 | func _synchronized_dispose() {
99 | _queue = Queue(capacity: 0)
100 | _hasFaulted = true
101 | }
102 | }
103 |
--------------------------------------------------------------------------------
/Example/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: () -> Void) {
20 | lock(); defer { unlock() }
21 | action()
22 | }
23 |
24 | @inline(__always)
25 | final func calculateLocked(_ action: () -> T) -> T {
26 | lock(); defer { unlock() }
27 | return action()
28 | }
29 |
30 | @inline(__always)
31 | final func calculateLockedOrFail(_ action: () throws -> T) throws -> T {
32 | lock(); defer { unlock() }
33 | let result = try action()
34 | return result
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Example/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 : class, Lock {
10 | var _lock: RecursiveLock { get }
11 | }
12 |
13 | extension LockOwnerType {
14 | func lock() {
15 | _lock.lock()
16 | }
17 |
18 | func unlock() {
19 | _lock.unlock()
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Example/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 : class, Disposable, Lock {
10 | func _synchronized_dispose()
11 | }
12 |
13 | extension SynchronizedDisposeType {
14 | func synchronizedDispose() {
15 | lock(); defer { unlock() }
16 | _synchronized_dispose()
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Example/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 : class, ObserverType, Lock {
10 | func _synchronized_on(_ event: Event)
11 | }
12 |
13 | extension SynchronizedOnType {
14 | func synchronizedOn(_ event: Event) {
15 | lock(); defer { unlock() }
16 | _synchronized_on(event)
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/Example/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 : class {
10 | associatedtype DisposeKey
11 |
12 | func synchronizedUnsubscribe(_ disposeKey: DisposeKey)
13 | }
14 |
--------------------------------------------------------------------------------
/Example/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 |
--------------------------------------------------------------------------------
/Example/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 | /// Respresents a disposable resource.
10 | public protocol Disposable {
11 | /// Dispose resource.
12 | func dispose()
13 | }
14 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Disposables/AnonymousDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AnonymousDisposable.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 an Action-based disposable.
10 | ///
11 | /// When dispose method is called, disposal action will be dereferenced.
12 | fileprivate final class AnonymousDisposable : DisposeBase, Cancelable {
13 | public typealias DisposeAction = () -> Void
14 |
15 | private var _isDisposed: AtomicInt = 0
16 | private var _disposeAction: DisposeAction?
17 |
18 | /// - returns: Was resource disposed.
19 | public var isDisposed: Bool {
20 | return _isDisposed == 1
21 | }
22 |
23 | /// Constructs a new disposable with the given action used for disposal.
24 | ///
25 | /// - parameter disposeAction: Disposal action which will be run upon calling `dispose`.
26 | fileprivate init(_ disposeAction: @escaping DisposeAction) {
27 | _disposeAction = disposeAction
28 | super.init()
29 | }
30 |
31 | // Non-deprecated version of the constructor, used by `Disposables.create(with:)`
32 | fileprivate init(disposeAction: @escaping DisposeAction) {
33 | _disposeAction = disposeAction
34 | super.init()
35 | }
36 |
37 | /// Calls the disposal action if and only if the current instance hasn't been disposed yet.
38 | ///
39 | /// After invoking disposal action, disposal action will be dereferenced.
40 | fileprivate func dispose() {
41 | if AtomicCompareAndSwap(0, 1, &_isDisposed) {
42 | assert(_isDisposed == 1)
43 |
44 | if let action = _disposeAction {
45 | _disposeAction = nil
46 | action()
47 | }
48 | }
49 | }
50 | }
51 |
52 | extension Disposables {
53 |
54 | /// Constructs a new disposable with the given action used for disposal.
55 | ///
56 | /// - parameter dispose: Disposal action which will be run upon calling `dispose`.
57 | public static func create(with dispose: @escaping () -> ()) -> Cancelable {
58 | return AnonymousDisposable(disposeAction: dispose)
59 | }
60 |
61 | }
62 |
--------------------------------------------------------------------------------
/Example/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 var _isDisposed: 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 | return _isDisposed > 0
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 | _disposable1 = disposable1
29 | _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 AtomicCompareAndSwap(0, 1, &_isDisposed) {
38 | _disposable1?.dispose()
39 | _disposable2?.dispose()
40 | _disposable1 = nil
41 | _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 | return BinaryDisposable(disposable1, disposable2)
51 | }
52 |
53 | }
54 |
--------------------------------------------------------------------------------
/Example/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 _isDisposed = 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._isDisposed = isDisposed
22 | }
23 |
24 | /// - returns: Was resource disposed.
25 | public var isDisposed: Bool {
26 | return _isDisposed
27 | }
28 |
29 | /// Sets the status to disposed, which can be observer through the `isDisposed` property.
30 | public func dispose() {
31 | _isDisposed = true
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/Example/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 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Disposables/DisposeBag.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DisposeBag.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 3/25/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension Disposable {
10 | /// Adds `self` to `bag`
11 | ///
12 | /// - parameter bag: `DisposeBag` to add `self` to.
13 | public func disposed(by bag: DisposeBag) {
14 | bag.insert(self)
15 | }
16 | }
17 |
18 | /**
19 | Thread safe bag that disposes added disposables on `deinit`.
20 |
21 | This returns ARC (RAII) like resource management to `RxSwift`.
22 |
23 | In case contained disposables need to be disposed, just put a different dispose bag
24 | or create a new one in its place.
25 |
26 | self.existingDisposeBag = DisposeBag()
27 |
28 | In case explicit disposal is necessary, there is also `CompositeDisposable`.
29 | */
30 | public final class DisposeBag: DisposeBase {
31 |
32 | private var _lock = SpinLock()
33 |
34 | // state
35 | private var _disposables = [Disposable]()
36 | private var _isDisposed = false
37 |
38 | /// Constructs new empty dispose bag.
39 | public override init() {
40 | super.init()
41 | }
42 |
43 | /// Adds `disposable` to be disposed when dispose bag is being deinited.
44 | ///
45 | /// - parameter disposable: Disposable to add.
46 | public func insert(_ disposable: Disposable) {
47 | _insert(disposable)?.dispose()
48 | }
49 |
50 | private func _insert(_ disposable: Disposable) -> Disposable? {
51 | _lock.lock(); defer { _lock.unlock() }
52 | if _isDisposed {
53 | return disposable
54 | }
55 |
56 | _disposables.append(disposable)
57 |
58 | return nil
59 | }
60 |
61 | /// This is internal on purpose, take a look at `CompositeDisposable` instead.
62 | private func dispose() {
63 | let oldDisposables = _dispose()
64 |
65 | for disposable in oldDisposables {
66 | disposable.dispose()
67 | }
68 | }
69 |
70 | private func _dispose() -> [Disposable] {
71 | _lock.lock(); defer { _lock.unlock() }
72 |
73 | let disposables = _disposables
74 |
75 | _disposables.removeAll(keepingCapacity: false)
76 | _isDisposed = true
77 |
78 | return disposables
79 | }
80 |
81 | deinit {
82 | dispose()
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/Example/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 | let _ = Resources.incrementTotal()
14 | #endif
15 | }
16 |
17 | deinit {
18 | #if TRACE_RESOURCES
19 | let _ = Resources.decrementTotal()
20 | #endif
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Example/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 | fileprivate struct NopDisposable : Disposable {
13 |
14 | fileprivate static let noOp: Disposable = NopDisposable()
15 |
16 | fileprivate 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 {
30 | return NopDisposable.noOp
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Example/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 var _isDisposed: AtomicInt = 0
19 |
20 | // state
21 | private var _disposable: Disposable?
22 |
23 | /// - returns: Was resource disposed.
24 | public var isDisposed: Bool {
25 | return _isDisposed == 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 | _disposable = disposable
37 | }
38 |
39 | /// Disposes the wrapped disposable on the provided scheduler.
40 | public func dispose() {
41 | let _ = scheduler.schedule(self, action: disposeScheduledDisposable)
42 | }
43 |
44 | func disposeInner() {
45 | if AtomicCompareAndSwap(0, 1, &_isDisposed) {
46 | _disposable!.dispose()
47 | _disposable = nil
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Disposables/SerialDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SerialDisposable.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 a disposable resource whose underlying disposable resource can be replaced by another disposable resource, causing automatic disposal of the previous underlying disposable resource.
10 | public final class SerialDisposable : DisposeBase, Cancelable {
11 | private var _lock = SpinLock()
12 |
13 | // state
14 | private var _current = nil as Disposable?
15 | private var _isDisposed = false
16 |
17 | /// - returns: Was resource disposed.
18 | public var isDisposed: Bool {
19 | return _isDisposed
20 | }
21 |
22 | /// Initializes a new instance of the `SerialDisposable`.
23 | override public init() {
24 | super.init()
25 | }
26 |
27 | /**
28 | Gets or sets the underlying disposable.
29 |
30 | Assigning this property disposes the previous disposable object.
31 |
32 | If the `SerialDisposable` has already been disposed, assignment to this property causes immediate disposal of the given disposable object.
33 | */
34 | public var disposable: Disposable {
35 | get {
36 | return _lock.calculateLocked {
37 | return self.disposable
38 | }
39 | }
40 | set (newDisposable) {
41 | let disposable: Disposable? = _lock.calculateLocked {
42 | if _isDisposed {
43 | return newDisposable
44 | }
45 | else {
46 | let toDispose = _current
47 | _current = newDisposable
48 | return toDispose
49 | }
50 | }
51 |
52 | if let disposable = disposable {
53 | disposable.dispose()
54 | }
55 | }
56 | }
57 |
58 | /// Disposes the underlying disposable as well as all future replacements.
59 | public func dispose() {
60 | _dispose()?.dispose()
61 | }
62 |
63 | private func _dispose() -> Disposable? {
64 | _lock.lock(); defer { _lock.unlock() }
65 | if _isDisposed {
66 | return nil
67 | }
68 | else {
69 | _isDisposed = true
70 | let current = _current
71 | _current = nil
72 | return current
73 | }
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Disposables/SingleAssignmentDisposable.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SingleAssignmentDisposable.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/15/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | /**
10 | Represents a disposable resource which only allows a single assignment of its underlying disposable resource.
11 |
12 | If an underlying disposable resource has already been set, future attempts to set the underlying disposable resource will throw an exception.
13 | */
14 | public final class SingleAssignmentDisposable : DisposeBase, Cancelable {
15 |
16 | fileprivate enum DisposeState: UInt32 {
17 | case disposed = 1
18 | case disposableSet = 2
19 | }
20 |
21 | // Jeej, swift API consistency rules
22 | fileprivate enum DisposeStateInt32: Int32 {
23 | case disposed = 1
24 | case disposableSet = 2
25 | }
26 |
27 | // state
28 | private var _state: AtomicInt = 0
29 | private var _disposable = nil as Disposable?
30 |
31 | /// - returns: A value that indicates whether the object is disposed.
32 | public var isDisposed: Bool {
33 | return AtomicFlagSet(DisposeState.disposed.rawValue, &_state)
34 | }
35 |
36 | /// Initializes a new instance of the `SingleAssignmentDisposable`.
37 | public override init() {
38 | super.init()
39 | }
40 |
41 | /// Gets or sets the underlying disposable. After disposal, the result of getting this property is undefined.
42 | ///
43 | /// **Throws exception if the `SingleAssignmentDisposable` has already been assigned to.**
44 | public func setDisposable(_ disposable: Disposable) {
45 | _disposable = disposable
46 |
47 | let previousState = AtomicOr(DisposeState.disposableSet.rawValue, &_state)
48 |
49 | if (previousState & DisposeStateInt32.disposableSet.rawValue) != 0 {
50 | rxFatalError("oldState.disposable != nil")
51 | }
52 |
53 | if (previousState & DisposeStateInt32.disposed.rawValue) != 0 {
54 | disposable.dispose()
55 | _disposable = nil
56 | }
57 | }
58 |
59 | /// Disposes the underlying disposable.
60 | public func dispose() {
61 | let previousState = AtomicOr(DisposeState.disposed.rawValue, &_state)
62 |
63 | if (previousState & DisposeStateInt32.disposed.rawValue) != 0 {
64 | return
65 | }
66 |
67 | if (previousState & DisposeStateInt32.disposableSet.rawValue) != 0 {
68 | guard let disposable = _disposable else {
69 | rxFatalError("Disposable not set")
70 | }
71 | disposable.dispose()
72 | _disposable = nil
73 | }
74 | }
75 |
76 | }
77 |
--------------------------------------------------------------------------------
/Example/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 | _owner = owner
15 | _key = key
16 | }
17 |
18 | func dispose() {
19 | _owner?.synchronizedUnsubscribe(_key)
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/Example/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 | /// Aritmetic 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 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Event.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Event.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 sequence event.
10 | ///
11 | /// Sequence grammar:
12 | /// **next\* (error | completed)**
13 | public enum Event {
14 | /// Next element is produced.
15 | case next(Element)
16 |
17 | /// Sequence terminated with an error.
18 | case error(Swift.Error)
19 |
20 | /// Sequence completed successfully.
21 | case completed
22 | }
23 |
24 | extension Event : CustomDebugStringConvertible {
25 | /// - returns: Description of event.
26 | public var debugDescription: String {
27 | switch self {
28 | case .next(let value):
29 | return "next(\(value))"
30 | case .error(let error):
31 | return "error(\(error))"
32 | case .completed:
33 | return "completed"
34 | }
35 | }
36 | }
37 |
38 | extension Event {
39 | /// Is `completed` or `error` event.
40 | public var isStopEvent: Bool {
41 | switch self {
42 | case .next: return false
43 | case .error, .completed: return true
44 | }
45 | }
46 |
47 | /// If `next` event, returns element value.
48 | public var element: Element? {
49 | if case .next(let value) = self {
50 | return value
51 | }
52 | return nil
53 | }
54 |
55 | /// If `error` event, returns error.
56 | public var error: Swift.Error? {
57 | if case .error(let error) = self {
58 | return error
59 | }
60 | return nil
61 | }
62 |
63 | /// If `completed` event, returns true.
64 | public var isCompleted: Bool {
65 | if case .completed = self {
66 | return true
67 | }
68 | return false
69 | }
70 | }
71 |
72 | extension Event {
73 | /// Maps sequence elements using transform. If error happens during the transform .error
74 | /// will be returned as value
75 | public func map(_ transform: (Element) throws -> Result) -> Event {
76 | do {
77 | switch self {
78 | case let .next(element):
79 | return .next(try transform(element))
80 | case let .error(error):
81 | return .error(error)
82 | case .completed:
83 | return .completed
84 | }
85 | }
86 | catch let e {
87 | return .error(e)
88 | }
89 | }
90 | }
91 |
92 | /// A type that can be converted to `Event`.
93 | public protocol EventConvertible {
94 | /// Type of element in event
95 | associatedtype ElementType
96 |
97 | /// Event representation of this instance
98 | var event: Event { get }
99 | }
100 |
101 | extension Event : EventConvertible {
102 | /// Event representation of this instance
103 | public var event: Event {
104 | return self
105 | }
106 | }
107 |
--------------------------------------------------------------------------------
/Example/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) -> ()>, _ event: Event) {
14 | if bag._onlyFastPath {
15 | bag._value0?(event)
16 | return
17 | }
18 |
19 | let value0 = bag._value0
20 | let dictionary = bag._dictionary
21 |
22 | if let value0 = value0 {
23 | value0(event)
24 | }
25 |
26 | let pairs = bag._pairs
27 | for i in 0 ..< pairs.count {
28 | pairs[i].value(event)
29 | }
30 |
31 | if let dictionary = dictionary {
32 | for element in dictionary.values {
33 | element(event)
34 | }
35 | }
36 | }
37 |
38 | /// Dispatches `dispose` to all disposables contained inside bag.
39 | func disposeAll(in bag: Bag) {
40 | if bag._onlyFastPath {
41 | bag._value0?.dispose()
42 | return
43 | }
44 |
45 | let value0 = bag._value0
46 | let dictionary = bag._dictionary
47 |
48 | if let value0 = value0 {
49 | value0.dispose()
50 | }
51 |
52 | let pairs = bag._pairs
53 | for i in 0 ..< pairs.count {
54 | pairs[i].value.dispose()
55 | }
56 |
57 | if let dictionary = dictionary {
58 | for element in dictionary.values {
59 | element.dispose()
60 | }
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Extensions/String+Rx.swift:
--------------------------------------------------------------------------------
1 | //
2 | // String+Rx.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 12/25/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension String {
10 | /// This is needed because on Linux Swift doesn't have `rangeOfString(..., options: .BackwardsSearch)`
11 | func lastIndexOf(_ character: Character) -> Index? {
12 | var index = endIndex
13 | while index > startIndex {
14 | index = self.index(before: index)
15 | if self[index] == character {
16 | return index
17 | }
18 | }
19 |
20 | return nil
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/Example/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 | public typealias E = Element
12 |
13 | /// Gets the common key.
14 | public let key: Key
15 |
16 | private let source: Observable
17 |
18 | /// Initializes grouped observable sequence with key and source observable sequence.
19 | ///
20 | /// - parameter key: Grouped observable sequence key
21 | /// - parameter source: Observable sequence that represents sequence of elements for the key
22 | /// - returns: Grouped observable sequence of elements for the specific key
23 | public init(key: Key, source: Observable) {
24 | self.key = key
25 | self.source = source
26 | }
27 |
28 | /// Subscribes `observer` to receive events for this sequence.
29 | public func subscribe(_ observer: O) -> Disposable where O.E == E {
30 | return self.source.subscribe(observer)
31 | }
32 |
33 | /// Converts `self` to `Observable` sequence.
34 | public func asObservable() -> Observable {
35 | return source
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/Example/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) -> ()) -> ()) -> 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 |
--------------------------------------------------------------------------------
/Example/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 | /// Type of elements in sequence.
14 | public typealias E = Element
15 |
16 | init() {
17 | #if TRACE_RESOURCES
18 | let _ = Resources.incrementTotal()
19 | #endif
20 | }
21 |
22 | public func subscribe(_ observer: O) -> Disposable where O.E == E {
23 | rxAbstractMethod()
24 | }
25 |
26 | public func asObservable() -> Observable {
27 | return self
28 | }
29 |
30 | deinit {
31 | #if TRACE_RESOURCES
32 | let _ = Resources.decrementTotal()
33 | #endif
34 | }
35 |
36 | // this is kind of ugly I know :(
37 | // Swift compiler reports "Not supported yet" when trying to override protocol extensions, so ¯\_(ツ)_/¯
38 |
39 | /// Optimizations for map operator
40 | internal func composeMap(_ transform: @escaping (Element) throws -> R) -> Observable {
41 | return _map(source: self, transform: transform)
42 | }
43 | }
44 |
45 |
--------------------------------------------------------------------------------
/Example/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 E
13 |
14 | /// Converts `self` to `Observable` sequence.
15 | ///
16 | /// - returns: Observable sequence that represents `self`.
17 | func asObservable() -> Observable
18 | }
19 |
--------------------------------------------------------------------------------
/Example/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: O) -> Disposable where O.E == E
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 | return Observable.create { o in
44 | return self.subscribe(o)
45 | }
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/Example/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 = O.E
11 |
12 | override init(observer: O, cancel: Cancelable) {
13 | super.init(observer: observer, cancel: cancel)
14 | }
15 |
16 | func on(_ event: Event) {
17 | switch event {
18 | case .next(_):
19 | forwardOn(event)
20 | case .completed, .error(_):
21 | forwardOn(event)
22 | dispose()
23 | }
24 | }
25 | }
26 |
27 | final class AddRef : Producer {
28 | typealias EventHandler = (Event) throws -> Void
29 |
30 | private let _source: Observable
31 | private let _refCount: RefCountDisposable
32 |
33 | init(source: Observable, refCount: RefCountDisposable) {
34 | _source = source
35 | _refCount = refCount
36 | }
37 |
38 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
39 | let releaseDisposable = _refCount.retain()
40 | let sink = AddRefSink(observer: observer, cancel: cancel)
41 | let subscription = Disposables.create(releaseDisposable, _source.subscribe(sink))
42 |
43 | return (sink: sink, subscription: subscription)
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/Example/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 | fileprivate final class AsMaybeSink : Sink, ObserverType {
10 | typealias ElementType = O.E
11 | typealias E = ElementType
12 |
13 | private var _element: Event? = nil
14 |
15 | func on(_ event: Event) {
16 | switch event {
17 | case .next:
18 | if _element != nil {
19 | forwardOn(.error(RxError.moreThanOneElement))
20 | dispose()
21 | }
22 |
23 | _element = event
24 | case .error:
25 | forwardOn(event)
26 | dispose()
27 | case .completed:
28 | if let element = _element {
29 | forwardOn(element)
30 | }
31 | forwardOn(.completed)
32 | dispose()
33 | }
34 | }
35 | }
36 |
37 | final class AsMaybe: Producer {
38 | fileprivate let _source: Observable
39 |
40 | init(source: Observable) {
41 | _source = source
42 | }
43 |
44 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
45 | let sink = AsMaybeSink(observer: observer, cancel: cancel)
46 | let subscription = _source.subscribe(sink)
47 | return (sink: sink, subscription: subscription)
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/Example/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 | fileprivate final class AsSingleSink : Sink, ObserverType {
10 | typealias ElementType = O.E
11 | typealias E = ElementType
12 |
13 | private var _element: Event? = nil
14 |
15 | func on(_ event: Event) {
16 | switch event {
17 | case .next:
18 | if _element != nil {
19 | forwardOn(.error(RxError.moreThanOneElement))
20 | dispose()
21 | }
22 |
23 | _element = event
24 | case .error:
25 | forwardOn(event)
26 | dispose()
27 | case .completed:
28 | if let element = _element {
29 | forwardOn(element)
30 | forwardOn(.completed)
31 | }
32 | else {
33 | forwardOn(.error(RxError.noElements))
34 | }
35 | dispose()
36 | }
37 | }
38 | }
39 |
40 | final class AsSingle: Producer {
41 | fileprivate let _source: Observable
42 |
43 | init(source: Observable) {
44 | _source = source
45 | }
46 |
47 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
48 | let sink = AsSingleSink(observer: observer, cancel: cancel)
49 | let subscription = _source.subscribe(sink)
50 | return (sink: sink, subscription: subscription)
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Observables/Create.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Create.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/8/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType {
10 | // MARK: create
11 |
12 | /**
13 | Creates an observable sequence from a specified subscribe method implementation.
14 |
15 | - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)
16 |
17 | - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method.
18 | - returns: The observable sequence with the specified implementation for the `subscribe` method.
19 | */
20 | public static func create(_ subscribe: @escaping (AnyObserver) -> Disposable) -> Observable {
21 | return AnonymousObservable(subscribe)
22 | }
23 | }
24 |
25 | final fileprivate class AnonymousObservableSink : Sink, ObserverType {
26 | typealias E = O.E
27 | typealias Parent = AnonymousObservable
28 |
29 | // state
30 | private var _isStopped: AtomicInt = 0
31 |
32 | #if DEBUG
33 | fileprivate let _synchronizationTracker = SynchronizationTracker()
34 | #endif
35 |
36 | override init(observer: O, cancel: Cancelable) {
37 | super.init(observer: observer, cancel: cancel)
38 | }
39 |
40 | func on(_ event: Event) {
41 | #if DEBUG
42 | _synchronizationTracker.register(synchronizationErrorMessage: .default)
43 | defer { _synchronizationTracker.unregister() }
44 | #endif
45 | switch event {
46 | case .next:
47 | if _isStopped == 1 {
48 | return
49 | }
50 | forwardOn(event)
51 | case .error, .completed:
52 | if AtomicCompareAndSwap(0, 1, &_isStopped) {
53 | forwardOn(event)
54 | dispose()
55 | }
56 | }
57 | }
58 |
59 | func run(_ parent: Parent) -> Disposable {
60 | return parent._subscribeHandler(AnyObserver(self))
61 | }
62 | }
63 |
64 | final fileprivate class AnonymousObservable : Producer {
65 | typealias SubscribeHandler = (AnyObserver) -> Disposable
66 |
67 | let _subscribeHandler: SubscribeHandler
68 |
69 | init(_ subscribeHandler: @escaping SubscribeHandler) {
70 | _subscribeHandler = subscribeHandler
71 | }
72 |
73 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
74 | let sink = AnonymousObservableSink(observer: observer, cancel: cancel)
75 | let subscription = sink.run(self)
76 | return (sink: sink, subscription: subscription)
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Observables/DefaultIfEmpty.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DefaultIfEmpty.swift
3 | // RxSwift
4 | //
5 | // Created by sergdort on 23/12/2016.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType {
10 |
11 | /**
12 | Emits elements from the source observable sequence, or a default element if the source observable sequence is empty.
13 |
14 | - seealso: [DefaultIfEmpty operator on reactivex.io](http://reactivex.io/documentation/operators/defaultifempty.html)
15 |
16 | - parameter default: Default element to be sent if the source does not emit any elements
17 | - returns: An observable sequence which emits default element end completes in case the original sequence is empty
18 | */
19 | public func ifEmpty(default: E) -> Observable {
20 | return DefaultIfEmpty(source: self.asObservable(), default: `default`)
21 | }
22 | }
23 |
24 | final fileprivate class DefaultIfEmptySink: Sink, ObserverType {
25 | typealias E = O.E
26 | private let _default: E
27 | private var _isEmpty = true
28 |
29 | init(default: E, observer: O, cancel: Cancelable) {
30 | _default = `default`
31 | super.init(observer: observer, cancel: cancel)
32 | }
33 |
34 | func on(_ event: Event) {
35 | switch event {
36 | case .next(_):
37 | _isEmpty = false
38 | forwardOn(event)
39 | case .error(_):
40 | forwardOn(event)
41 | dispose()
42 | case .completed:
43 | if _isEmpty {
44 | forwardOn(.next(_default))
45 | }
46 | forwardOn(.completed)
47 | dispose()
48 | }
49 | }
50 | }
51 |
52 | final fileprivate class DefaultIfEmpty: Producer {
53 | private let _source: Observable
54 | private let _default: SourceType
55 |
56 | init(source: Observable, `default`: SourceType) {
57 | _source = source
58 | _default = `default`
59 | }
60 |
61 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == SourceType {
62 | let sink = DefaultIfEmptySink(default: _default, observer: observer, cancel: cancel)
63 | let subscription = _source.subscribe(sink)
64 | return (sink: sink, subscription: subscription)
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Observables/Deferred.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Deferred.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 4/19/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType {
10 | /**
11 | Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.
12 |
13 | - seealso: [defer operator on reactivex.io](http://reactivex.io/documentation/operators/defer.html)
14 |
15 | - parameter observableFactory: Observable factory function to invoke for each observer that subscribes to the resulting sequence.
16 | - returns: An observable sequence whose observers trigger an invocation of the given observable factory function.
17 | */
18 | public static func deferred(_ observableFactory: @escaping () throws -> Observable)
19 | -> Observable {
20 | return Deferred(observableFactory: observableFactory)
21 | }
22 | }
23 |
24 | final fileprivate class DeferredSink : Sink, ObserverType where S.E == O.E {
25 | typealias E = O.E
26 |
27 | private let _observableFactory: () throws -> S
28 |
29 | init(observableFactory: @escaping () throws -> S, observer: O, cancel: Cancelable) {
30 | _observableFactory = observableFactory
31 | super.init(observer: observer, cancel: cancel)
32 | }
33 |
34 | func run() -> Disposable {
35 | do {
36 | let result = try _observableFactory()
37 | return result.subscribe(self)
38 | }
39 | catch let e {
40 | forwardOn(.error(e))
41 | dispose()
42 | return Disposables.create()
43 | }
44 | }
45 |
46 | func on(_ event: Event) {
47 | forwardOn(event)
48 |
49 | switch event {
50 | case .next:
51 | break
52 | case .error:
53 | dispose()
54 | case .completed:
55 | dispose()
56 | }
57 | }
58 | }
59 |
60 | final fileprivate class Deferred : Producer {
61 | typealias Factory = () throws -> S
62 |
63 | private let _observableFactory : Factory
64 |
65 | init(observableFactory: @escaping Factory) {
66 | _observableFactory = observableFactory
67 | }
68 |
69 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == S.E {
70 | let sink = DeferredSink(observableFactory: _observableFactory, observer: observer, cancel: cancel)
71 | let subscription = sink.run()
72 | return (sink: sink, subscription: subscription)
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Observables/DelaySubscription.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DelaySubscription.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 6/14/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType {
10 |
11 | /**
12 | Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.
13 |
14 | - seealso: [delay operator on reactivex.io](http://reactivex.io/documentation/operators/delay.html)
15 |
16 | - parameter dueTime: Relative time shift of the subscription.
17 | - parameter scheduler: Scheduler to run the subscription delay timer on.
18 | - returns: Time-shifted sequence.
19 | */
20 | public func delaySubscription(_ dueTime: RxTimeInterval, scheduler: SchedulerType)
21 | -> Observable {
22 | return DelaySubscription(source: self.asObservable(), dueTime: dueTime, scheduler: scheduler)
23 | }
24 | }
25 |
26 | final fileprivate class DelaySubscriptionSink
27 | : Sink, ObserverType {
28 | typealias E = O.E
29 | typealias Parent = DelaySubscription
30 |
31 | private let _parent: Parent
32 |
33 | init(parent: Parent, observer: O, cancel: Cancelable) {
34 | _parent = parent
35 | super.init(observer: observer, cancel: cancel)
36 | }
37 |
38 | func on(_ event: Event) {
39 | forwardOn(event)
40 | if event.isStopEvent {
41 | dispose()
42 | }
43 | }
44 |
45 | }
46 |
47 | final fileprivate class DelaySubscription: Producer {
48 | private let _source: Observable
49 | private let _dueTime: RxTimeInterval
50 | private let _scheduler: SchedulerType
51 |
52 | init(source: Observable, dueTime: RxTimeInterval, scheduler: SchedulerType) {
53 | _source = source
54 | _dueTime = dueTime
55 | _scheduler = scheduler
56 | }
57 |
58 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
59 | let sink = DelaySubscriptionSink(parent: self, observer: observer, cancel: cancel)
60 | let subscription = _scheduler.scheduleRelative((), dueTime: _dueTime) { _ in
61 | return self._source.subscribe(sink)
62 | }
63 |
64 | return (sink: sink, subscription: subscription)
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/Example/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 E: 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 | return Dematerialize(source: self.asObservable())
17 | }
18 |
19 | }
20 |
21 | fileprivate final class DematerializeSink: Sink, ObserverType where O.E == Element.ElementType {
22 | fileprivate func on(_ event: Event) {
23 | switch event {
24 | case .next(let element):
25 | forwardOn(element.event)
26 | if element.event.isStopEvent {
27 | dispose()
28 | }
29 | case .completed:
30 | forwardOn(.completed)
31 | dispose()
32 | case .error(let error):
33 | forwardOn(.error(error))
34 | dispose()
35 | }
36 | }
37 | }
38 |
39 | final fileprivate class Dematerialize: Producer {
40 | private let _source: Observable
41 |
42 | init(source: Observable) {
43 | _source = source
44 | }
45 |
46 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element.ElementType {
47 | let sink = DematerializeSink(observer: observer, cancel: cancel)
48 | let subscription = _source.subscribe(sink)
49 | return (sink: sink, subscription: subscription)
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Observables/ElementAt.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ElementAt.swift
3 | // RxSwift
4 | //
5 | // Created by Junior B. on 21/10/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType {
10 |
11 | /**
12 | Returns a sequence emitting only element _n_ emitted by an Observable
13 |
14 | - seealso: [elementAt operator on reactivex.io](http://reactivex.io/documentation/operators/elementat.html)
15 |
16 | - parameter index: The index of the required element (starting from 0).
17 | - returns: An observable sequence that emits the desired element as its own sole emission.
18 | */
19 | public func elementAt(_ index: Int)
20 | -> Observable {
21 | return ElementAt(source: asObservable(), index: index, throwOnEmpty: true)
22 | }
23 | }
24 |
25 | final fileprivate class ElementAtSink : Sink, ObserverType {
26 | typealias SourceType = O.E
27 | typealias Parent = ElementAt
28 |
29 | let _parent: Parent
30 | var _i: Int
31 |
32 | init(parent: Parent, observer: O, cancel: Cancelable) {
33 | _parent = parent
34 | _i = parent._index
35 |
36 | super.init(observer: observer, cancel: cancel)
37 | }
38 |
39 | func on(_ event: Event) {
40 | switch event {
41 | case .next(_):
42 |
43 | if (_i == 0) {
44 | forwardOn(event)
45 | forwardOn(.completed)
46 | self.dispose()
47 | }
48 |
49 | do {
50 | let _ = try decrementChecked(&_i)
51 | } catch(let e) {
52 | forwardOn(.error(e))
53 | dispose()
54 | return
55 | }
56 |
57 | case .error(let e):
58 | forwardOn(.error(e))
59 | self.dispose()
60 | case .completed:
61 | if (_parent._throwOnEmpty) {
62 | forwardOn(.error(RxError.argumentOutOfRange))
63 | } else {
64 | forwardOn(.completed)
65 | }
66 |
67 | self.dispose()
68 | }
69 | }
70 | }
71 |
72 | final fileprivate class ElementAt : Producer {
73 |
74 | let _source: Observable
75 | let _throwOnEmpty: Bool
76 | let _index: Int
77 |
78 | init(source: Observable, index: Int, throwOnEmpty: Bool) {
79 | if index < 0 {
80 | rxFatalError("index can't be negative")
81 | }
82 |
83 | self._source = source
84 | self._index = index
85 | self._throwOnEmpty = throwOnEmpty
86 | }
87 |
88 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == SourceType {
89 | let sink = ElementAtSink(parent: self, observer: observer, cancel: cancel)
90 | let subscription = _source.subscribe(sink)
91 | return (sink: sink, subscription: subscription)
92 | }
93 | }
94 |
--------------------------------------------------------------------------------
/Example/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 | return EmptyProducer()
19 | }
20 | }
21 |
22 | final fileprivate class EmptyProducer : Producer {
23 | override func subscribe(_ observer: O) -> Disposable where O.E == Element {
24 | observer.on(.completed)
25 | return Disposables.create()
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Observables/Enumerated.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Enumerated.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 8/6/17.
6 | // Copyright © 2017 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType {
10 |
11 | /**
12 | Enumerates the elements of an observable sequence.
13 |
14 | - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html)
15 |
16 | - returns: An observable sequence that contains tuples of source sequence elements and their indexes.
17 | */
18 | public func enumerated()
19 | -> Observable<(index: Int, element: E)> {
20 | return Enumerated(source: self.asObservable())
21 | }
22 | }
23 |
24 | final fileprivate class EnumeratedSink: Sink, ObserverType where O.E == (index: Int, element: Element) {
25 | typealias E = Element
26 | var index = 0
27 |
28 | func on(_ event: Event) {
29 | switch event {
30 | case .next(let value):
31 | do {
32 | let nextIndex = try incrementChecked(&index)
33 | let next = (index: nextIndex, element: value)
34 | forwardOn(.next(next))
35 | }
36 | catch let e {
37 | forwardOn(.error(e))
38 | dispose()
39 | }
40 | case .completed:
41 | forwardOn(.completed)
42 | dispose()
43 | case .error(let error):
44 | forwardOn(.error(error))
45 | dispose()
46 | }
47 | }
48 | }
49 |
50 | final fileprivate class Enumerated : Producer<(index: Int, element: Element)> {
51 | private let _source: Observable
52 |
53 | init(source: Observable) {
54 | _source = source
55 | }
56 |
57 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == (index: Int, element: Element) {
58 | let sink = EnumeratedSink(observer: observer, cancel: cancel)
59 | let subscription = _source.subscribe(sink)
60 | return (sink: sink, subscription: subscription)
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/Example/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 | return ErrorProducer(error: error)
19 | }
20 | }
21 |
22 | final fileprivate class ErrorProducer : Producer {
23 | private let _error: Swift.Error
24 |
25 | init(error: Swift.Error) {
26 | _error = error
27 | }
28 |
29 | override func subscribe(_ observer: O) -> Disposable where O.E == Element {
30 | observer.on(.error(_error))
31 | return Disposables.create()
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Observables/Filter.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Filter.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/17/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType {
10 |
11 | /**
12 | Filters the elements of an observable sequence based on a predicate.
13 |
14 | - seealso: [filter operator on reactivex.io](http://reactivex.io/documentation/operators/filter.html)
15 |
16 | - parameter predicate: A function to test each source element for a condition.
17 | - returns: An observable sequence that contains elements from the input sequence that satisfy the condition.
18 | */
19 | public func filter(_ predicate: @escaping (E) throws -> Bool)
20 | -> Observable {
21 | return Filter(source: asObservable(), predicate: predicate)
22 | }
23 | }
24 |
25 | extension ObservableType {
26 |
27 | /**
28 | Skips elements and completes (or errors) when the receiver completes (or errors). Equivalent to filter that always returns false.
29 |
30 | - seealso: [ignoreElements operator on reactivex.io](http://reactivex.io/documentation/operators/ignoreelements.html)
31 |
32 | - returns: An observable sequence that skips all elements of the source sequence.
33 | */
34 | public func ignoreElements()
35 | -> Completable {
36 | return flatMap { _ in
37 | return Observable.empty()
38 | }
39 | .asCompletable()
40 | }
41 | }
42 |
43 | final fileprivate class FilterSink: Sink, ObserverType {
44 | typealias Predicate = (Element) throws -> Bool
45 | typealias Element = O.E
46 |
47 | private let _predicate: Predicate
48 |
49 | init(predicate: @escaping Predicate, observer: O, cancel: Cancelable) {
50 | _predicate = predicate
51 | super.init(observer: observer, cancel: cancel)
52 | }
53 |
54 | func on(_ event: Event) {
55 | switch event {
56 | case .next(let value):
57 | do {
58 | let satisfies = try _predicate(value)
59 | if satisfies {
60 | forwardOn(.next(value))
61 | }
62 | }
63 | catch let e {
64 | forwardOn(.error(e))
65 | dispose()
66 | }
67 | case .completed, .error:
68 | forwardOn(event)
69 | dispose()
70 | }
71 | }
72 | }
73 |
74 | final fileprivate class Filter : Producer {
75 | typealias Predicate = (Element) throws -> Bool
76 |
77 | private let _source: Observable
78 | private let _predicate: Predicate
79 |
80 | init(source: Observable, predicate: @escaping Predicate) {
81 | _source = source
82 | _predicate = predicate
83 | }
84 |
85 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
86 | let sink = FilterSink(predicate: _predicate, observer: observer, cancel: cancel)
87 | let subscription = _source.subscribe(sink)
88 | return (sink: sink, subscription: subscription)
89 | }
90 | }
91 |
--------------------------------------------------------------------------------
/Example/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 | fileprivate final class FirstSink : Sink, ObserverType where O.E == Element? {
10 | typealias E = Element
11 | typealias Parent = First
12 |
13 | func on(_ event: Event) {
14 | switch event {
15 | case .next(let value):
16 | forwardOn(.next(value))
17 | forwardOn(.completed)
18 | dispose()
19 | case .error(let error):
20 | forwardOn(.error(error))
21 | dispose()
22 | case .completed:
23 | forwardOn(.next(nil))
24 | forwardOn(.completed)
25 | dispose()
26 | }
27 | }
28 | }
29 |
30 | final class First: Producer {
31 | fileprivate let _source: Observable
32 |
33 | init(source: Observable) {
34 | _source = source
35 | }
36 |
37 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element? {
38 | let sink = FirstSink(observer: observer, cancel: cancel)
39 | let subscription = _source.subscribe(sink)
40 | return (sink: sink, subscription: subscription)
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Observables/Generate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Generate.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 9/2/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType {
10 | /**
11 | Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler
12 | to run the loop send out observer messages.
13 |
14 | - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)
15 |
16 | - parameter initialState: Initial state.
17 | - parameter condition: Condition to terminate generation (upon returning `false`).
18 | - parameter iterate: Iteration step function.
19 | - parameter scheduler: Scheduler on which to run the generator loop.
20 | - returns: The generated sequence.
21 | */
22 | public static func generate(initialState: E, condition: @escaping (E) throws -> Bool, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance, iterate: @escaping (E) throws -> E) -> Observable {
23 | return Generate(initialState: initialState, condition: condition, iterate: iterate, resultSelector: { $0 }, scheduler: scheduler)
24 | }
25 | }
26 |
27 | final fileprivate class GenerateSink : Sink {
28 | typealias Parent = Generate
29 |
30 | private let _parent: Parent
31 |
32 | private var _state: S
33 |
34 | init(parent: Parent, observer: O, cancel: Cancelable) {
35 | _parent = parent
36 | _state = parent._initialState
37 | super.init(observer: observer, cancel: cancel)
38 | }
39 |
40 | func run() -> Disposable {
41 | return _parent._scheduler.scheduleRecursive(true) { (isFirst, recurse) -> Void in
42 | do {
43 | if !isFirst {
44 | self._state = try self._parent._iterate(self._state)
45 | }
46 |
47 | if try self._parent._condition(self._state) {
48 | let result = try self._parent._resultSelector(self._state)
49 | self.forwardOn(.next(result))
50 |
51 | recurse(false)
52 | }
53 | else {
54 | self.forwardOn(.completed)
55 | self.dispose()
56 | }
57 | }
58 | catch let error {
59 | self.forwardOn(.error(error))
60 | self.dispose()
61 | }
62 | }
63 | }
64 | }
65 |
66 | final fileprivate class Generate : Producer {
67 | fileprivate let _initialState: S
68 | fileprivate let _condition: (S) throws -> Bool
69 | fileprivate let _iterate: (S) throws -> S
70 | fileprivate let _resultSelector: (S) throws -> E
71 | fileprivate let _scheduler: ImmediateSchedulerType
72 |
73 | init(initialState: S, condition: @escaping (S) throws -> Bool, iterate: @escaping (S) throws -> S, resultSelector: @escaping (S) throws -> E, scheduler: ImmediateSchedulerType) {
74 | _initialState = initialState
75 | _condition = condition
76 | _iterate = iterate
77 | _resultSelector = resultSelector
78 | _scheduler = scheduler
79 | super.init()
80 | }
81 |
82 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {
83 | let sink = GenerateSink(parent: self, observer: observer, cancel: cancel)
84 | let subscription = sink.run()
85 | return (sink: sink, subscription: subscription)
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Observables/Just.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Just.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 contains a single element.
12 |
13 | - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)
14 |
15 | - parameter element: Single element in the resulting observable sequence.
16 | - returns: An observable sequence containing the single specified element.
17 | */
18 | public static func just(_ element: E) -> Observable {
19 | return Just(element: element)
20 | }
21 |
22 | /**
23 | Returns an observable sequence that contains a single element.
24 |
25 | - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)
26 |
27 | - parameter element: Single element in the resulting observable sequence.
28 | - parameter: Scheduler to send the single element on.
29 | - returns: An observable sequence containing the single specified element.
30 | */
31 | public static func just(_ element: E, scheduler: ImmediateSchedulerType) -> Observable {
32 | return JustScheduled(element: element, scheduler: scheduler)
33 | }
34 | }
35 |
36 | final fileprivate class JustScheduledSink : Sink {
37 | typealias Parent = JustScheduled
38 |
39 | private let _parent: Parent
40 |
41 | init(parent: Parent, observer: O, cancel: Cancelable) {
42 | _parent = parent
43 | super.init(observer: observer, cancel: cancel)
44 | }
45 |
46 | func run() -> Disposable {
47 | let scheduler = _parent._scheduler
48 | return scheduler.schedule(_parent._element) { element in
49 | self.forwardOn(.next(element))
50 | return scheduler.schedule(()) { _ in
51 | self.forwardOn(.completed)
52 | self.dispose()
53 | return Disposables.create()
54 | }
55 | }
56 | }
57 | }
58 |
59 | final fileprivate class JustScheduled : Producer {
60 | fileprivate let _scheduler: ImmediateSchedulerType
61 | fileprivate let _element: Element
62 |
63 | init(element: Element, scheduler: ImmediateSchedulerType) {
64 | _scheduler = scheduler
65 | _element = element
66 | }
67 |
68 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {
69 | let sink = JustScheduledSink(parent: self, observer: observer, cancel: cancel)
70 | let subscription = sink.run()
71 | return (sink: sink, subscription: subscription)
72 | }
73 | }
74 |
75 | final fileprivate class Just : Producer {
76 | private let _element: Element
77 |
78 | init(element: Element) {
79 | _element = element
80 | }
81 |
82 | override func subscribe(_ observer: O) -> Disposable where O.E == Element {
83 | observer.on(.next(_element))
84 | observer.on(.completed)
85 | return Disposables.create()
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/Example/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 | return Materialize(source: self.asObservable())
17 | }
18 | }
19 |
20 | fileprivate final class MaterializeSink: Sink, ObserverType where O.E == Event {
21 |
22 | func on(_ event: Event) {
23 | forwardOn(.next(event))
24 | if event.isStopEvent {
25 | forwardOn(.completed)
26 | dispose()
27 | }
28 | }
29 | }
30 |
31 | final fileprivate class Materialize: Producer> {
32 | private let _source: Observable
33 |
34 | init(source: Observable) {
35 | _source = source
36 | }
37 |
38 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {
39 | let sink = MaterializeSink(observer: observer, cancel: cancel)
40 | let subscription = _source.subscribe(sink)
41 |
42 | return (sink: sink, subscription: subscription)
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/Example/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 | return NeverProducer()
20 | }
21 | }
22 |
23 | final fileprivate class NeverProducer : Producer {
24 | override func subscribe(_ observer: O) -> Disposable where O.E == Element {
25 | return Disposables.create()
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Observables/Optional.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Optional.swift
3 | // RxSwift
4 | //
5 | // Created by tarunon on 2016/12/13.
6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType {
10 | /**
11 | Converts a optional to an observable sequence.
12 |
13 | - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)
14 |
15 | - parameter optional: Optional element in the resulting observable sequence.
16 | - returns: An observable sequence containing the wrapped value or not from given optional.
17 | */
18 | public static func from(optional: E?) -> Observable {
19 | return ObservableOptional(optional: optional)
20 | }
21 |
22 | /**
23 | Converts a optional to an observable sequence.
24 |
25 | - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)
26 |
27 | - parameter optional: Optional element in the resulting observable sequence.
28 | - parameter: Scheduler to send the optional element on.
29 | - returns: An observable sequence containing the wrapped value or not from given optional.
30 | */
31 | public static func from(optional: E?, scheduler: ImmediateSchedulerType) -> Observable {
32 | return ObservableOptionalScheduled(optional: optional, scheduler: scheduler)
33 | }
34 | }
35 |
36 | final fileprivate class ObservableOptionalScheduledSink : Sink {
37 | typealias E = O.E
38 | typealias Parent = ObservableOptionalScheduled
39 |
40 | private let _parent: Parent
41 |
42 | init(parent: Parent, observer: O, cancel: Cancelable) {
43 | _parent = parent
44 | super.init(observer: observer, cancel: cancel)
45 | }
46 |
47 | func run() -> Disposable {
48 | return _parent._scheduler.schedule(_parent._optional) { (optional: E?) -> Disposable in
49 | if let next = optional {
50 | self.forwardOn(.next(next))
51 | return self._parent._scheduler.schedule(()) { _ in
52 | self.forwardOn(.completed)
53 | self.dispose()
54 | return Disposables.create()
55 | }
56 | } else {
57 | self.forwardOn(.completed)
58 | self.dispose()
59 | return Disposables.create()
60 | }
61 | }
62 | }
63 | }
64 |
65 | final fileprivate class ObservableOptionalScheduled : Producer {
66 | fileprivate let _optional: E?
67 | fileprivate let _scheduler: ImmediateSchedulerType
68 |
69 | init(optional: E?, scheduler: ImmediateSchedulerType) {
70 | _optional = optional
71 | _scheduler = scheduler
72 | }
73 |
74 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {
75 | let sink = ObservableOptionalScheduledSink(parent: self, observer: observer, cancel: cancel)
76 | let subscription = sink.run()
77 | return (sink: sink, subscription: subscription)
78 | }
79 | }
80 |
81 | final fileprivate class ObservableOptional: Producer {
82 | private let _optional: E?
83 |
84 | init(optional: E?) {
85 | _optional = optional
86 | }
87 |
88 | override func subscribe(_ observer: O) -> Disposable where O.E == E {
89 | if let element = _optional {
90 | observer.on(.next(element))
91 | }
92 | observer.on(.completed)
93 | return Disposables.create()
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Observables/Producer.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Producer.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 2/20/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | class Producer : Observable {
10 | override init() {
11 | super.init()
12 | }
13 |
14 | override func subscribe(_ observer: O) -> Disposable where O.E == Element {
15 | if !CurrentThreadScheduler.isScheduleRequired {
16 | // The returned disposable needs to release all references once it was disposed.
17 | let disposer = SinkDisposer()
18 | let sinkAndSubscription = run(observer, cancel: disposer)
19 | disposer.setSinkAndSubscription(sink: sinkAndSubscription.sink, subscription: sinkAndSubscription.subscription)
20 |
21 | return disposer
22 | }
23 | else {
24 | return CurrentThreadScheduler.instance.schedule(()) { _ in
25 | let disposer = SinkDisposer()
26 | let sinkAndSubscription = self.run(observer, cancel: disposer)
27 | disposer.setSinkAndSubscription(sink: sinkAndSubscription.sink, subscription: sinkAndSubscription.subscription)
28 |
29 | return disposer
30 | }
31 | }
32 | }
33 |
34 | func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
35 | rxAbstractMethod()
36 | }
37 | }
38 |
39 | fileprivate final class SinkDisposer: Cancelable {
40 | fileprivate enum DisposeState: UInt32 {
41 | case disposed = 1
42 | case sinkAndSubscriptionSet = 2
43 | }
44 |
45 | // Jeej, swift API consistency rules
46 | fileprivate enum DisposeStateInt32: Int32 {
47 | case disposed = 1
48 | case sinkAndSubscriptionSet = 2
49 | }
50 |
51 | private var _state: AtomicInt = 0
52 | private var _sink: Disposable? = nil
53 | private var _subscription: Disposable? = nil
54 |
55 | var isDisposed: Bool {
56 | return AtomicFlagSet(DisposeState.disposed.rawValue, &_state)
57 | }
58 |
59 | func setSinkAndSubscription(sink: Disposable, subscription: Disposable) {
60 | _sink = sink
61 | _subscription = subscription
62 |
63 | let previousState = AtomicOr(DisposeState.sinkAndSubscriptionSet.rawValue, &_state)
64 | if (previousState & DisposeStateInt32.sinkAndSubscriptionSet.rawValue) != 0 {
65 | rxFatalError("Sink and subscription were already set")
66 | }
67 |
68 | if (previousState & DisposeStateInt32.disposed.rawValue) != 0 {
69 | sink.dispose()
70 | subscription.dispose()
71 | _sink = nil
72 | _subscription = nil
73 | }
74 | }
75 |
76 | func dispose() {
77 | let previousState = AtomicOr(DisposeState.disposed.rawValue, &_state)
78 |
79 | if (previousState & DisposeStateInt32.disposed.rawValue) != 0 {
80 | return
81 | }
82 |
83 | if (previousState & DisposeStateInt32.sinkAndSubscriptionSet.rawValue) != 0 {
84 | guard let sink = _sink else {
85 | rxFatalError("Sink not set")
86 | }
87 | guard let subscription = _subscription else {
88 | rxFatalError("Subscription not set")
89 | }
90 |
91 | sink.dispose()
92 | subscription.dispose()
93 |
94 | _sink = nil
95 | _subscription = nil
96 | }
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Observables/Range.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Range.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 9/13/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType where E : RxAbstractInteger {
10 | /**
11 | Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to generate and send out observer messages.
12 |
13 | - seealso: [range operator on reactivex.io](http://reactivex.io/documentation/operators/range.html)
14 |
15 | - parameter start: The value of the first integer in the sequence.
16 | - parameter count: The number of sequential integers to generate.
17 | - parameter scheduler: Scheduler to run the generator loop on.
18 | - returns: An observable sequence that contains a range of sequential integral numbers.
19 | */
20 | public static func range(start: E, count: E, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable {
21 | return RangeProducer(start: start, count: count, scheduler: scheduler)
22 | }
23 | }
24 |
25 | final fileprivate class RangeProducer : Producer {
26 | fileprivate let _start: E
27 | fileprivate let _count: E
28 | fileprivate let _scheduler: ImmediateSchedulerType
29 |
30 | init(start: E, count: E, scheduler: ImmediateSchedulerType) {
31 | if count < 0 {
32 | rxFatalError("count can't be negative")
33 | }
34 |
35 | if start &+ (count - 1) < start {
36 | rxFatalError("overflow of count")
37 | }
38 |
39 | _start = start
40 | _count = count
41 | _scheduler = scheduler
42 | }
43 |
44 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {
45 | let sink = RangeSink(parent: self, observer: observer, cancel: cancel)
46 | let subscription = sink.run()
47 | return (sink: sink, subscription: subscription)
48 | }
49 | }
50 |
51 | final fileprivate class RangeSink : Sink where O.E: RxAbstractInteger {
52 | typealias Parent = RangeProducer
53 |
54 | private let _parent: Parent
55 |
56 | init(parent: Parent, observer: O, cancel: Cancelable) {
57 | _parent = parent
58 | super.init(observer: observer, cancel: cancel)
59 | }
60 |
61 | func run() -> Disposable {
62 | return _parent._scheduler.scheduleRecursive(0 as O.E) { i, recurse in
63 | if i < self._parent._count {
64 | self.forwardOn(.next(self._parent._start + i))
65 | recurse(i + 1)
66 | }
67 | else {
68 | self.forwardOn(.completed)
69 | self.dispose()
70 | }
71 | }
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Observables/Repeat.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Repeat.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 9/13/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType {
10 | /**
11 | Generates an observable sequence that repeats the given element infinitely, using the specified scheduler to send out observer messages.
12 |
13 | - seealso: [repeat operator on reactivex.io](http://reactivex.io/documentation/operators/repeat.html)
14 |
15 | - parameter element: Element to repeat.
16 | - parameter scheduler: Scheduler to run the producer loop on.
17 | - returns: An observable sequence that repeats the given element infinitely.
18 | */
19 | public static func repeatElement(_ element: E, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable {
20 | return RepeatElement(element: element, scheduler: scheduler)
21 | }
22 | }
23 |
24 | final fileprivate class RepeatElement : Producer {
25 | fileprivate let _element: Element
26 | fileprivate let _scheduler: ImmediateSchedulerType
27 |
28 | init(element: Element, scheduler: ImmediateSchedulerType) {
29 | _element = element
30 | _scheduler = scheduler
31 | }
32 |
33 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
34 | let sink = RepeatElementSink(parent: self, observer: observer, cancel: cancel)
35 | let subscription = sink.run()
36 |
37 | return (sink: sink, subscription: subscription)
38 | }
39 | }
40 |
41 | final fileprivate class RepeatElementSink : Sink {
42 | typealias Parent = RepeatElement
43 |
44 | private let _parent: Parent
45 |
46 | init(parent: Parent, observer: O, cancel: Cancelable) {
47 | _parent = parent
48 | super.init(observer: observer, cancel: cancel)
49 | }
50 |
51 | func run() -> Disposable {
52 | return _parent._scheduler.scheduleRecursive(_parent._element) { e, recurse in
53 | self.forwardOn(.next(e))
54 | recurse(e)
55 | }
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Observables/Scan.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Scan.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 6/14/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType {
10 |
11 | /**
12 | Applies an accumulator function over an observable sequence and returns each intermediate result. The specified seed value is used as the initial accumulator value.
13 |
14 | For aggregation behavior with no intermediate results, see `reduce`.
15 |
16 | - seealso: [scan operator on reactivex.io](http://reactivex.io/documentation/operators/scan.html)
17 |
18 | - parameter seed: The initial accumulator value.
19 | - parameter accumulator: An accumulator function to be invoked on each element.
20 | - returns: An observable sequence containing the accumulated values.
21 | */
22 | public func scan(_ seed: A, accumulator: @escaping (A, E) throws -> A)
23 | -> Observable {
24 | return Scan(source: self.asObservable(), seed: seed, accumulator: accumulator)
25 | }
26 | }
27 |
28 | final fileprivate class ScanSink : Sink, ObserverType {
29 | typealias Accumulate = O.E
30 | typealias Parent = Scan
31 | typealias E = ElementType
32 |
33 | fileprivate let _parent: Parent
34 | fileprivate var _accumulate: Accumulate
35 |
36 | init(parent: Parent, observer: O, cancel: Cancelable) {
37 | _parent = parent
38 | _accumulate = parent._seed
39 | super.init(observer: observer, cancel: cancel)
40 | }
41 |
42 | func on(_ event: Event) {
43 | switch event {
44 | case .next(let element):
45 | do {
46 | _accumulate = try _parent._accumulator(_accumulate, element)
47 | forwardOn(.next(_accumulate))
48 | }
49 | catch let error {
50 | forwardOn(.error(error))
51 | dispose()
52 | }
53 | case .error(let error):
54 | forwardOn(.error(error))
55 | dispose()
56 | case .completed:
57 | forwardOn(.completed)
58 | dispose()
59 | }
60 | }
61 |
62 | }
63 |
64 | final fileprivate class Scan: Producer {
65 | typealias Accumulator = (Accumulate, Element) throws -> Accumulate
66 |
67 | fileprivate let _source: Observable
68 | fileprivate let _seed: Accumulate
69 | fileprivate let _accumulator: Accumulator
70 |
71 | init(source: Observable, seed: Accumulate, accumulator: @escaping Accumulator) {
72 | _source = source
73 | _seed = seed
74 | _accumulator = accumulator
75 | }
76 |
77 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Accumulate {
78 | let sink = ScanSink(parent: self, observer: observer, cancel: cancel)
79 | let subscription = _source.subscribe(sink)
80 | return (sink: sink, subscription: subscription)
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/Example/Pods/RxSwift/RxSwift/Observables/Sequence.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Sequence.swift
3 | // RxSwift
4 | //
5 | // Created by Krunoslav Zaher on 11/14/15.
6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved.
7 | //
8 |
9 | extension ObservableType {
10 | // MARK: of
11 |
12 | /**
13 | This method creates a new Observable instance with a variable number of elements.
14 |
15 | - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)
16 |
17 | - parameter elements: Elements to generate.
18 | - parameter scheduler: Scheduler to send elements on. If `nil`, elements are sent immediately on subscription.
19 | - returns: The observable sequence whose elements are pulled from the given arguments.
20 | */
21 | public static func of(_ elements: E ..., scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable {
22 | return ObservableSequence(elements: elements, scheduler: scheduler)
23 | }
24 | }
25 |
26 | extension ObservableType {
27 | /**
28 | Converts an array to an observable sequence.
29 |
30 | - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)
31 |
32 | - returns: The observable sequence whose elements are pulled from the given enumerable sequence.
33 | */
34 | public static func from(_ array: [E], scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable {
35 | return ObservableSequence(elements: array, scheduler: scheduler)
36 | }
37 |
38 | /**
39 | Converts a sequence to an observable sequence.
40 |
41 | - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)
42 |
43 | - returns: The observable sequence whose elements are pulled from the given enumerable sequence.
44 | */
45 | public static func from(_ sequence: S, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable where S.Iterator.Element == E {
46 | return ObservableSequence(elements: sequence, scheduler: scheduler)
47 | }
48 | }
49 |
50 | final fileprivate class ObservableSequenceSink : Sink where S.Iterator.Element == O.E {
51 | typealias Parent = ObservableSequence
52 |
53 | private let _parent: Parent
54 |
55 | init(parent: Parent, observer: O, cancel: Cancelable) {
56 | _parent = parent
57 | super.init(observer: observer, cancel: cancel)
58 | }
59 |
60 | func run() -> Disposable {
61 | return _parent._scheduler.scheduleRecursive((_parent._elements.makeIterator(), _parent._elements)) { (iterator, recurse) in
62 | var mutableIterator = iterator
63 | if let next = mutableIterator.0.next() {
64 | self.forwardOn(.next(next))
65 | recurse(mutableIterator)
66 | }
67 | else {
68 | self.forwardOn(.completed)
69 | self.dispose()
70 | }
71 | }
72 | }
73 | }
74 |
75 | final fileprivate class ObservableSequence : Producer {
76 | fileprivate let _elements: S
77 | fileprivate let _scheduler: ImmediateSchedulerType
78 |
79 | init(elements: S, scheduler: ImmediateSchedulerType) {
80 | _elements = elements
81 | _scheduler = scheduler
82 | }
83 |
84 | override func run