0001    //
0002    //  RecursiveScheduler.swift
0003    //  RxSwift
0004    //
0005    //  Created by Krunoslav Zaher on 6/7/15.
0006    //  Copyright © 2015 Krunoslav Zaher. All rights reserved.
0007    //
0008    
0009    import Foundation
0010    
0011    /**
0012    Type erased recursive scheduler.
0013    */
0014    class AnyRecursiveScheduler
RecursiveScheduler.swift:15
    typealias Action =  (state: State, scheduler: AnyRecursiveScheduler<State>) -> Void
SchedulerServices+Emulation.swift:18
    typealias RecursiveScheduler = AnyRecursiveScheduler<SchedulePeriodicRecursiveCommand>
SchedulerType.swift:71
    func scheduleRecursive<State>(state: State, dueTime: RxTimeInterval, action: (state: State, scheduler: AnyRecursiveScheduler<State>) -> ()) -> Disposable {
SchedulerType.swift:72
        let scheduler = AnyRecursiveScheduler(scheduler: self, action: action)
<State
RecursiveScheduler.swift:15
    typealias Action =  (state: State, scheduler: AnyRecursiveScheduler<State>) -> Void
RecursiveScheduler.swift:15
    typealias Action =  (state: State, scheduler: AnyRecursiveScheduler<State>) -> Void
RecursiveScheduler.swift:36
    func schedule(state: State, dueTime: RxTimeInterval) {
RecursiveScheduler.swift:79
    func schedule(state: State) {
> { 0015 typealias Action
RecursiveScheduler.swift:23
    private var _action: Action?
RecursiveScheduler.swift:25
    init(scheduler: SchedulerType, action: Action) {
RecursiveScheduler.swift:48
            let action = self._lock.calculateLocked { () -> Action? in
RecursiveScheduler.swift:91
            let action = self._lock.calculateLocked { () -> Action? in
= (state: State, scheduler: AnyRecursiveScheduler<State>) -> Void 0016 0017 private let _lock
RecursiveScheduler.swift:48
            let action = self._lock.calculateLocked { () -> Action? in
RecursiveScheduler.swift:66
        _lock.performLocked {
RecursiveScheduler.swift:91
            let action = self._lock.calculateLocked { () -> Action? in
RecursiveScheduler.swift:109
        _lock.performLocked {
RecursiveScheduler.swift:118
        _lock.performLocked {
= NSRecursiveLock() 0018 0019 // state 0020 private let _group
RecursiveScheduler.swift:44
            if self._group.disposed {
RecursiveScheduler.swift:50
                    self._group.removeDisposable(removeKey!)
RecursiveScheduler.swift:68
                removeKey = _group.addDisposable(d)
RecursiveScheduler.swift:87
            if self._group.disposed {
RecursiveScheduler.swift:93
                    self._group.removeDisposable(removeKey!)
RecursiveScheduler.swift:111
                removeKey = _group.addDisposable(d)
RecursiveScheduler.swift:121
        _group.dispose()
= CompositeDisposable() 0021 0022 private var _scheduler
RecursiveScheduler.swift:27
        _scheduler = scheduler
RecursiveScheduler.swift:42
        let d = _scheduler.scheduleRelative(state, dueTime: dueTime) { (state) -> Disposable in
RecursiveScheduler.swift:85
        let d = _scheduler.schedule(state) { (state) -> Disposable in
: SchedulerType 0023 private var _action
RecursiveScheduler.swift:26
        _action = action
RecursiveScheduler.swift:56
                return self._action
RecursiveScheduler.swift:99
                return self._action
RecursiveScheduler.swift:119
            _action = nil
: Action? 0024 0025 init
SchedulerType.swift:72
        let scheduler = AnyRecursiveScheduler(scheduler: self, action: action)
(scheduler: SchedulerType, action: Action) { 0026 _action = action 0027 _scheduler = scheduler 0028 } 0029 0030 /** 0031 Schedules an action to be executed recursively. 0032 0033 - parameter state: State passed to the action to be executed. 0034 - parameter dueTime: Relative time after which to execute the recursive action. 0035 */ 0036 func schedule
SchedulerServices+Emulation.swift:46
            scheduler.schedule(.Tick, dueTime: _period)
SchedulerType.swift:74
        scheduler.schedule(state, dueTime: dueTime)
(state: State, dueTime: RxTimeInterval) { 0037 0038 var isAdded = false 0039 var isDone = false 0040 0041 var removeKey: CompositeDisposable.DisposeKey? = nil 0042 let d = _scheduler.scheduleRelative(state, dueTime: dueTime) { (state) -> Disposable in 0043 // best effort 0044 if self._group.disposed { 0045 return NopDisposable.instance 0046 } 0047 0048 let action = self._lock.calculateLocked { () -> Action? in 0049 if isAdded { 0050 self._group.removeDisposable(removeKey!) 0051 } 0052 else { 0053 isDone = true 0054 } 0055 0056 return self._action 0057 } 0058 0059 if let action = action { 0060 action(state: state, scheduler: self) 0061 } 0062 0063 return NopDisposable.instance 0064 } 0065 0066 _lock.performLocked { 0067 if !isDone { 0068 removeKey = _group.addDisposable(d) 0069 isAdded = true 0070 } 0071 } 0072 } 0073 0074 /** 0075 Schedules an action to be executed recursively. 0076 0077 - parameter state: State passed to the action to be executed. 0078 */ 0079 func schedule
SchedulerServices+Emulation.swift:59
                scheduler.schedule(SchedulePeriodicRecursiveCommand.DispatchStart)
(state: State) { 0080 0081 var isAdded = false 0082 var isDone = false 0083 0084 var removeKey: CompositeDisposable.DisposeKey? = nil 0085 let d = _scheduler.schedule(state) { (state) -> Disposable in 0086 // best effort 0087 if self._group.disposed { 0088 return NopDisposable.instance 0089 } 0090 0091 let action = self._lock.calculateLocked { () -> Action? in 0092 if isAdded { 0093 self._group.removeDisposable(removeKey!) 0094 } 0095 else { 0096 isDone = true 0097 } 0098 0099 return self._action 0100 } 0101 0102 if let action = action { 0103 action(state: state, scheduler: self) 0104 } 0105 0106 return NopDisposable.instance 0107 } 0108 0109 _lock.performLocked { 0110 if !isDone { 0111 removeKey = _group.addDisposable(d) 0112 isAdded = true 0113 } 0114 } 0115 } 0116 0117 func dispose
SchedulerType.swift:77
            scheduler.dispose()
() { 0118 _lock.performLocked { 0119 _action = nil 0120 } 0121 _group.dispose() 0122 } 0123 } 0124 0125 /** 0126 Type erased recursive scheduler. 0127 */ 0128 class RecursiveImmediateScheduler
ImmediateSchedulerType.swift:34
        let recursiveScheduler = RecursiveImmediateScheduler(action: action, scheduler: self)
<State
RecursiveScheduler.swift:129
    typealias Action =  (state: State, recurse: State -> Void) -> Void
RecursiveScheduler.swift:129
    typealias Action =  (state: State, recurse: State -> Void) -> Void
RecursiveScheduler.swift:149
    func schedule(state: State) {
> { 0129 typealias Action
RecursiveScheduler.swift:134
    private var _action: Action?
RecursiveScheduler.swift:137
    init(action: Action, scheduler: ImmediateSchedulerType) {
RecursiveScheduler.swift:161
            let action = self._lock.calculateLocked { () -> Action? in
= (state: State, recurse: State -> Void) -> Void 0130 0131 private var _lock
RecursiveScheduler.swift:161
            let action = self._lock.calculateLocked { () -> Action? in
RecursiveScheduler.swift:179
        _lock.performLocked {
RecursiveScheduler.swift:188
        _lock.performLocked {
= SpinLock() 0132 private let _group
RecursiveScheduler.swift:157
            if self._group.disposed {
RecursiveScheduler.swift:163
                    self._group.removeDisposable(removeKey!)
RecursiveScheduler.swift:181
                removeKey = _group.addDisposable(d)
RecursiveScheduler.swift:191
        _group.dispose()
= CompositeDisposable() 0133 0134 private var _action
RecursiveScheduler.swift:138
        _action = action
RecursiveScheduler.swift:169
                return self._action
RecursiveScheduler.swift:189
            _action = nil
: Action? 0135 private let _scheduler
RecursiveScheduler.swift:139
        _scheduler = scheduler
RecursiveScheduler.swift:155
        let d = _scheduler.schedule(state) { (state) -> Disposable in
: ImmediateSchedulerType 0136 0137 init
ImmediateSchedulerType.swift:34
        let recursiveScheduler = RecursiveImmediateScheduler(action: action, scheduler: self)
(action: Action, scheduler: ImmediateSchedulerType) { 0138 _action = action 0139 _scheduler = scheduler 0140 } 0141 0142 // immediate scheduling 0143 0144 /** 0145 Schedules an action to be executed recursively. 0146 0147 - parameter state: State passed to the action to be executed. 0148 */ 0149 func schedule
ImmediateSchedulerType.swift:36
        recursiveScheduler.schedule(state)
RecursiveScheduler.swift:173
                action(state: state, recurse: self.schedule)
(state: State) { 0150 0151 var isAdded = false 0152 var isDone = false 0153 0154 var removeKey: CompositeDisposable.DisposeKey? = nil 0155 let d = _scheduler.schedule(state) { (state) -> Disposable in 0156 // best effort 0157 if self._group.disposed { 0158 return NopDisposable.instance 0159 } 0160 0161 let action = self._lock.calculateLocked { () -> Action? in 0162 if isAdded { 0163 self._group.removeDisposable(removeKey!) 0164 } 0165 else { 0166 isDone = true 0167 } 0168 0169 return self._action 0170 } 0171 0172 if let action = action { 0173 action(state: state, recurse: self.schedule) 0174 } 0175 0176 return NopDisposable.instance 0177 } 0178 0179 _lock.performLocked { 0180 if !isDone { 0181 removeKey = _group.addDisposable(d) 0182 isAdded = true 0183 } 0184 } 0185 } 0186 0187 func dispose
ImmediateSchedulerType.swift:39
            recursiveScheduler.dispose()
() { 0188 _lock.performLocked { 0189 _action = nil 0190 } 0191 _group.dispose() 0192 } 0193 }