diff --git a/Sources/Then/Then.swift b/Sources/Then/Then.swift index 0aeda76..e0e6b07 100644 --- a/Sources/Then/Then.swift +++ b/Sources/Then/Then.swift @@ -57,6 +57,15 @@ extension Then where Self: Any { try block(self) } +#if swift(>=5.5) && canImport(_Concurrency) + /// Async-friendly version of `.do` that accepts an async-throws closure. + @available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *) + @inlinable + public func `do`(_ block: (Self) async throws -> Void) async rethrows { + try await block(self) + } +#endif + } extension Then where Self: AnyObject { diff --git a/Tests/ThenTests/ThenTests.swift b/Tests/ThenTests/ThenTests.swift index 4cecef1..647d89b 100644 --- a/Tests/ThenTests/ThenTests.swift +++ b/Tests/ThenTests/ThenTests.swift @@ -15,6 +15,14 @@ struct User { } extension User: Then {} +class Timer { + func run() async -> Bool { + try? await Task.sleep(nanoseconds: 1_000_000_000) + return true + } +} +extension Timer: Then {} + class ThenTests: XCTestCase { func testThen_NSObject() { @@ -63,6 +71,14 @@ class ThenTests: XCTestCase { XCTAssertEqual(UserDefaults.standard.string(forKey: "username"), "devxoul") } + func testAsyncDo() async { + let t = Timer() + await t.do { + let obj = await $0.run() + XCTAssertTrue(obj) + } + } + func testRethrows() { XCTAssertThrowsError( try NSObject().do { _ in @@ -70,5 +86,4 @@ class ThenTests: XCTestCase { } ) } - }