class ImmutablePipeline implements Pipeline {

    @Override
    public PipelineElement execute(final PipelineElement pipelineInput, final ExpressionResolver expressionResolver) {

        return stageExpressions.stream().reduce(
                pipelineInput,
                (element, expression) -> functionExpression.resolve(expression, element, expressionResolver),
                ImmutablePipeline::combineElements
        );
    }

      ImmutablePipeline(final FunctionExpression functionExpression, final List<String> stageExpressions);

}