From aae72e23ade45fdaae9bb94828697c07339e3bb9 Mon Sep 17 00:00:00 2001 From: Marco Cancellieri Date: Fri, 12 Nov 2021 07:26:02 +0100 Subject: [PATCH 01/12] Add asyncStream and asyncThrowingStream --- .github/workflows/test.yml | 2 +- Sources/Signal+SwiftConcurrency.swift | 52 +++++++ Sources/SignalProducer+SwiftConcurrency.swift | 52 +++++++ .../SwiftConcurrencyTests.swift | 130 ++++++++++++++++++ 4 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 Sources/Signal+SwiftConcurrency.swift create mode 100644 Sources/SignalProducer+SwiftConcurrency.swift create mode 100644 Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 260c623dd..d7f216060 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,7 +3,7 @@ name: Test jobs: test: name: Test - runs-on: macos-latest + runs-on: macos-11 strategy: fail-fast: false matrix: diff --git a/Sources/Signal+SwiftConcurrency.swift b/Sources/Signal+SwiftConcurrency.swift new file mode 100644 index 000000000..0f9eb9cac --- /dev/null +++ b/Sources/Signal+SwiftConcurrency.swift @@ -0,0 +1,52 @@ +// +// Signal+SwiftConcurrency.swift +// ReactiveSwift +// +// Created by Marco Cancellieri on 2021-11-11. +// Copyright (c) 2021 GitHub. All rights reserved. +// +#if compiler(>=5.5) && canImport(_Concurrency) +import Foundation + +@available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) +extension Signal { + public var asyncThrowingStream: AsyncThrowingStream { + AsyncThrowingStream { continuation in + let disposable = observe { event in + switch event { + case .value(let value): + continuation.yield(value) + case .completed, .interrupted: + continuation.finish() + case .failed(let error): + continuation.finish(throwing: error) + } + } + continuation.onTermination = { @Sendable termination in + disposable?.dispose() + } + } + } +} + +extension Signal where Error == Never { + @available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) + public var asyncStream: AsyncStream { + AsyncStream { continuation in + let disposable = observe { event in + switch event { + case .value(let value): + continuation.yield(value) + case .completed, .interrupted: + continuation.finish() + case .failed: + fatalError("Never is impossible to construct") + } + } + continuation.onTermination = { @Sendable termination in + disposable?.dispose() + } + } + } +} +#endif diff --git a/Sources/SignalProducer+SwiftConcurrency.swift b/Sources/SignalProducer+SwiftConcurrency.swift new file mode 100644 index 000000000..236a6f9a3 --- /dev/null +++ b/Sources/SignalProducer+SwiftConcurrency.swift @@ -0,0 +1,52 @@ +// +// SignalProducer+SwiftConcurrency.swift +// ReactiveSwift +// +// Created by Marco Cancellieri on 2021-11-11. +// Copyright (c) 2021 GitHub. All rights reserved. +// +#if compiler(>=5.5) && canImport(_Concurrency) +import Foundation + +@available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) +extension SignalProducer { + public var asyncThrowingStream: AsyncThrowingStream { + AsyncThrowingStream { continuation in + let disposable = start { event in + switch event { + case .value(let value): + continuation.yield(value) + case .completed, .interrupted: + continuation.finish() + case .failed(let error): + continuation.finish(throwing: error) + } + } + continuation.onTermination = { @Sendable _ in + disposable.dispose() + } + } + } +} + +@available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) +extension SignalProducer where Error == Never { + public var asyncStream: AsyncStream { + AsyncStream { continuation in + let disposable = start { event in + switch event { + case .value(let value): + continuation.yield(value) + case .completed, .interrupted: + continuation.finish() + case .failed: + fatalError("Never is impossible to construct") + } + } + continuation.onTermination = { @Sendable _ in + disposable.dispose() + } + } + } +} +#endif diff --git a/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift b/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift new file mode 100644 index 000000000..92237c565 --- /dev/null +++ b/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift @@ -0,0 +1,130 @@ +// +// SwiftConcurrencyTests.swift +// ReactiveSwift +// +// Created by Marco Cancellieri on 2021-11-11. +// Copyright (c) 2021 GitHub. All rights reserved. +// + +#if compiler(>=5.5) && canImport(_Concurrency) +import Foundation +import ReactiveSwift +import XCTest + +@available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) +class SwiftConcurrencyTests: XCTestCase { + func testValuesAsyncSignalProducer() async { + let values = [1,2,3] + var counter = 0 + let asyncStream = SignalProducer(values).asyncStream + for await _ in asyncStream { + counter += 1 + } + XCTAssertEqual(counter, 3) + } + + func testValuesAsyncThrowingSignalProducer() async throws { + let values = [1,2,3] + var counter = 0 + let asyncStream = SignalProducer(values).asyncThrowingStream + for try await _ in asyncStream { + counter += 1 + } + XCTAssertEqual(counter, 3) + } + + func testCompleteAsyncSignalProducer() async { + let asyncStream = SignalProducer.empty.asyncStream + let first = await asyncStream.first(where: { _ in true }) + XCTAssertEqual(first, nil) + } + + func testCompleteAsyncThrowingSignalProducer() async throws { + let asyncStream = SignalProducer.empty.asyncThrowingStream + let first = try await asyncStream.first(where: { _ in true }) + XCTAssertEqual(first, nil) + } + + func testErrorSignalProducer() async { + let error = NSError(domain: "domain", code: 0, userInfo: nil) + let asyncStream = SignalProducer(error: error).asyncThrowingStream + await XCTAssertThrowsError(try await asyncStream.first(where: { _ in true })) + } + + func testValuesAsyncSignal() async { + let signal = Signal { observer, _ in + Task { + for number in [1, 2, 3] { + observer.send(value: number) + } + observer.sendCompleted() + } + } + var counter = 0 + let asyncStream = signal.asyncStream + for await _ in asyncStream { + counter += 1 + } + XCTAssertEqual(counter, 3) + } + + func testValuesAsyncThrowingSignal() async throws { + let signal = Signal { observer, _ in + Task { + for number in [1, 2, 3] { + observer.send(value: number) + } + observer.sendCompleted() + } + } + var counter = 0 + let asyncStream = signal.asyncThrowingStream + for try await _ in asyncStream { + counter += 1 + } + XCTAssertEqual(counter, 3) + } + + func testCompleteAsyncSignal() async { + let asyncStream = Signal.empty.asyncStream + let first = await asyncStream.first(where: { _ in true }) + XCTAssertEqual(first, nil) + } + + func testCompleteAsyncThrowingSignal() async throws { + let asyncStream = Signal.empty.asyncThrowingStream + let first = try await asyncStream.first(where: { _ in true }) + XCTAssertEqual(first, nil) + } + + func testErrorSignal() async { + let error = NSError(domain: "domain", code: 0, userInfo: nil) + let signal = Signal { observer, _ in + Task { + observer.send(error: error) + } + } + let asyncStream = signal.asyncThrowingStream + await XCTAssertThrowsError(try await asyncStream.first(where: { _ in true })) + } +} +// Extension to allow Throw assertion for async expressions +@available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) +fileprivate extension XCTest { + func XCTAssertThrowsError( + _ expression: @autoclosure () async throws -> T, + _ message: @autoclosure () -> String = "", + file: StaticString = #filePath, + line: UInt = #line, + _ errorHandler: (_ error: Error) -> Void = { _ in } + ) async { + do { + _ = try await expression() + XCTFail(message(), file: file, line: line) + } catch { + errorHandler(error) + } + } +} + +#endif From afffc205470a0652a17bc923a129d8b9d6f311c1 Mon Sep 17 00:00:00 2001 From: Marco Cancellieri Date: Fri, 12 Nov 2021 07:42:12 +0100 Subject: [PATCH 02/12] Add to project file --- ReactiveSwift.xcodeproj/project.pbxproj | 123 +++++++++--------------- 1 file changed, 48 insertions(+), 75 deletions(-) diff --git a/ReactiveSwift.xcodeproj/project.pbxproj b/ReactiveSwift.xcodeproj/project.pbxproj index 50abd6cd8..53715a9f3 100644 --- a/ReactiveSwift.xcodeproj/project.pbxproj +++ b/ReactiveSwift.xcodeproj/project.pbxproj @@ -73,66 +73,6 @@ 9A1D067D1D948A2300ACF44C /* UnidirectionalBindingSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1D067C1D948A2200ACF44C /* UnidirectionalBindingSpec.swift */; }; 9A1D067E1D948A2300ACF44C /* UnidirectionalBindingSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1D067C1D948A2200ACF44C /* UnidirectionalBindingSpec.swift */; }; 9A1D067F1D948A2300ACF44C /* UnidirectionalBindingSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1D067C1D948A2200ACF44C /* UnidirectionalBindingSpec.swift */; }; - 9A2D5D1C259F9228005682ED /* UnaryAsyncOperator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D1B259F9228005682ED /* UnaryAsyncOperator.swift */; }; - 9A2D5D1D259F9228005682ED /* UnaryAsyncOperator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D1B259F9228005682ED /* UnaryAsyncOperator.swift */; }; - 9A2D5D1E259F9228005682ED /* UnaryAsyncOperator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D1B259F9228005682ED /* UnaryAsyncOperator.swift */; }; - 9A2D5D1F259F9228005682ED /* UnaryAsyncOperator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D1B259F9228005682ED /* UnaryAsyncOperator.swift */; }; - 9A2D5D26259F9373005682ED /* ObserveOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D25259F9373005682ED /* ObserveOn.swift */; }; - 9A2D5D27259F9373005682ED /* ObserveOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D25259F9373005682ED /* ObserveOn.swift */; }; - 9A2D5D28259F9373005682ED /* ObserveOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D25259F9373005682ED /* ObserveOn.swift */; }; - 9A2D5D29259F9373005682ED /* ObserveOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D25259F9373005682ED /* ObserveOn.swift */; }; - 9A2D5D30259F942B005682ED /* LazyMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D2F259F942B005682ED /* LazyMap.swift */; }; - 9A2D5D31259F942B005682ED /* LazyMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D2F259F942B005682ED /* LazyMap.swift */; }; - 9A2D5D32259F942B005682ED /* LazyMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D2F259F942B005682ED /* LazyMap.swift */; }; - 9A2D5D33259F942B005682ED /* LazyMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D2F259F942B005682ED /* LazyMap.swift */; }; - 9A2D5D3A259F985B005682ED /* Delay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D39259F985B005682ED /* Delay.swift */; }; - 9A2D5D3B259F985B005682ED /* Delay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D39259F985B005682ED /* Delay.swift */; }; - 9A2D5D3C259F985B005682ED /* Delay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D39259F985B005682ED /* Delay.swift */; }; - 9A2D5D3D259F985B005682ED /* Delay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D39259F985B005682ED /* Delay.swift */; }; - 9A2D5CDB259F8398005682ED /* Collect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CDA259F8398005682ED /* Collect.swift */; }; - 9A2D5CDC259F8398005682ED /* Collect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CDA259F8398005682ED /* Collect.swift */; }; - 9A2D5CDD259F8398005682ED /* Collect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CDA259F8398005682ED /* Collect.swift */; }; - 9A2D5CDE259F8398005682ED /* Collect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CDA259F8398005682ED /* Collect.swift */; }; - 9A2D5CE5259F852B005682ED /* CombinePrevious.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CE4259F852B005682ED /* CombinePrevious.swift */; }; - 9A2D5CE6259F852B005682ED /* CombinePrevious.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CE4259F852B005682ED /* CombinePrevious.swift */; }; - 9A2D5CE7259F852B005682ED /* CombinePrevious.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CE4259F852B005682ED /* CombinePrevious.swift */; }; - 9A2D5CE8259F852B005682ED /* CombinePrevious.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CE4259F852B005682ED /* CombinePrevious.swift */; }; - 9A2D5CEF259F85AE005682ED /* SkipRepeats.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CEE259F85AE005682ED /* SkipRepeats.swift */; }; - 9A2D5CF0259F85AE005682ED /* SkipRepeats.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CEE259F85AE005682ED /* SkipRepeats.swift */; }; - 9A2D5CF1259F85AE005682ED /* SkipRepeats.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CEE259F85AE005682ED /* SkipRepeats.swift */; }; - 9A2D5CF2259F85AE005682ED /* SkipRepeats.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CEE259F85AE005682ED /* SkipRepeats.swift */; }; - 9A2D5CF9259F8634005682ED /* UniqueValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CF8259F8634005682ED /* UniqueValues.swift */; }; - 9A2D5CFA259F8634005682ED /* UniqueValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CF8259F8634005682ED /* UniqueValues.swift */; }; - 9A2D5CFB259F8634005682ED /* UniqueValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CF8259F8634005682ED /* UniqueValues.swift */; }; - 9A2D5CFC259F8634005682ED /* UniqueValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CF8259F8634005682ED /* UniqueValues.swift */; }; - 9A2D5D03259F8C39005682ED /* Reduce.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D02259F8C39005682ED /* Reduce.swift */; }; - 9A2D5D04259F8C39005682ED /* Reduce.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D02259F8C39005682ED /* Reduce.swift */; }; - 9A2D5D05259F8C39005682ED /* Reduce.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D02259F8C39005682ED /* Reduce.swift */; }; - 9A2D5D06259F8C39005682ED /* Reduce.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D02259F8C39005682ED /* Reduce.swift */; }; - 9A2D5D0D259F8D1F005682ED /* ScanMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D0C259F8D1F005682ED /* ScanMap.swift */; }; - 9A2D5D0E259F8D1F005682ED /* ScanMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D0C259F8D1F005682ED /* ScanMap.swift */; }; - 9A2D5D0F259F8D1F005682ED /* ScanMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D0C259F8D1F005682ED /* ScanMap.swift */; }; - 9A2D5D10259F8D1F005682ED /* ScanMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D0C259F8D1F005682ED /* ScanMap.swift */; }; - 9A2D5C9F259F8059005682ED /* TakeFirst.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C9E259F8059005682ED /* TakeFirst.swift */; }; - 9A2D5CA0259F8059005682ED /* TakeFirst.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C9E259F8059005682ED /* TakeFirst.swift */; }; - 9A2D5CA1259F8059005682ED /* TakeFirst.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C9E259F8059005682ED /* TakeFirst.swift */; }; - 9A2D5CA2259F8059005682ED /* TakeFirst.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C9E259F8059005682ED /* TakeFirst.swift */; }; - 9A2D5CAE259F8112005682ED /* TakeLast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CAD259F8112005682ED /* TakeLast.swift */; }; - 9A2D5CAF259F8112005682ED /* TakeLast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CAD259F8112005682ED /* TakeLast.swift */; }; - 9A2D5CB0259F8112005682ED /* TakeLast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CAD259F8112005682ED /* TakeLast.swift */; }; - 9A2D5CB1259F8112005682ED /* TakeLast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CAD259F8112005682ED /* TakeLast.swift */; }; - 9A2D5CB8259F8199005682ED /* TakeWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CB7259F8199005682ED /* TakeWhile.swift */; }; - 9A2D5CB9259F8199005682ED /* TakeWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CB7259F8199005682ED /* TakeWhile.swift */; }; - 9A2D5CBA259F8199005682ED /* TakeWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CB7259F8199005682ED /* TakeWhile.swift */; }; - 9A2D5CBB259F8199005682ED /* TakeWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CB7259F8199005682ED /* TakeWhile.swift */; }; - 9A2D5CC2259F81FC005682ED /* SkipFirst.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CC1259F81FC005682ED /* SkipFirst.swift */; }; - 9A2D5CC3259F81FC005682ED /* SkipFirst.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CC1259F81FC005682ED /* SkipFirst.swift */; }; - 9A2D5CC4259F81FC005682ED /* SkipFirst.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CC1259F81FC005682ED /* SkipFirst.swift */; }; - 9A2D5CC5259F81FC005682ED /* SkipFirst.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CC1259F81FC005682ED /* SkipFirst.swift */; }; - 9A2D5CCC259F8263005682ED /* SkipWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CCB259F8263005682ED /* SkipWhile.swift */; }; - 9A2D5CCD259F8263005682ED /* SkipWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CCB259F8263005682ED /* SkipWhile.swift */; }; - 9A2D5CCE259F8263005682ED /* SkipWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CCB259F8263005682ED /* SkipWhile.swift */; }; - 9A2D5CCF259F8263005682ED /* SkipWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5CCB259F8263005682ED /* SkipWhile.swift */; }; 9A2D5C4F259F7B21005682ED /* MapError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C4E259F7B21005682ED /* MapError.swift */; }; 9A2D5C50259F7B21005682ED /* MapError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C4E259F7B21005682ED /* MapError.swift */; }; 9A2D5C51259F7B21005682ED /* MapError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5C4E259F7B21005682ED /* MapError.swift */; }; @@ -201,6 +141,22 @@ 9A2D5D0E259F8D1F005682ED /* ScanMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D0C259F8D1F005682ED /* ScanMap.swift */; }; 9A2D5D0F259F8D1F005682ED /* ScanMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D0C259F8D1F005682ED /* ScanMap.swift */; }; 9A2D5D10259F8D1F005682ED /* ScanMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D0C259F8D1F005682ED /* ScanMap.swift */; }; + 9A2D5D1C259F9228005682ED /* UnaryAsyncOperator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D1B259F9228005682ED /* UnaryAsyncOperator.swift */; }; + 9A2D5D1D259F9228005682ED /* UnaryAsyncOperator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D1B259F9228005682ED /* UnaryAsyncOperator.swift */; }; + 9A2D5D1E259F9228005682ED /* UnaryAsyncOperator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D1B259F9228005682ED /* UnaryAsyncOperator.swift */; }; + 9A2D5D1F259F9228005682ED /* UnaryAsyncOperator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D1B259F9228005682ED /* UnaryAsyncOperator.swift */; }; + 9A2D5D26259F9373005682ED /* ObserveOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D25259F9373005682ED /* ObserveOn.swift */; }; + 9A2D5D27259F9373005682ED /* ObserveOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D25259F9373005682ED /* ObserveOn.swift */; }; + 9A2D5D28259F9373005682ED /* ObserveOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D25259F9373005682ED /* ObserveOn.swift */; }; + 9A2D5D29259F9373005682ED /* ObserveOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D25259F9373005682ED /* ObserveOn.swift */; }; + 9A2D5D30259F942B005682ED /* LazyMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D2F259F942B005682ED /* LazyMap.swift */; }; + 9A2D5D31259F942B005682ED /* LazyMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D2F259F942B005682ED /* LazyMap.swift */; }; + 9A2D5D32259F942B005682ED /* LazyMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D2F259F942B005682ED /* LazyMap.swift */; }; + 9A2D5D33259F942B005682ED /* LazyMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D2F259F942B005682ED /* LazyMap.swift */; }; + 9A2D5D3A259F985B005682ED /* Delay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D39259F985B005682ED /* Delay.swift */; }; + 9A2D5D3B259F985B005682ED /* Delay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D39259F985B005682ED /* Delay.swift */; }; + 9A2D5D3C259F985B005682ED /* Delay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D39259F985B005682ED /* Delay.swift */; }; + 9A2D5D3D259F985B005682ED /* Delay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D39259F985B005682ED /* Delay.swift */; }; 9A2D5D53259FA000005682ED /* Throttle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D52259FA000005682ED /* Throttle.swift */; }; 9A2D5D54259FA000005682ED /* Throttle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D52259FA000005682ED /* Throttle.swift */; }; 9A2D5D55259FA000005682ED /* Throttle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A2D5D52259FA000005682ED /* Throttle.swift */; }; @@ -259,6 +215,17 @@ A9B315C61B3940810001CB9C /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C312BC19EF2A5800984962 /* Bag.swift */; }; A9B315C81B3940810001CB9C /* FoundationExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03B4A3C19F4C39A009E02AC /* FoundationExtensions.swift */; }; A9B315CA1B3940AB0001CB9C /* ReactiveSwift.h in Headers */ = {isa = PBXBuildFile; fileRef = D04725EF19E49ED7006002AA /* ReactiveSwift.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A9F3C403273E43C5000F0E18 /* SignalProducer+SwiftConcurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9F3C401273E43C5000F0E18 /* SignalProducer+SwiftConcurrency.swift */; }; + A9F3C404273E43C5000F0E18 /* SignalProducer+SwiftConcurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9F3C401273E43C5000F0E18 /* SignalProducer+SwiftConcurrency.swift */; }; + A9F3C405273E43C5000F0E18 /* SignalProducer+SwiftConcurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9F3C401273E43C5000F0E18 /* SignalProducer+SwiftConcurrency.swift */; }; + A9F3C406273E43C5000F0E18 /* SignalProducer+SwiftConcurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9F3C401273E43C5000F0E18 /* SignalProducer+SwiftConcurrency.swift */; }; + A9F3C407273E43C5000F0E18 /* Signal+SwiftConcurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9F3C402273E43C5000F0E18 /* Signal+SwiftConcurrency.swift */; }; + A9F3C408273E43C5000F0E18 /* Signal+SwiftConcurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9F3C402273E43C5000F0E18 /* Signal+SwiftConcurrency.swift */; }; + A9F3C409273E43C5000F0E18 /* Signal+SwiftConcurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9F3C402273E43C5000F0E18 /* Signal+SwiftConcurrency.swift */; }; + A9F3C40A273E43C5000F0E18 /* Signal+SwiftConcurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9F3C402273E43C5000F0E18 /* Signal+SwiftConcurrency.swift */; }; + A9F3C40C273E43E9000F0E18 /* SwiftConcurrencyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9F3C40B273E43E9000F0E18 /* SwiftConcurrencyTests.swift */; }; + A9F3C40D273E43E9000F0E18 /* SwiftConcurrencyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9F3C40B273E43E9000F0E18 /* SwiftConcurrencyTests.swift */; }; + A9F3C40E273E43E9000F0E18 /* SwiftConcurrencyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9F3C40B273E43E9000F0E18 /* SwiftConcurrencyTests.swift */; }; A9F793341B60D0140026BCBA /* Optional.swift in Sources */ = {isa = PBXBuildFile; fileRef = D871D69E1B3B29A40070F16C /* Optional.swift */; }; B696FB811A7640C00075236D /* TestError.swift in Sources */ = {isa = PBXBuildFile; fileRef = B696FB801A7640C00075236D /* TestError.swift */; }; B696FB821A7640C00075236D /* TestError.swift in Sources */ = {isa = PBXBuildFile; fileRef = B696FB801A7640C00075236D /* TestError.swift */; }; @@ -409,21 +376,6 @@ 9A1A4F981E16961C006F3039 /* ValidatingPropertySpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidatingPropertySpec.swift; sourceTree = ""; }; 9A1B824020835EEC00EB7C09 /* ResultExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResultExtensions.swift; sourceTree = ""; }; 9A1D067C1D948A2200ACF44C /* UnidirectionalBindingSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnidirectionalBindingSpec.swift; sourceTree = ""; }; - 9A2D5D1B259F9228005682ED /* UnaryAsyncOperator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnaryAsyncOperator.swift; sourceTree = ""; }; - 9A2D5D25259F9373005682ED /* ObserveOn.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObserveOn.swift; sourceTree = ""; }; - 9A2D5D2F259F942B005682ED /* LazyMap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyMap.swift; sourceTree = ""; }; - 9A2D5D39259F985B005682ED /* Delay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Delay.swift; sourceTree = ""; }; - 9A2D5CDA259F8398005682ED /* Collect.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Collect.swift; sourceTree = ""; }; - 9A2D5CE4259F852B005682ED /* CombinePrevious.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CombinePrevious.swift; sourceTree = ""; }; - 9A2D5CEE259F85AE005682ED /* SkipRepeats.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SkipRepeats.swift; sourceTree = ""; }; - 9A2D5CF8259F8634005682ED /* UniqueValues.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UniqueValues.swift; sourceTree = ""; }; - 9A2D5D02259F8C39005682ED /* Reduce.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Reduce.swift; sourceTree = ""; }; - 9A2D5D0C259F8D1F005682ED /* ScanMap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScanMap.swift; sourceTree = ""; }; - 9A2D5C9E259F8059005682ED /* TakeFirst.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TakeFirst.swift; sourceTree = ""; }; - 9A2D5CAD259F8112005682ED /* TakeLast.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TakeLast.swift; sourceTree = ""; }; - 9A2D5CB7259F8199005682ED /* TakeWhile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TakeWhile.swift; sourceTree = ""; }; - 9A2D5CC1259F81FC005682ED /* SkipFirst.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SkipFirst.swift; sourceTree = ""; }; - 9A2D5CCB259F8263005682ED /* SkipWhile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SkipWhile.swift; sourceTree = ""; }; 9A2D5C4E259F7B21005682ED /* MapError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapError.swift; sourceTree = ""; }; 9A2D5C58259F7B31005682ED /* Materialize.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Materialize.swift; sourceTree = ""; }; 9A2D5C62259F7B47005682ED /* MaterializeAsResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MaterializeAsResult.swift; sourceTree = ""; }; @@ -441,6 +393,10 @@ 9A2D5CF8259F8634005682ED /* UniqueValues.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UniqueValues.swift; sourceTree = ""; }; 9A2D5D02259F8C39005682ED /* Reduce.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Reduce.swift; sourceTree = ""; }; 9A2D5D0C259F8D1F005682ED /* ScanMap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScanMap.swift; sourceTree = ""; }; + 9A2D5D1B259F9228005682ED /* UnaryAsyncOperator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnaryAsyncOperator.swift; sourceTree = ""; }; + 9A2D5D25259F9373005682ED /* ObserveOn.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ObserveOn.swift; sourceTree = ""; }; + 9A2D5D2F259F942B005682ED /* LazyMap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LazyMap.swift; sourceTree = ""; }; + 9A2D5D39259F985B005682ED /* Delay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Delay.swift; sourceTree = ""; }; 9A2D5D52259FA000005682ED /* Throttle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Throttle.swift; sourceTree = ""; }; 9A2D5D5C259FA0DD005682ED /* Debounce.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Debounce.swift; sourceTree = ""; }; 9A2D5D66259FA59E005682ED /* CollectEvery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollectEvery.swift; sourceTree = ""; }; @@ -458,6 +414,9 @@ A97451351B3A935E00F48E55 /* watchOS-Framework.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "watchOS-Framework.xcconfig"; sourceTree = ""; }; A97451361B3A935E00F48E55 /* watchOS-StaticLibrary.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "watchOS-StaticLibrary.xcconfig"; sourceTree = ""; }; A9B315541B3940610001CB9C /* ReactiveSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ReactiveSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A9F3C401273E43C5000F0E18 /* SignalProducer+SwiftConcurrency.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SignalProducer+SwiftConcurrency.swift"; sourceTree = ""; }; + A9F3C402273E43C5000F0E18 /* Signal+SwiftConcurrency.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Signal+SwiftConcurrency.swift"; sourceTree = ""; }; + A9F3C40B273E43E9000F0E18 /* SwiftConcurrencyTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftConcurrencyTests.swift; sourceTree = ""; }; B696FB801A7640C00075236D /* TestError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestError.swift; sourceTree = ""; }; BE9CF3941D751B6B003AE479 /* UnidirectionalBinding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnidirectionalBinding.swift; sourceTree = ""; }; BFA6B94A1A76044800C846D1 /* SignalProducerNimbleMatchers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignalProducerNimbleMatchers.swift; sourceTree = ""; }; @@ -620,6 +579,8 @@ 9A9100DE1E0E6E620093E346 /* ValidatingProperty.swift */, D08C54B11A69A2AC00AD8286 /* Signal.swift */, D08C54B21A69A2AC00AD8286 /* SignalProducer.swift */, + A9F3C402273E43C5000F0E18 /* Signal+SwiftConcurrency.swift */, + A9F3C401273E43C5000F0E18 /* SignalProducer+SwiftConcurrency.swift */, BE9CF3941D751B6B003AE479 /* UnidirectionalBinding.swift */, 9A67963A1F6056B90058C5B4 /* UninhabitedTypeGuards.swift */, ); @@ -714,6 +675,7 @@ C79B64731CD38B2B003F2376 /* TestLogger.swift */, 9A1D067C1D948A2200ACF44C /* UnidirectionalBindingSpec.swift */, 9A1A4F981E16961C006F3039 /* ValidatingPropertySpec.swift */, + A9F3C40B273E43E9000F0E18 /* SwiftConcurrencyTests.swift */, ); name = ReactiveSwiftTests; path = Tests/ReactiveSwiftTests; @@ -1071,6 +1033,7 @@ 9A2D5CE8259F852B005682ED /* CombinePrevious.swift in Sources */, 9A67963E1F6059440058C5B4 /* UninhabitedTypeGuards.swift in Sources */, 9A2D5D06259F8C39005682ED /* Reduce.swift in Sources */, + A9F3C406273E43C5000F0E18 /* SignalProducer+SwiftConcurrency.swift in Sources */, 9A2D5D56259FA000005682ED /* Throttle.swift in Sources */, 9A2D5D60259FA0DD005682ED /* Debounce.swift in Sources */, 9AFA491424E9A196003D263C /* Map.swift in Sources */, @@ -1098,6 +1061,7 @@ 4A0E11021D2A92720065D310 /* Lifetime.swift in Sources */, 9A2D5CB1259F8112005682ED /* TakeLast.swift in Sources */, BE9CF3981D751B71003AE479 /* UnidirectionalBinding.swift in Sources */, + A9F3C40A273E43C5000F0E18 /* Signal+SwiftConcurrency.swift in Sources */, 9A2D5CCF259F8263005682ED /* SkipWhile.swift in Sources */, 9A2D5C84259F7E3E005682ED /* DematerializeResults.swift in Sources */, 9A2D5C52259F7B21005682ED /* MapError.swift in Sources */, @@ -1115,6 +1079,7 @@ 7DFBED261CDB8DE300EE435B /* FoundationExtensionsSpec.swift in Sources */, 7DFBED281CDB8DE300EE435B /* PropertySpec.swift in Sources */, 7DFBED291CDB8DE300EE435B /* SchedulerSpec.swift in Sources */, + A9F3C40E273E43E9000F0E18 /* SwiftConcurrencyTests.swift in Sources */, 7DFBED2A1CDB8DE300EE435B /* SignalLifetimeSpec.swift in Sources */, 7DFBED2B1CDB8DE300EE435B /* SignalProducerSpec.swift in Sources */, 9A681AA01E5A241B00B097CF /* DeprecationSpec.swift in Sources */, @@ -1157,6 +1122,7 @@ 9A67963D1F6059430058C5B4 /* UninhabitedTypeGuards.swift in Sources */, 9A2D5D05259F8C39005682ED /* Reduce.swift in Sources */, 9AFA491324E9A196003D263C /* Map.swift in Sources */, + A9F3C405273E43C5000F0E18 /* SignalProducer+SwiftConcurrency.swift in Sources */, 9A2D5CFB259F8634005682ED /* UniqueValues.swift in Sources */, 9A2D5C65259F7B47005682ED /* MaterializeAsResult.swift in Sources */, 5792972A26DE7623007A9F64 /* TakeUntil.swift in Sources */, @@ -1184,6 +1150,7 @@ 4A0E11011D2A92720065D310 /* Lifetime.swift in Sources */, 9A2D5CB0259F8112005682ED /* TakeLast.swift in Sources */, BE9CF3971D751B71003AE479 /* UnidirectionalBinding.swift in Sources */, + A9F3C409273E43C5000F0E18 /* Signal+SwiftConcurrency.swift in Sources */, 9A2D5CCE259F8263005682ED /* SkipWhile.swift in Sources */, 9A2D5C83259F7E3E005682ED /* DematerializeResults.swift in Sources */, 9A2D5C51259F7B21005682ED /* MapError.swift in Sources */, @@ -1215,6 +1182,7 @@ 9A2D5CE5259F852B005682ED /* CombinePrevious.swift in Sources */, 9A67963B1F6056B90058C5B4 /* UninhabitedTypeGuards.swift in Sources */, 9A2D5D03259F8C39005682ED /* Reduce.swift in Sources */, + A9F3C403273E43C5000F0E18 /* SignalProducer+SwiftConcurrency.swift in Sources */, 9A2D5D53259FA000005682ED /* Throttle.swift in Sources */, 9A2D5D5D259FA0DD005682ED /* Debounce.swift in Sources */, 9AFA491124E9A196003D263C /* Map.swift in Sources */, @@ -1242,6 +1210,7 @@ D08C54B81A69A9D000AD8286 /* SignalProducer.swift in Sources */, 9A2D5CAE259F8112005682ED /* TakeLast.swift in Sources */, BE9CF3951D751B6B003AE479 /* UnidirectionalBinding.swift in Sources */, + A9F3C407273E43C5000F0E18 /* Signal+SwiftConcurrency.swift in Sources */, 9A2D5CCC259F8263005682ED /* SkipWhile.swift in Sources */, 9A2D5C81259F7E3E005682ED /* DematerializeResults.swift in Sources */, 9A2D5C4F259F7B21005682ED /* MapError.swift in Sources */, @@ -1259,6 +1228,7 @@ BFA6B94D1A7604D400C846D1 /* SignalProducerNimbleMatchers.swift in Sources */, D8170FC11B100EBC004192AD /* FoundationExtensionsSpec.swift in Sources */, C79B64741CD38B2B003F2376 /* TestLogger.swift in Sources */, + A9F3C40C273E43E9000F0E18 /* SwiftConcurrencyTests.swift in Sources */, CA6F28501C52626B001879D2 /* FlattenSpec.swift in Sources */, 4A0E11041D2A95200065D310 /* LifetimeSpec.swift in Sources */, 9A681A9E1E5A241B00B097CF /* DeprecationSpec.swift in Sources */, @@ -1301,6 +1271,7 @@ 9A67963C1F6059420058C5B4 /* UninhabitedTypeGuards.swift in Sources */, 9A2D5D04259F8C39005682ED /* Reduce.swift in Sources */, 9AFA491224E9A196003D263C /* Map.swift in Sources */, + A9F3C404273E43C5000F0E18 /* SignalProducer+SwiftConcurrency.swift in Sources */, 9A2D5CFA259F8634005682ED /* UniqueValues.swift in Sources */, 9A2D5C64259F7B47005682ED /* MaterializeAsResult.swift in Sources */, 5792972926DE7623007A9F64 /* TakeUntil.swift in Sources */, @@ -1328,6 +1299,7 @@ D0D11ABA1A6AE87700C1F8B1 /* Action.swift in Sources */, 9A2D5CAF259F8112005682ED /* TakeLast.swift in Sources */, BE9CF3961D751B70003AE479 /* UnidirectionalBinding.swift in Sources */, + A9F3C408273E43C5000F0E18 /* Signal+SwiftConcurrency.swift in Sources */, 9A2D5CCD259F8263005682ED /* SkipWhile.swift in Sources */, 9A2D5C82259F7E3E005682ED /* DematerializeResults.swift in Sources */, 9A2D5C50259F7B21005682ED /* MapError.swift in Sources */, @@ -1345,6 +1317,7 @@ D021671E1A6CD50500987861 /* ActionSpec.swift in Sources */, D8024DB31B2E1BB0005E6B9A /* SignalProducerLiftingSpec.swift in Sources */, BFA6B94E1A7604D500C846D1 /* SignalProducerNimbleMatchers.swift in Sources */, + A9F3C40D273E43E9000F0E18 /* SwiftConcurrencyTests.swift in Sources */, B696FB821A7640C00075236D /* TestError.swift in Sources */, D8170FC21B100EBC004192AD /* FoundationExtensionsSpec.swift in Sources */, 9A681A9F1E5A241B00B097CF /* DeprecationSpec.swift in Sources */, From 9163df1701606d20c2f81bd6f417656a900dc9e8 Mon Sep 17 00:00:00 2001 From: Marco Cancellieri Date: Fri, 12 Nov 2021 07:51:40 +0100 Subject: [PATCH 03/12] Update Changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91bb4ef05..173e73998 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ # 6.7.0 # 6.7.0-rc1 +1. Add Swift Concurrency extensions `asyncStream` and `asyncThrowingStream` to `Signal` and `SignalProducer` (#847) 1. New operator `SignalProducer.Type.interval(_:interval:on:)` for emitting elements from a given sequence regularly. (#810, kudos to @mluisbrown) From 03832b3ad4a0358d7d3b78be4c312c14fa130ff1 Mon Sep 17 00:00:00 2001 From: Marco Cancellieri Date: Fri, 12 Nov 2021 10:41:02 +0100 Subject: [PATCH 04/12] Use actual value in tests --- .../SwiftConcurrencyTests.swift | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift b/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift index 92237c565..9aa4db642 100644 --- a/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift +++ b/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift @@ -15,22 +15,22 @@ import XCTest class SwiftConcurrencyTests: XCTestCase { func testValuesAsyncSignalProducer() async { let values = [1,2,3] - var counter = 0 + var sum = 0 let asyncStream = SignalProducer(values).asyncStream - for await _ in asyncStream { - counter += 1 + for await number in asyncStream { + sum += number } - XCTAssertEqual(counter, 3) + XCTAssertEqual(sum, 6) } func testValuesAsyncThrowingSignalProducer() async throws { let values = [1,2,3] - var counter = 0 + var sum = 0 let asyncStream = SignalProducer(values).asyncThrowingStream - for try await _ in asyncStream { - counter += 1 + for try await number in asyncStream { + sum += number } - XCTAssertEqual(counter, 3) + XCTAssertEqual(sum, 6) } func testCompleteAsyncSignalProducer() async { @@ -60,12 +60,12 @@ class SwiftConcurrencyTests: XCTestCase { observer.sendCompleted() } } - var counter = 0 + var sum = 0 let asyncStream = signal.asyncStream - for await _ in asyncStream { - counter += 1 + for await number in asyncStream { + sum += number } - XCTAssertEqual(counter, 3) + XCTAssertEqual(sum, 6) } func testValuesAsyncThrowingSignal() async throws { @@ -77,12 +77,12 @@ class SwiftConcurrencyTests: XCTestCase { observer.sendCompleted() } } - var counter = 0 + var sum = 0 let asyncStream = signal.asyncThrowingStream - for try await _ in asyncStream { - counter += 1 + for try await number in asyncStream { + sum += number } - XCTAssertEqual(counter, 3) + XCTAssertEqual(sum, 6) } func testCompleteAsyncSignal() async { @@ -126,5 +126,4 @@ fileprivate extension XCTest { } } } - #endif From 73a5073c6c8952cb6678c6931deac451d7745dd9 Mon Sep 17 00:00:00 2001 From: Marco Cancellieri Date: Fri, 12 Nov 2021 10:46:20 +0100 Subject: [PATCH 05/12] Use tabs instead of spaces to align with rest of codebase --- Sources/Signal+SwiftConcurrency.swift | 70 +++--- Sources/SignalProducer+SwiftConcurrency.swift | 68 +++--- .../SwiftConcurrencyTests.swift | 210 +++++++++--------- 3 files changed, 174 insertions(+), 174 deletions(-) diff --git a/Sources/Signal+SwiftConcurrency.swift b/Sources/Signal+SwiftConcurrency.swift index 0f9eb9cac..34993decf 100644 --- a/Sources/Signal+SwiftConcurrency.swift +++ b/Sources/Signal+SwiftConcurrency.swift @@ -10,43 +10,43 @@ import Foundation @available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) extension Signal { - public var asyncThrowingStream: AsyncThrowingStream { - AsyncThrowingStream { continuation in - let disposable = observe { event in - switch event { - case .value(let value): - continuation.yield(value) - case .completed, .interrupted: - continuation.finish() - case .failed(let error): - continuation.finish(throwing: error) - } - } - continuation.onTermination = { @Sendable termination in - disposable?.dispose() - } - } - } + public var asyncThrowingStream: AsyncThrowingStream { + AsyncThrowingStream { continuation in + let disposable = observe { event in + switch event { + case .value(let value): + continuation.yield(value) + case .completed, .interrupted: + continuation.finish() + case .failed(let error): + continuation.finish(throwing: error) + } + } + continuation.onTermination = { @Sendable termination in + disposable?.dispose() + } + } + } } extension Signal where Error == Never { - @available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) - public var asyncStream: AsyncStream { - AsyncStream { continuation in - let disposable = observe { event in - switch event { - case .value(let value): - continuation.yield(value) - case .completed, .interrupted: - continuation.finish() - case .failed: - fatalError("Never is impossible to construct") - } - } - continuation.onTermination = { @Sendable termination in - disposable?.dispose() - } - } - } + @available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) + public var asyncStream: AsyncStream { + AsyncStream { continuation in + let disposable = observe { event in + switch event { + case .value(let value): + continuation.yield(value) + case .completed, .interrupted: + continuation.finish() + case .failed: + fatalError("Never is impossible to construct") + } + } + continuation.onTermination = { @Sendable termination in + disposable?.dispose() + } + } + } } #endif diff --git a/Sources/SignalProducer+SwiftConcurrency.swift b/Sources/SignalProducer+SwiftConcurrency.swift index 236a6f9a3..ecfafc169 100644 --- a/Sources/SignalProducer+SwiftConcurrency.swift +++ b/Sources/SignalProducer+SwiftConcurrency.swift @@ -10,43 +10,43 @@ import Foundation @available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) extension SignalProducer { - public var asyncThrowingStream: AsyncThrowingStream { - AsyncThrowingStream { continuation in - let disposable = start { event in - switch event { - case .value(let value): - continuation.yield(value) - case .completed, .interrupted: - continuation.finish() - case .failed(let error): - continuation.finish(throwing: error) - } - } - continuation.onTermination = { @Sendable _ in - disposable.dispose() - } - } - } + public var asyncThrowingStream: AsyncThrowingStream { + AsyncThrowingStream { continuation in + let disposable = start { event in + switch event { + case .value(let value): + continuation.yield(value) + case .completed, .interrupted: + continuation.finish() + case .failed(let error): + continuation.finish(throwing: error) + } + } + continuation.onTermination = { @Sendable _ in + disposable.dispose() + } + } + } } @available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) extension SignalProducer where Error == Never { - public var asyncStream: AsyncStream { - AsyncStream { continuation in - let disposable = start { event in - switch event { - case .value(let value): - continuation.yield(value) - case .completed, .interrupted: - continuation.finish() - case .failed: - fatalError("Never is impossible to construct") - } - } - continuation.onTermination = { @Sendable _ in - disposable.dispose() - } - } - } + public var asyncStream: AsyncStream { + AsyncStream { continuation in + let disposable = start { event in + switch event { + case .value(let value): + continuation.yield(value) + case .completed, .interrupted: + continuation.finish() + case .failed: + fatalError("Never is impossible to construct") + } + } + continuation.onTermination = { @Sendable _ in + disposable.dispose() + } + } + } } #endif diff --git a/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift b/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift index 9aa4db642..99bb284d0 100644 --- a/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift +++ b/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift @@ -13,117 +13,117 @@ import XCTest @available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) class SwiftConcurrencyTests: XCTestCase { - func testValuesAsyncSignalProducer() async { - let values = [1,2,3] - var sum = 0 - let asyncStream = SignalProducer(values).asyncStream - for await number in asyncStream { + func testValuesAsyncSignalProducer() async { + let values = [1,2,3] + var sum = 0 + let asyncStream = SignalProducer(values).asyncStream + for await number in asyncStream { sum += number - } - XCTAssertEqual(sum, 6) - } - - func testValuesAsyncThrowingSignalProducer() async throws { - let values = [1,2,3] - var sum = 0 - let asyncStream = SignalProducer(values).asyncThrowingStream - for try await number in asyncStream { + } + XCTAssertEqual(sum, 6) + } + + func testValuesAsyncThrowingSignalProducer() async throws { + let values = [1,2,3] + var sum = 0 + let asyncStream = SignalProducer(values).asyncThrowingStream + for try await number in asyncStream { sum += number - } - XCTAssertEqual(sum, 6) - } - - func testCompleteAsyncSignalProducer() async { - let asyncStream = SignalProducer.empty.asyncStream - let first = await asyncStream.first(where: { _ in true }) - XCTAssertEqual(first, nil) - } - - func testCompleteAsyncThrowingSignalProducer() async throws { - let asyncStream = SignalProducer.empty.asyncThrowingStream - let first = try await asyncStream.first(where: { _ in true }) - XCTAssertEqual(first, nil) - } - - func testErrorSignalProducer() async { - let error = NSError(domain: "domain", code: 0, userInfo: nil) - let asyncStream = SignalProducer(error: error).asyncThrowingStream - await XCTAssertThrowsError(try await asyncStream.first(where: { _ in true })) - } - - func testValuesAsyncSignal() async { - let signal = Signal { observer, _ in - Task { - for number in [1, 2, 3] { - observer.send(value: number) - } - observer.sendCompleted() - } - } - var sum = 0 - let asyncStream = signal.asyncStream - for await number in asyncStream { + } + XCTAssertEqual(sum, 6) + } + + func testCompleteAsyncSignalProducer() async { + let asyncStream = SignalProducer.empty.asyncStream + let first = await asyncStream.first(where: { _ in true }) + XCTAssertEqual(first, nil) + } + + func testCompleteAsyncThrowingSignalProducer() async throws { + let asyncStream = SignalProducer.empty.asyncThrowingStream + let first = try await asyncStream.first(where: { _ in true }) + XCTAssertEqual(first, nil) + } + + func testErrorSignalProducer() async { + let error = NSError(domain: "domain", code: 0, userInfo: nil) + let asyncStream = SignalProducer(error: error).asyncThrowingStream + await XCTAssertThrowsError(try await asyncStream.first(where: { _ in true })) + } + + func testValuesAsyncSignal() async { + let signal = Signal { observer, _ in + Task { + for number in [1, 2, 3] { + observer.send(value: number) + } + observer.sendCompleted() + } + } + var sum = 0 + let asyncStream = signal.asyncStream + for await number in asyncStream { sum += number - } - XCTAssertEqual(sum, 6) - } - - func testValuesAsyncThrowingSignal() async throws { - let signal = Signal { observer, _ in - Task { - for number in [1, 2, 3] { - observer.send(value: number) - } - observer.sendCompleted() - } - } - var sum = 0 - let asyncStream = signal.asyncThrowingStream - for try await number in asyncStream { - sum += number - } - XCTAssertEqual(sum, 6) - } - - func testCompleteAsyncSignal() async { - let asyncStream = Signal.empty.asyncStream - let first = await asyncStream.first(where: { _ in true }) - XCTAssertEqual(first, nil) - } - - func testCompleteAsyncThrowingSignal() async throws { - let asyncStream = Signal.empty.asyncThrowingStream - let first = try await asyncStream.first(where: { _ in true }) - XCTAssertEqual(first, nil) - } - - func testErrorSignal() async { - let error = NSError(domain: "domain", code: 0, userInfo: nil) - let signal = Signal { observer, _ in - Task { - observer.send(error: error) - } - } - let asyncStream = signal.asyncThrowingStream - await XCTAssertThrowsError(try await asyncStream.first(where: { _ in true })) - } + } + XCTAssertEqual(sum, 6) + } + + func testValuesAsyncThrowingSignal() async throws { + let signal = Signal { observer, _ in + Task { + for number in [1, 2, 3] { + observer.send(value: number) + } + observer.sendCompleted() + } + } + var sum = 0 + let asyncStream = signal.asyncThrowingStream + for try await number in asyncStream { + sum += number + } + XCTAssertEqual(sum, 6) + } + + func testCompleteAsyncSignal() async { + let asyncStream = Signal.empty.asyncStream + let first = await asyncStream.first(where: { _ in true }) + XCTAssertEqual(first, nil) + } + + func testCompleteAsyncThrowingSignal() async throws { + let asyncStream = Signal.empty.asyncThrowingStream + let first = try await asyncStream.first(where: { _ in true }) + XCTAssertEqual(first, nil) + } + + func testErrorSignal() async { + let error = NSError(domain: "domain", code: 0, userInfo: nil) + let signal = Signal { observer, _ in + Task { + observer.send(error: error) + } + } + let asyncStream = signal.asyncThrowingStream + await XCTAssertThrowsError(try await asyncStream.first(where: { _ in true })) + } } // Extension to allow Throw assertion for async expressions @available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) fileprivate extension XCTest { - func XCTAssertThrowsError( - _ expression: @autoclosure () async throws -> T, - _ message: @autoclosure () -> String = "", - file: StaticString = #filePath, - line: UInt = #line, - _ errorHandler: (_ error: Error) -> Void = { _ in } - ) async { - do { - _ = try await expression() - XCTFail(message(), file: file, line: line) - } catch { - errorHandler(error) - } - } + func XCTAssertThrowsError( + _ expression: @autoclosure () async throws -> T, + _ message: @autoclosure () -> String = "", + file: StaticString = #filePath, + line: UInt = #line, + _ errorHandler: (_ error: Error) -> Void = { _ in } + ) async { + do { + _ = try await expression() + XCTFail(message(), file: file, line: line) + } catch { + errorHandler(error) + } + } } #endif From 9d2393e95958f1dda9931a846c9fed17bade2e96 Mon Sep 17 00:00:00 2001 From: Marco Cancellieri Date: Fri, 12 Nov 2021 14:11:43 +0100 Subject: [PATCH 06/12] Add missing availability for mac catalyst --- Sources/Signal+SwiftConcurrency.swift | 4 ++-- Sources/SignalProducer+SwiftConcurrency.swift | 4 ++-- Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Sources/Signal+SwiftConcurrency.swift b/Sources/Signal+SwiftConcurrency.swift index 34993decf..836f7b2ac 100644 --- a/Sources/Signal+SwiftConcurrency.swift +++ b/Sources/Signal+SwiftConcurrency.swift @@ -8,7 +8,7 @@ #if compiler(>=5.5) && canImport(_Concurrency) import Foundation -@available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) +@available(macOS 12, iOS 15, watchOS 8, tvOS 15, macCatalyst 15, *) extension Signal { public var asyncThrowingStream: AsyncThrowingStream { AsyncThrowingStream { continuation in @@ -30,7 +30,7 @@ extension Signal { } extension Signal where Error == Never { - @available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) + @available(macOS 12, iOS 15, watchOS 8, tvOS 15, macCatalyst 15, *) public var asyncStream: AsyncStream { AsyncStream { continuation in let disposable = observe { event in diff --git a/Sources/SignalProducer+SwiftConcurrency.swift b/Sources/SignalProducer+SwiftConcurrency.swift index ecfafc169..8aeb0e1ed 100644 --- a/Sources/SignalProducer+SwiftConcurrency.swift +++ b/Sources/SignalProducer+SwiftConcurrency.swift @@ -8,7 +8,7 @@ #if compiler(>=5.5) && canImport(_Concurrency) import Foundation -@available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) +@available(macOS 12, iOS 15, watchOS 8, tvOS 15, macCatalyst 15, *) extension SignalProducer { public var asyncThrowingStream: AsyncThrowingStream { AsyncThrowingStream { continuation in @@ -29,7 +29,7 @@ extension SignalProducer { } } -@available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) +@available(macOS 12, iOS 15, watchOS 8, tvOS 15, macCatalyst 15, *) extension SignalProducer where Error == Never { public var asyncStream: AsyncStream { AsyncStream { continuation in diff --git a/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift b/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift index 99bb284d0..193048830 100644 --- a/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift +++ b/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift @@ -11,7 +11,7 @@ import Foundation import ReactiveSwift import XCTest -@available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) +@available(macOS 12, iOS 15, watchOS 8, tvOS 15, macCatalyst 15, *) class SwiftConcurrencyTests: XCTestCase { func testValuesAsyncSignalProducer() async { let values = [1,2,3] From 5896c3dd374052b26e2572ddb572ed7e52421d06 Mon Sep 17 00:00:00 2001 From: Marco Cancellieri Date: Fri, 12 Nov 2021 14:27:31 +0100 Subject: [PATCH 07/12] add availability to test extension --- Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift b/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift index 193048830..d691c4e70 100644 --- a/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift +++ b/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift @@ -109,7 +109,7 @@ class SwiftConcurrencyTests: XCTestCase { } } // Extension to allow Throw assertion for async expressions -@available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) +@available(macOS 12, iOS 15, watchOS 8, tvOS 15, macCatalyst 15, *) fileprivate extension XCTest { func XCTAssertThrowsError( _ expression: @autoclosure () async throws -> T, From 1c94d30d24e5da78cf7888b4b8a46500e0119a31 Mon Sep 17 00:00:00 2001 From: Marco Cancellieri Date: Sun, 14 Nov 2021 11:25:46 +0100 Subject: [PATCH 08/12] Use Xcode 13.1 for CI --- .github/workflows/test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d7f216060..38e90de07 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,6 +4,8 @@ jobs: test: name: Test runs-on: macos-11 + env: + DEVELOPER_DIR: /Applications/Xcode_13.1.app/Contents/Developer strategy: fail-fast: false matrix: From 469b8c4b7ae58c31ff8cb6989ddcba314a54559e Mon Sep 17 00:00:00 2001 From: Marco Cancellieri Date: Sun, 14 Nov 2021 11:55:52 +0100 Subject: [PATCH 09/12] Replace Task with Dispatch async --- Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift b/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift index d691c4e70..99216ea6a 100644 --- a/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift +++ b/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift @@ -53,7 +53,7 @@ class SwiftConcurrencyTests: XCTestCase { func testValuesAsyncSignal() async { let signal = Signal { observer, _ in - Task { + DispatchQueue.main.async { for number in [1, 2, 3] { observer.send(value: number) } @@ -70,7 +70,7 @@ class SwiftConcurrencyTests: XCTestCase { func testValuesAsyncThrowingSignal() async throws { let signal = Signal { observer, _ in - Task { + DispatchQueue.main.async { for number in [1, 2, 3] { observer.send(value: number) } @@ -100,7 +100,7 @@ class SwiftConcurrencyTests: XCTestCase { func testErrorSignal() async { let error = NSError(domain: "domain", code: 0, userInfo: nil) let signal = Signal { observer, _ in - Task { + DispatchQueue.main.async { observer.send(error: error) } } From be62397f484ec34a96881d22ba1dab4e1d359c1e Mon Sep 17 00:00:00 2001 From: Marco Cancellieri Date: Sat, 27 Nov 2021 17:27:58 +0100 Subject: [PATCH 10/12] Test New Xcode --- .github/workflows/test.yml | 2 +- Sources/Signal+SwiftConcurrency.swift | 4 ++-- Sources/SignalProducer+SwiftConcurrency.swift | 4 ++-- Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 38e90de07..ef114a2ce 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,7 +5,7 @@ jobs: name: Test runs-on: macos-11 env: - DEVELOPER_DIR: /Applications/Xcode_13.1.app/Contents/Developer + DEVELOPER_DIR: /Applications/Xcode_13.2.app/Contents/Developer strategy: fail-fast: false matrix: diff --git a/Sources/Signal+SwiftConcurrency.swift b/Sources/Signal+SwiftConcurrency.swift index 836f7b2ac..450ea686a 100644 --- a/Sources/Signal+SwiftConcurrency.swift +++ b/Sources/Signal+SwiftConcurrency.swift @@ -8,7 +8,7 @@ #if compiler(>=5.5) && canImport(_Concurrency) import Foundation -@available(macOS 12, iOS 15, watchOS 8, tvOS 15, macCatalyst 15, *) +@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, macCatalyst 13, *) extension Signal { public var asyncThrowingStream: AsyncThrowingStream { AsyncThrowingStream { continuation in @@ -29,8 +29,8 @@ extension Signal { } } +@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, macCatalyst 13, *) extension Signal where Error == Never { - @available(macOS 12, iOS 15, watchOS 8, tvOS 15, macCatalyst 15, *) public var asyncStream: AsyncStream { AsyncStream { continuation in let disposable = observe { event in diff --git a/Sources/SignalProducer+SwiftConcurrency.swift b/Sources/SignalProducer+SwiftConcurrency.swift index 8aeb0e1ed..db90b43fb 100644 --- a/Sources/SignalProducer+SwiftConcurrency.swift +++ b/Sources/SignalProducer+SwiftConcurrency.swift @@ -8,7 +8,7 @@ #if compiler(>=5.5) && canImport(_Concurrency) import Foundation -@available(macOS 12, iOS 15, watchOS 8, tvOS 15, macCatalyst 15, *) +@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, macCatalyst 13, *) extension SignalProducer { public var asyncThrowingStream: AsyncThrowingStream { AsyncThrowingStream { continuation in @@ -29,7 +29,7 @@ extension SignalProducer { } } -@available(macOS 12, iOS 15, watchOS 8, tvOS 15, macCatalyst 15, *) +@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, macCatalyst 13, *) extension SignalProducer where Error == Never { public var asyncStream: AsyncStream { AsyncStream { continuation in diff --git a/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift b/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift index 99216ea6a..74602c28a 100644 --- a/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift +++ b/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift @@ -11,7 +11,7 @@ import Foundation import ReactiveSwift import XCTest -@available(macOS 12, iOS 15, watchOS 8, tvOS 15, macCatalyst 15, *) +@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, macCatalyst 13, *) class SwiftConcurrencyTests: XCTestCase { func testValuesAsyncSignalProducer() async { let values = [1,2,3] From d2d60796fdb8a77845c077fbe5e6bbdb02aca8ed Mon Sep 17 00:00:00 2001 From: Marco Cancellieri Date: Sat, 27 Nov 2021 17:33:35 +0100 Subject: [PATCH 11/12] Fix availability and changelog --- CHANGELOG.md | 3 +-- Sources/Signal+SwiftConcurrency.swift | 2 +- Sources/SignalProducer+SwiftConcurrency.swift | 2 +- Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift | 4 ++-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f44e7c396..e5a11fe8b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # master *Please add new entries at the top.* +1. Add Swift Concurrency extensions `asyncStream` and `asyncThrowingStream` to `Signal` and `SignalProducer` (#847) # 7.0.0 1. The UnidirectionalBinding operator `<~` returns non optional values. (#834, kudos to @NicholasTD07) @@ -10,8 +11,6 @@ # 6.7.0 # 6.7.0-rc1 -1. Add Swift Concurrency extensions `asyncStream` and `asyncThrowingStream` to `Signal` and `SignalProducer` (#847) - 1. New operator `SignalProducer.Type.interval(_:interval:on:)` for emitting elements from a given sequence regularly. (#810, kudos to @mluisbrown) 1. `Signal` offers two special variants for advanced users: unserialized and reentrant-unserialized. (#797) diff --git a/Sources/Signal+SwiftConcurrency.swift b/Sources/Signal+SwiftConcurrency.swift index 450ea686a..9ffd31609 100644 --- a/Sources/Signal+SwiftConcurrency.swift +++ b/Sources/Signal+SwiftConcurrency.swift @@ -5,7 +5,7 @@ // Created by Marco Cancellieri on 2021-11-11. // Copyright (c) 2021 GitHub. All rights reserved. // -#if compiler(>=5.5) && canImport(_Concurrency) +#if compiler(>=5.5.2) && canImport(_Concurrency) import Foundation @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, macCatalyst 13, *) diff --git a/Sources/SignalProducer+SwiftConcurrency.swift b/Sources/SignalProducer+SwiftConcurrency.swift index db90b43fb..23ab12b99 100644 --- a/Sources/SignalProducer+SwiftConcurrency.swift +++ b/Sources/SignalProducer+SwiftConcurrency.swift @@ -5,7 +5,7 @@ // Created by Marco Cancellieri on 2021-11-11. // Copyright (c) 2021 GitHub. All rights reserved. // -#if compiler(>=5.5) && canImport(_Concurrency) +#if compiler(>=5.5.2) && canImport(_Concurrency) import Foundation @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, macCatalyst 13, *) diff --git a/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift b/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift index 74602c28a..232cafcf8 100644 --- a/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift +++ b/Tests/ReactiveSwiftTests/SwiftConcurrencyTests.swift @@ -6,7 +6,7 @@ // Copyright (c) 2021 GitHub. All rights reserved. // -#if compiler(>=5.5) && canImport(_Concurrency) +#if compiler(>=5.5.2) && canImport(_Concurrency) import Foundation import ReactiveSwift import XCTest @@ -109,7 +109,7 @@ class SwiftConcurrencyTests: XCTestCase { } } // Extension to allow Throw assertion for async expressions -@available(macOS 12, iOS 15, watchOS 8, tvOS 15, macCatalyst 15, *) +@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, macCatalyst 13, *) fileprivate extension XCTest { func XCTAssertThrowsError( _ expression: @autoclosure () async throws -> T, From e08e237df9611d431f17ade3f364151527bdeb78 Mon Sep 17 00:00:00 2001 From: Marco Cancellieri Date: Sat, 1 Jan 2022 10:57:07 +0100 Subject: [PATCH 12/12] Use Xcode 13.2.1 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ef114a2ce..1765463a5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,7 +5,7 @@ jobs: name: Test runs-on: macos-11 env: - DEVELOPER_DIR: /Applications/Xcode_13.2.app/Contents/Developer + DEVELOPER_DIR: /Applications/Xcode_13.2.1.app/Contents/Developer strategy: fail-fast: false matrix: