@@ -10,7 +10,7 @@ extension Disposable {
1010 /// Adds `self` to `bag`
1111 ///
1212 /// - parameter bag: `DisposeBag` to add `self` to.
13- public func disposed( by bag: DisposeBag ) {
13+ public func disposed( by bag: inout DisposeBag ) {
1414 bag. insert ( self )
1515 }
1616}
@@ -27,27 +27,39 @@ or create a new one in its place.
2727
2828In case explicit disposal is necessary, there is also `CompositeDisposable`.
2929*/
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-
30+ public struct DisposeBag : ~ Copyable {
31+ private let implementation : _DisposeBag
32+
3833 /// Constructs new empty dispose bag.
39- public override init ( ) {
40- super . init ( )
34+ public init ( ) {
35+ self . implementation = _DisposeBag ( )
4136 }
4237
4338 /// Adds `disposable` to be disposed when dispose bag is being deinited.
4439 ///
4540 /// - parameter disposable: Disposable to add.
41+ public /*mutating*/ func insert( _ disposable: Disposable ) {
42+ implementation. _insert ( disposable) ? . dispose ( )
43+ }
44+ }
45+
46+ private final class _DisposeBag : DisposeBase {
47+
48+ fileprivate var lock = SpinLock ( )
49+
50+ // state
51+ fileprivate var disposables = [ Disposable] ( )
52+ fileprivate private( set) var isDisposed = false
53+
54+ public override init ( ) {
55+ super. init ( )
56+ }
57+
4658 public func insert( _ disposable: Disposable ) {
4759 self . _insert ( disposable) ? . dispose ( )
4860 }
4961
50- private func _insert( _ disposable: Disposable ) -> Disposable ? {
62+ fileprivate func _insert( _ disposable: Disposable ) -> Disposable ? {
5163 self . lock. performLocked {
5264 if self . isDisposed {
5365 return disposable
@@ -86,21 +98,21 @@ public final class DisposeBag: DisposeBase {
8698
8799extension DisposeBag {
88100 /// Convenience init allows a list of disposables to be gathered for disposal.
89- public convenience init ( disposing disposables: Disposable ... ) {
90- self . init ( )
91- self . disposables += disposables
101+ public init ( disposing disposables: Disposable ... ) {
102+ self = DisposeBag ( )
103+ self . implementation . disposables += disposables
92104 }
93105
94106 /// Convenience init which utilizes a function builder to let you pass in a list of
95107 /// disposables to make a DisposeBag of.
96- public convenience init ( @DisposableBuilder builder: ( ) -> [ Disposable ] ) {
108+ public init ( @DisposableBuilder builder: ( ) -> [ Disposable ] ) {
97109 self . init ( disposing: builder ( ) )
98110 }
99111
100112 /// Convenience init allows an array of disposables to be gathered for disposal.
101- public convenience init ( disposing disposables: [ Disposable ] ) {
113+ public init ( disposing disposables: [ Disposable ] ) {
102114 self . init ( )
103- self . disposables += disposables
115+ self . implementation . disposables += disposables
104116 }
105117
106118 /// Convenience function allows a list of disposables to be gathered for disposal.
@@ -115,11 +127,11 @@ extension DisposeBag {
115127
116128 /// Convenience function allows an array of disposables to be gathered for disposal.
117129 public func insert( _ disposables: [ Disposable ] ) {
118- self . lock. performLocked {
119- if self . isDisposed {
130+ self . implementation . lock. performLocked {
131+ if self . implementation . isDisposed {
120132 disposables. forEach { $0. dispose ( ) }
121133 } else {
122- self . disposables += disposables
134+ self . implementation . disposables += disposables
123135 }
124136 }
125137 }
0 commit comments