Add DisposeBag function builder + tests

This commit is contained in:
freak4pc 2019-10-03 19:55:19 +03:00
parent 9b31a15520
commit 7cf93738a7
No known key found for this signature in database
GPG Key ID: 77ECA9272A4FEA1A
3 changed files with 40 additions and 2 deletions

View File

@ -84,13 +84,18 @@ public final class DisposeBag: DisposeBase {
}
extension DisposeBag {
/// Convenience init allows a list of disposables to be gathered for disposal.
public convenience init(disposing disposables: Disposable...) {
self.init()
self._disposables += disposables
}
/// Convenience init which utilizes a function builder to let you pass in a list of
/// disposables to make a DisposeBag of.
public convenience init(@DisposableBuilder builder: () -> [Disposable]) {
self.init(disposing: builder())
}
/// Convenience init allows an array of disposables to be gathered for disposal.
public convenience init(disposing disposables: [Disposable]) {
self.init()
@ -111,4 +116,12 @@ extension DisposeBag {
self._disposables += disposables
}
}
/// A function builder accepting a list of Disposables and returning them as an array.
@_functionBuilder
public struct DisposableBuilder {
public static func buildBlock(_ disposables: Disposable...) -> [Disposable] {
return disposables
}
}
}

View File

@ -218,6 +218,7 @@ final class DisposeBagTest_ : DisposeBagTest, RxTestCase {
("testDisposeBagInsert", DisposeBagTest.testDisposeBagInsert),
("testDisposeBagVaradicInsert", DisposeBagTest.testDisposeBagVaradicInsert),
("testDisposeBagVaradicInsertArray", DisposeBagTest.testDisposeBagVaradicInsertArray),
("testDisposableBuilder", DisposeBagTest.testDisposableBuilder),
] }
}

View File

@ -43,7 +43,6 @@ extension DisposeBagTest {
// DisposeBag bag test
extension DisposeBagTest {
func testDisposeBagVaradicInsert() {
let disposable1 = TestDisposable()
let disposable2 = TestDisposable()
@ -73,7 +72,32 @@ extension DisposeBagTest {
XCTAssert(disposable1.count == 1)
XCTAssert(disposable2.count == 1)
}
}
// DisposeBag function builder initializer tests
extension DisposeBagTest {
func testDisposableBuilder() {
let disposable1 = TestDisposable()
let disposable2 = TestDisposable()
let disposable3 = TestDisposable()
var disposeBag = DisposeBag {
disposable1
disposable2
disposable3
}
XCTAssert(disposable1.count == 0)
XCTAssert(disposable2.count == 0)
XCTAssert(disposable3.count == 0)
disposeBag = DisposeBag()
XCTAssert(disposable1.count == 1)
XCTAssert(disposable2.count == 1)
XCTAssert(disposable3.count == 1)
// Avoids "Variable 'disposeBag' was written to, but never read"
_ = disposeBag
}
}
private class TestDisposable: Disposable {