From 8ed9bb36679a342e542bd68eab14ec54d52351d9 Mon Sep 17 00:00:00 2001 From: John Szumski Date: Fri, 2 May 2025 13:16:29 -0400 Subject: [PATCH] Add a way to map a workflow's Never output type to a different type without generating compiler warnings --- Workflow/Sources/AnyWorkflow.swift | 11 +++++++++++ Workflow/Tests/AnyWorkflowTests.swift | 17 +++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/Workflow/Sources/AnyWorkflow.swift b/Workflow/Sources/AnyWorkflow.swift index 0a76e7500..852d318ac 100644 --- a/Workflow/Sources/AnyWorkflow.swift +++ b/Workflow/Sources/AnyWorkflow.swift @@ -195,3 +195,14 @@ extension AnyWorkflowConvertible { asAnyWorkflow().mapRendering(transform) } } + +// MARK: - + +extension AnyWorkflowConvertible where Output == Never { + /// A convenience for workflows that don't produce output but want to change the declared output type. + public func mapOutput(to: NewOutput.Type) -> AnyWorkflow { + mapOutput(mapNever(_:)) + } +} + +private func mapNever(_ input: Never) -> T {} diff --git a/Workflow/Tests/AnyWorkflowTests.swift b/Workflow/Tests/AnyWorkflowTests.swift index 4dee01eb2..fdd448375 100644 --- a/Workflow/Tests/AnyWorkflowTests.swift +++ b/Workflow/Tests/AnyWorkflowTests.swift @@ -82,6 +82,13 @@ public class AnyWorkflowTests: XCTestCase { XCTAssertNotNil(erased.base as? OnOutputWorkflow) } + + func testMapNeverToOtherType() { + // test that this `Output = Bool` workflow compiles when mapped from an `Output = Never` workflow + let boolOutputWorkflow: AnyWorkflow = NeverOutputWorkflow().mapOutput(to: Bool.self) + + XCTAssertNotNil(boolOutputWorkflow) + } } /// Has no state or output, simply renders a reversed string @@ -150,3 +157,13 @@ private struct OnOutputChildWorkflow: Workflow { } } } + +private struct NeverOutputWorkflow: Workflow { + typealias Output = Never + typealias Rendering = String + typealias State = Void + + func render(state: State, context: RenderContext) -> String { + "Never" + } +}