diff --git a/swift/WorkflowUI/Sources/Container/ContainerViewController+AnyWorkflow.swift b/swift/WorkflowUI/Sources/Container/ContainerViewController+AnyWorkflow.swift new file mode 100644 index 000000000..5cbf587af --- /dev/null +++ b/swift/WorkflowUI/Sources/Container/ContainerViewController+AnyWorkflow.swift @@ -0,0 +1,39 @@ +import Foundation +import Workflow + +extension ContainerViewController { + public convenience init( + workflow: W, + rootViewEnvironment: ViewEnvironment = .empty + ) where W.Rendering == ScreenType, W.Output == Output { + self.init(workflow: WrapperWorkflow(workflow), rootViewEnvironment: rootViewEnvironment) + } +} + +fileprivate struct WrapperWorkflow: Workflow { + + var wrapped: AnyWorkflow + + init(_ wrapped: W) where W.Output == Output, W.Rendering == Rendering { + self.wrapped = wrapped.asAnyWorkflow() + } + + typealias State = Void + + func makeInitialState() -> State { + return () + } + + func workflowDidChange(from previousWorkflow: WrapperWorkflow, state: inout State) { + } + + typealias Output = Output + + typealias Rendering = Rendering + + func render(state: State, context: RenderContext) -> Rendering { + return wrapped + .mapOutput { AnyWorkflowAction(sendingOutput: $0) } + .rendered(with: context) + } +}