@@ -6,14 +6,14 @@ import RxCocoa
66public typealias CocoaAction = Action < Void , Void >
77
88/// Possible errors from invoking execute()
9- public enum ActionError : ErrorType {
10- case NotEnabled
11- case UnderlyingError ( ErrorType )
9+ public enum ActionError : Error {
10+ case notEnabled
11+ case underlyingError ( Error )
1212}
1313
1414/// TODO: Add some documentation.
1515public final class Action < Input, Element> {
16- public typealias WorkFactory = Input -> Observable < Element >
16+ public typealias WorkFactory = ( Input ) -> Observable < Element >
1717
1818 public let _enabledIf : Observable < Bool >
1919 public let workFactory : WorkFactory
@@ -23,83 +23,73 @@ public final class Action<Input, Element> {
2323 /// All inputs are always appear in this subject even if the action is not enabled.
2424 /// Thus, inputs count equals elements count + errors count.
2525 public let inputs = PublishSubject < Input > ( )
26- private let _completed = PublishSubject < Void > ( )
26+ fileprivate let _completed = PublishSubject < Void > ( )
2727
2828 /// Errors aggrevated from invocations of execute().
2929 /// Delivered on whatever scheduler they were sent from.
3030 public var errors : Observable < ActionError > {
3131 return self . _errors. asObservable ( )
3232 }
33- private let _errors = PublishSubject < ActionError > ( )
33+ fileprivate let _errors = PublishSubject < ActionError > ( )
3434
3535 /// Whether or not we're currently executing.
3636 /// Delivered on whatever scheduler they were sent from.
3737 public var elements : Observable < Element > {
3838 return self . _elements. asObservable ( )
3939 }
40- private let _elements = PublishSubject < Element > ( )
40+ fileprivate let _elements = PublishSubject < Element > ( )
4141
4242 /// Whether or not we're currently executing.
4343 /// Always observed on MainScheduler.
4444 public var executing : Observable < Bool > {
4545 return self . _executing. asObservable ( ) . observeOn ( MainScheduler . instance)
4646 }
47- private let _executing = Variable ( false )
47+ fileprivate let _executing = Variable ( false )
4848
4949 /// Observables returned by the workFactory.
5050 /// Useful for sending results back from work being completed
5151 /// e.g. response from a network call.
5252 public var executionObservables : Observable < Observable < Element > > {
5353 return self . _executionObservables. asObservable ( ) . observeOn ( MainScheduler . instance)
5454 }
55- private let _executionObservables = PublishSubject < Observable < Element > > ( )
55+ fileprivate let _executionObservables = PublishSubject < Observable < Element > > ( )
5656
5757 /// Whether or not we're enabled. Note that this is a *computed* sequence
5858 /// property based on enabledIf initializer and if we're currently executing.
5959 /// Always observed on MainScheduler.
6060 public var enabled : Observable < Bool > {
6161 return _enabled. asObservable ( ) . observeOn ( MainScheduler . instance)
6262 }
63- public private ( set) var _enabled = BehaviorSubject ( value: true )
63+ public fileprivate ( set) var _enabled = BehaviorSubject ( value: true )
6464
65- private let executingQueue = dispatch_queue_create ( " com.ashfurrow.Action.executingQueue " , DISPATCH_QUEUE_SERIAL )
66- private let disposeBag = DisposeBag ( )
65+ fileprivate let executingQueue = DispatchQueue ( label : " com.ashfurrow.Action.executingQueue " , attributes : [ ] )
66+ fileprivate let disposeBag = DisposeBag ( )
6767
68- public init < B: BooleanType > ( enabledIf: Observable < B > , workFactory: WorkFactory ) {
69- self . _enabledIf = enabledIf. map { booleanType in
70- return booleanType. boolValue
71- }
68+ public init ( enabledIf: Observable < Bool > = Observable . just ( true ) , workFactory: @escaping WorkFactory ) {
69+ self . _enabledIf = enabledIf
70+
7271 self . workFactory = workFactory
7372
7473 Observable . combineLatest ( self . _enabledIf, self . executing) { ( enabled, executing) -> Bool in
7574 return enabled && !executing
7675 } . bindTo ( _enabled) . addDisposableTo ( disposeBag)
7776
78- self . inputs
79- . subscribeNext { [ weak self] input in
80- self ? . _execute ( input)
81- }
82- . addDisposableTo ( disposeBag)
77+ self . inputs. subscribe ( onNext: { [ weak self] ( input) in
78+ self ? . _execute ( input)
79+ } ) . addDisposableTo ( disposeBag)
8380 }
8481}
8582
86- // MARK: Convenience initializers.
87- public extension Action {
88-
89- /// Always enabled.
90- public convenience init ( workFactory: WorkFactory ) {
91- self . init ( enabledIf: . just( true ) , workFactory: workFactory)
92- }
93- }
9483
9584// MARK: Execution!
9685public extension Action {
9786
98- public func execute( input: Input ) -> Observable < Element > {
87+ @discardableResult
88+ public func execute( _ input: Input ) -> Observable < Element > {
9989 let buffer = ReplaySubject< Element> . createUnbounded( )
10090 let error = errors
10191 . flatMap { error -> Observable < Element > in
102- if case . UnderlyingError ( let error) = error {
92+ if case . underlyingError ( let error) = error {
10393 throw error
10494 } else {
10595 return Observable . empty ( )
@@ -118,7 +108,8 @@ public extension Action {
118108 return buffer. asObservable ( )
119109 }
120110
121- private func _execute( input: Input ) -> Observable < Element > {
111+ @discardableResult
112+ fileprivate func _execute( _ input: Input ) -> Observable < Element > {
122113
123114 // Buffer from the work to a replay subject.
124115 let buffer = ReplaySubject< Element> . createUnbounded( )
@@ -134,7 +125,7 @@ public extension Action {
134125
135126 // Make sure we started executing and we're accidentally disabled.
136127 guard startedExecuting else {
137- let error = ActionError . NotEnabled
128+ let error = ActionError . notEnabled
138129 self . _errors. onNext ( error)
139130 buffer. onError ( error)
140131
@@ -153,7 +144,7 @@ public extension Action {
153144 self ? . _elements. onNext ( element)
154145 } ,
155146 onError: { [ weak self] error in
156- self ? . _errors. onNext ( ActionError . UnderlyingError ( error) )
147+ self ? . _errors. onNext ( ActionError . underlyingError ( error) )
157148 } ,
158149 onCompleted: { [ weak self] in
159150 self ? . _completed. onNext ( )
@@ -169,12 +160,12 @@ public extension Action {
169160}
170161
171162private extension Action {
172- private func doLocked( closure: ( ) -> Void ) {
173- dispatch_sync ( executingQueue, closure)
163+ func doLocked( _ closure: ( ) -> Void ) {
164+ executingQueue. sync ( execute : closure)
174165 }
175166}
176167
177- internal extension BehaviorSubject where Element: BooleanLiteralConvertible {
168+ internal extension BehaviorSubject where Element: ExpressibleByBooleanLiteral {
178169 var valueOrFalse : Element {
179170 guard let value = try ? value ( ) else { return false }
180171
0 commit comments