Skip to content

Commit 557dbfe

Browse files
authored
Merge pull request #412 from ReactiveCocoa/use-anydisposable
s/(ActionDisposable|SimpleDisposable)/AnyDisposable/g
2 parents 579155f + 93d4fa9 commit 557dbfe

File tree

11 files changed

+168
-160
lines changed

11 files changed

+168
-160
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# master
22
*Please add new entries at the top.*
3+
4+
1. `ActionDisposable` and `SimpleDisposable` have been folded into `AnyDisposable`. (#412, kudos to @andersio)
5+
36
1. `promoteErrors(_:)` has been renamed to `promoteError(_:)`. (#408, kudos to @andersio)
47

58
# 1.1.3

Sources/Deprecations+Removals.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ import Dispatch
33
import Result
44

55
// MARK: Unavailable methods in ReactiveSwift 2.0.
6+
extension AnyDisposable {
7+
@available(*, unavailable, renamed:"init(_:)")
8+
public convenience init(action: @escaping () -> Void) { fatalError() }
9+
}
10+
611
extension Signal {
712
@available(*, unavailable, renamed:"promoteError")
813
public func promoteErrors<F: Swift.Error>(_: F.Type) -> Signal<Value, F> { fatalError() }
@@ -142,6 +147,12 @@ public func timer(interval: DispatchTimeInterval, on scheduler: DateScheduler) -
142147
public func timer(interval: DispatchTimeInterval, on scheduler: DateScheduler, leeway: DispatchTimeInterval) -> SignalProducer<Date, NoError> { fatalError() }
143148

144149
// MARK: Obsolete types in ReactiveSwift 2.0.
150+
@available(*, unavailable, renamed:"AnyDisposable")
151+
public typealias SimpleDisposable = AnyDisposable
152+
153+
@available(*, unavailable, renamed:"AnyDisposable")
154+
public typealias ActionDisposable = AnyDisposable
155+
145156
@available(*, unavailable, renamed:"Signal.Event")
146157
public typealias Event<Value, Error: Swift.Error> = Signal<Value, Error>.Event
147158

Sources/Disposable.swift

Lines changed: 115 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -40,68 +40,60 @@ extension UnsafeAtomicState where State == DisposableState {
4040

4141
/// A type-erased disposable that forwards operations to an underlying disposable.
4242
public 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.
251320
public 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-
}

Sources/Flatten.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ extension Signal where Value: SignalProducerProtocol, Error == Value.Error {
444444
func startNextIfNeeded() {
445445
while let producer = state.modify({ $0.dequeue() }) {
446446
let producerState = UnsafeAtomicState<ProducerState>(.starting)
447-
let deinitializer = ScopedDisposable(ActionDisposable(action: producerState.deinitialize))
447+
let deinitializer = ScopedDisposable(AnyDisposable(producerState.deinitialize))
448448

449449
producer.startWithSignal { signal, inner in
450450
let handle = disposable.add(inner)

Sources/FoundationExtensions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ extension Reactive where Base: NotificationCenter {
3535
observer.send(value: notification)
3636
}
3737

38-
return ActionDisposable {
38+
return AnyDisposable {
3939
base.removeObserver(notificationObserver)
4040
}
4141
}

Sources/Scheduler.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public final class UIScheduler: Scheduler {
136136
/// begins.
137137
@discardableResult
138138
public func schedule(_ action: @escaping () -> Void) -> Disposable? {
139-
let disposable = SimpleDisposable()
139+
let disposable = AnyDisposable()
140140
let actionAndDecrement = {
141141
if !disposable.isDisposed {
142142
action()
@@ -233,7 +233,7 @@ public final class QueueScheduler: DateScheduler {
233233
/// begins.
234234
@discardableResult
235235
public func schedule(_ action: @escaping () -> Void) -> Disposable? {
236-
let d = SimpleDisposable()
236+
let d = AnyDisposable()
237237

238238
queue.async {
239239
if !d.isDisposed {
@@ -263,7 +263,7 @@ public final class QueueScheduler: DateScheduler {
263263
/// before it begins.
264264
@discardableResult
265265
public func schedule(after date: Date, action: @escaping () -> Void) -> Disposable? {
266-
let d = SimpleDisposable()
266+
let d = AnyDisposable()
267267

268268
queue.asyncAfter(wallDeadline: wallTime(with: date)) {
269269
if !d.isDisposed {
@@ -325,7 +325,7 @@ public final class QueueScheduler: DateScheduler {
325325
timer.setEventHandler(handler: action)
326326
timer.resume()
327327

328-
return ActionDisposable {
328+
return AnyDisposable {
329329
timer.cancel()
330330
}
331331
}
@@ -378,7 +378,7 @@ public final class TestScheduler: DateScheduler {
378378
scheduledActions.sort { $0.less($1) }
379379
lock.unlock()
380380

381-
return ActionDisposable {
381+
return AnyDisposable {
382382
self.lock.lock()
383383
self.scheduledActions = self.scheduledActions.filter { $0 !== action }
384384
self.lock.unlock()

0 commit comments

Comments
 (0)