/// <summary>
 /// Add a step to process the input and transform it into an output
 /// </summary>
 /// <param name="input">Input</param>
 /// <typeparam name="TInput">Type of the input</typeparam>
 /// <param name="step">Pipeline step</param>
 /// <typeparam name="TOutput">Type of the output</typeparam>
 /// <param name="arg1">Additional argument passed to the process</param>
 /// <typeparam name="TArg1">Type of the first argument</typeparam>
 /// <param name="arg2">Additional argument passed to the process</param>
 /// <typeparam name="TArg1">Type of the second argument</typeparam>
 /// <param name="arg3">Additional argument passed to the process</param>
 /// <typeparam name="TArg3">Type of the third argument</typeparam>
 /// <returns>Returns the output of processing the input</returns>
 public static Task <TOutput> AddStep <TInput, TArg1, TArg2, TArg3, TOutput>(
     this TInput input,
     IAsyncPipelineStep <TInput, TArg1, TArg2, TArg3, TOutput> step,
     TArg1 arg1, TArg2 arg2, TArg3 arg3)
 {
     return(step.ProcessAsync(input, arg1, arg2, arg3));
 }
 /// <summary>
 /// Add a step to process the input and transform it into an output
 /// </summary>
 /// <param name="input">Input</param>
 /// <typeparam name="TInput">Type of the input</typeparam>
 /// <param name="step">Pipeline step</param>
 /// <typeparam name="TOutput">Type of the output</typeparam>
 /// <returns>Returns the output of processing the input</returns>
 public static Task <TOutput> AddStep <TInput, TOutput>(
     this TInput input,
     IAsyncPipelineStep <TInput, TOutput> step)
 {
     return(step.ProcessAsync(input));
 }