enum ActionResult { case success(R) case error(Error) } struct Action { let run: (Context, Input) -> ActionResult } func + (lhs: Action, rhs: Action) -> Action { return Action { context, input in switch lhs.run(context, input) { case let .success(result): return rhs.run(context, result) case let .error(error): return .error(error) } } }