@@ -40,68 +40,60 @@ extension UnsafeAtomicState where State == DisposableState {
4040
4141/// A type-erased disposable that forwards operations to an underlying disposable.
4242public final class AnyDisposable : Disposable {
43- private let disposable : Disposable
43+ private final class ActionDisposable : Disposable {
44+ let state : UnsafeAtomicState < DisposableState >
45+ var action : ( ( ) -> Void ) ?
4446
45- public var isDisposed : Bool {
46- return disposable. isDisposed
47- }
48-
49- public init ( _ disposable: Disposable ) {
50- self . disposable = disposable
51- }
47+ var isDisposed : Bool {
48+ return state. is ( . disposed)
49+ }
5250
53- public func dispose ( ) {
54- disposable . dispose ( )
55- }
56- }
51+ init ( _ action : ( ( ) -> Void ) ? ) {
52+ self . state = UnsafeAtomicState ( . active )
53+ self . action = action
54+ }
5755
58- /// A disposable that only flips `isDisposed` upon disposal, and performs no other
59- /// work.
60- public final class SimpleDisposable : Disposable {
61- private var state = UnsafeAtomicState ( DisposableState . active)
56+ deinit {
57+ state. deinitialize ( )
58+ }
6259
63- public var isDisposed : Bool {
64- return state. is ( . disposed)
60+ func dispose( ) {
61+ if state. tryDispose ( ) {
62+ action ? ( )
63+ action = nil
64+ }
65+ }
6566 }
6667
67- public init ( ) { }
68+ private let base : Disposable
6869
69- public func dispose ( ) {
70- _ = state . tryDispose ( )
70+ public var isDisposed : Bool {
71+ return base . isDisposed
7172 }
7273
73- deinit {
74- state. deinitialize ( )
74+ /// Create a disposable which runs the given action upon disposal.
75+ ///
76+ /// - parameters:
77+ /// - action: A closure to run when calling `dispose()`.
78+ public init ( _ action: @escaping ( ) -> Void ) {
79+ base = ActionDisposable ( action)
7580 }
76- }
7781
78- /// A disposable that will run an action upon disposal.
79- public final class ActionDisposable : Disposable {
80- private var action : ( ( ) -> Void ) ?
81- private var state : UnsafeAtomicState < DisposableState >
82-
83- public var isDisposed : Bool {
84- return state. is ( . disposed)
82+ /// Create a disposable.
83+ public init ( ) {
84+ base = ActionDisposable ( nil )
8585 }
8686
87- /// Initialize the disposable to run the given action upon disposal .
87+ /// Create a disposable which wraps the given disposable .
8888 ///
8989 /// - parameters:
90- /// - action: A closure to run when calling `dispose()`.
91- public init ( action: @escaping ( ) -> Void ) {
92- self . action = action
93- self . state = UnsafeAtomicState ( DisposableState . active)
90+ /// - disposable: The disposable to be wrapped.
91+ public init ( _ disposable: Disposable ) {
92+ base = disposable
9493 }
9594
9695 public func dispose( ) {
97- if state. tryDispose ( ) {
98- action ? ( )
99- action = nil
100- }
101- }
102-
103- deinit {
104- state. deinitialize ( )
96+ base. dispose ( )
10597 }
10698}
10799
@@ -179,7 +171,7 @@ public final class CompositeDisposable: Disposable {
179171 guard disposables != nil else { return nil }
180172
181173 let token = disposables!. insert ( d)
182- return ActionDisposable { [ weak self] in
174+ return AnyDisposable { [ weak self] in
183175 self ? . disposables. modify {
184176 $0? . remove ( using: token)
185177 }
@@ -197,12 +189,51 @@ public final class CompositeDisposable: Disposable {
197189 /// `disposable` is `nil`.
198190 @discardableResult
199191 public func add( _ action: @escaping ( ) -> Void ) -> Disposable ? {
200- return add ( ActionDisposable ( action : action) )
192+ return add ( AnyDisposable ( action) )
201193 }
202194
203195 deinit {
204196 state. deinitialize ( )
205197 }
198+
199+ /// Adds the right-hand-side disposable to the left-hand-side
200+ /// `CompositeDisposable`.
201+ ///
202+ /// ````
203+ /// disposable += producer
204+ /// .filter { ... }
205+ /// .map { ... }
206+ /// .start(observer)
207+ /// ````
208+ ///
209+ /// - parameters:
210+ /// - lhs: Disposable to add to.
211+ /// - rhs: Disposable to add.
212+ ///
213+ /// - returns: An instance of `DisposableHandle` that can be used to opaquely
214+ /// remove the disposable later (if desired).
215+ @discardableResult
216+ public static func += ( lhs: CompositeDisposable , rhs: Disposable ? ) -> Disposable ? {
217+ return lhs. add ( rhs)
218+ }
219+
220+ /// Adds the right-hand-side `ActionDisposable` to the left-hand-side
221+ /// `CompositeDisposable`.
222+ ///
223+ /// ````
224+ /// disposable += { ... }
225+ /// ````
226+ ///
227+ /// - parameters:
228+ /// - lhs: Disposable to add to.
229+ /// - rhs: Closure to add as a disposable.
230+ ///
231+ /// - returns: An instance of `DisposableHandle` that can be used to opaquely
232+ /// remove the disposable later (if desired).
233+ @discardableResult
234+ public static func += ( lhs: CompositeDisposable , rhs: @escaping ( ) -> ( ) ) -> Disposable ? {
235+ return lhs. add ( rhs)
236+ }
206237}
207238
208239/// A disposable that, upon deinitialization, will automatically dispose of
@@ -246,6 +277,44 @@ extension ScopedDisposable where Inner == AnyDisposable {
246277 }
247278}
248279
280+ extension ScopedDisposable where Inner == CompositeDisposable {
281+ /// Adds the right-hand-side disposable to the left-hand-side
282+ /// `ScopedDisposable<CompositeDisposable>`.
283+ ///
284+ /// ````
285+ /// disposable += { ... }
286+ /// ````
287+ ///
288+ /// - parameters:
289+ /// - lhs: Disposable to add to.
290+ /// - rhs: Disposable to add.
291+ ///
292+ /// - returns: An instance of `DisposableHandle` that can be used to opaquely
293+ /// remove the disposable later (if desired).
294+ @discardableResult
295+ public static func += ( lhs: ScopedDisposable < CompositeDisposable > , rhs: Disposable ? ) -> Disposable ? {
296+ return lhs. inner. add ( rhs)
297+ }
298+
299+ /// Adds the right-hand-side disposable to the left-hand-side
300+ /// `ScopedDisposable<CompositeDisposable>`.
301+ ///
302+ /// ````
303+ /// disposable += { ... }
304+ /// ````
305+ ///
306+ /// - parameters:
307+ /// - lhs: Disposable to add to.
308+ /// - rhs: Closure to add as a disposable.
309+ ///
310+ /// - returns: An instance of `DisposableHandle` that can be used to opaquely
311+ /// remove the disposable later (if desired).
312+ @discardableResult
313+ public static func += ( lhs: ScopedDisposable < CompositeDisposable > , rhs: @escaping ( ) -> ( ) ) -> Disposable ? {
314+ return lhs. inner. add ( rhs)
315+ }
316+ }
317+
249318/// A disposable that disposes of its wrapped disposable, and allows its
250319/// wrapped disposable to be replaced.
251320public final class SerialDisposable : Disposable {
@@ -293,78 +362,3 @@ public final class SerialDisposable: Disposable {
293362 state. deinitialize ( )
294363 }
295364}
296-
297- /// Adds the right-hand-side disposable to the left-hand-side
298- /// `CompositeDisposable`.
299- ///
300- /// ````
301- /// disposable += producer
302- /// .filter { ... }
303- /// .map { ... }
304- /// .start(observer)
305- /// ````
306- ///
307- /// - parameters:
308- /// - lhs: Disposable to add to.
309- /// - rhs: Disposable to add.
310- ///
311- /// - returns: An instance of `DisposableHandle` that can be used to opaquely
312- /// remove the disposable later (if desired).
313- @discardableResult
314- public func += ( lhs: CompositeDisposable , rhs: Disposable ? ) -> Disposable ? {
315- return lhs. add ( rhs)
316- }
317-
318- /// Adds the right-hand-side `ActionDisposable` to the left-hand-side
319- /// `CompositeDisposable`.
320- ///
321- /// ````
322- /// disposable += { ... }
323- /// ````
324- ///
325- /// - parameters:
326- /// - lhs: Disposable to add to.
327- /// - rhs: Closure to add as a disposable.
328- ///
329- /// - returns: An instance of `DisposableHandle` that can be used to opaquely
330- /// remove the disposable later (if desired).
331- @discardableResult
332- public func += ( lhs: CompositeDisposable , rhs: @escaping ( ) -> ( ) ) -> Disposable ? {
333- return lhs. add ( rhs)
334- }
335-
336- /// Adds the right-hand-side disposable to the left-hand-side
337- /// `ScopedDisposable<CompositeDisposable>`.
338- ///
339- /// ````
340- /// disposable += { ... }
341- /// ````
342- ///
343- /// - parameters:
344- /// - lhs: Disposable to add to.
345- /// - rhs: Disposable to add.
346- ///
347- /// - returns: An instance of `DisposableHandle` that can be used to opaquely
348- /// remove the disposable later (if desired).
349- @discardableResult
350- public func += ( lhs: ScopedDisposable < CompositeDisposable > , rhs: Disposable ? ) -> Disposable ? {
351- return lhs. inner. add ( rhs)
352- }
353-
354- /// Adds the right-hand-side disposable to the left-hand-side
355- /// `ScopedDisposable<CompositeDisposable>`.
356- ///
357- /// ````
358- /// disposable += { ... }
359- /// ````
360- ///
361- /// - parameters:
362- /// - lhs: Disposable to add to.
363- /// - rhs: Closure to add as a disposable.
364- ///
365- /// - returns: An instance of `DisposableHandle` that can be used to opaquely
366- /// remove the disposable later (if desired).
367- @discardableResult
368- public func += ( lhs: ScopedDisposable < CompositeDisposable > , rhs: @escaping ( ) -> ( ) ) -> Disposable ? {
369- return lhs. inner. add ( rhs)
370- }
0 commit comments