From 3b05b7a6efcd77c93fbf51fe452991bb4a1c9ecc Mon Sep 17 00:00:00 2001 From: Stefano Mondino Date: Fri, 14 Apr 2023 12:54:34 +0200 Subject: [PATCH] AnyPublisher + extensions --- Sources/Convenience/AnyPublisher.swift | 33 +++++++++++++++ Tests/AnyPublisherTests.swift | 57 ++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 Sources/Convenience/AnyPublisher.swift create mode 100644 Tests/AnyPublisherTests.swift diff --git a/Sources/Convenience/AnyPublisher.swift b/Sources/Convenience/AnyPublisher.swift new file mode 100644 index 0000000..5d009bf --- /dev/null +++ b/Sources/Convenience/AnyPublisher.swift @@ -0,0 +1,33 @@ +// +// AnyPublisher.swift +// CombineExt +// +// Created by Stefano Mondino on 14/04/23. +// Copyright © 2020 Combine Community. All rights reserved. +// + +#if canImport(Combine) +import Combine + +@available(OSX 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) +public extension AnyPublisher { + /// A wrapper around a type erased Just + static func just(_ value: Output) -> AnyPublisher { + Just(value) + .setFailureType(to: Failure.self) + .eraseToAnyPublisher() + } + + /// A wrapper around a type erased Empty + static func empty() -> AnyPublisher { + Empty() + .setFailureType(to: Failure.self) + .eraseToAnyPublisher() + } + + /// A wrapper around a type erased Fail + static func fail(error: Failure) -> AnyPublisher { + Fail(error: error).eraseToAnyPublisher() + } +} +#endif diff --git a/Tests/AnyPublisherTests.swift b/Tests/AnyPublisherTests.swift new file mode 100644 index 0000000..996b3ec --- /dev/null +++ b/Tests/AnyPublisherTests.swift @@ -0,0 +1,57 @@ +// +// OptionalTests.swift +// CombineExt +// +// Created by Jasdev Singh on 11/05/2020. +// Copyright © 2020 Combine Community. All rights reserved. +// + +#if !os(watchOS) +import Combine +import CombineExt +import XCTest + +@available(OSX 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *) +final class AnyPublisherTests: XCTestCase { + private var subscription: AnyCancellable! + + func testJustInitialization() { + var results = [Int]() + var completion: Subscribers.Completion? + + subscription = AnyPublisher.just(1) + + .sink(receiveCompletion: { completion = $0 }, + receiveValue: { results.append($0) }) + + XCTAssertEqual([1], results) + XCTAssertEqual(.finished, completion) + } + + func testEmptyInitialization() { + var results = [Int]() + var completion: Subscribers.Completion? + + subscription = AnyPublisher.empty() + .sink(receiveCompletion: { completion = $0 }, receiveValue: { results.append($0) }) + + XCTAssertEqual([], results) + XCTAssertEqual(.finished, completion) + } + + func testFailInitialization() { + enum CustomError: Swift.Error { + case someError + } + var results = [Int]() + var completion: Subscribers.Completion? + + subscription = AnyPublisher.fail(error: .someError) + .sink(receiveCompletion: { completion = $0 }, receiveValue: { results.append($0) }) + + XCTAssertEqual([], results) + XCTAssertEqual(.failure(.someError), completion) + } + +} +#endif