public Element <TInputElement, TNextOutputElement>[] Cascade <TNextInputElement, TNextOutputElement>(TInputElement[] input, IDataProvider[] allDataProviders, IStep <TNextInputElement, TNextOutputElement> nextStep, Func <TOutputElement, TNextInputElement> connector) { var ret = input.Select(inp => new Element <TInputElement, TNextOutputElement>() { Input = inp }).ToArray(); var myRet = CallDataProviders(allDataProviders, input); var mySucceededIndecies = Enumerable .Range(0, input.Length) .Where(i => IsElementSucceeded(myRet[i] as TElement)) .ToArray(); var nextInput = mySucceededIndecies.Select(ind => connector(myRet[ind].Output)).ToArray(); var nextRet = nextStep.CallDataProviders(allDataProviders, nextInput); for (int iNext = 0; iNext < nextInput.Length; iNext++) { if (nextStep.IsElementSucceeded(nextRet[iNext])) { ret[mySucceededIndecies[iNext]].Output = nextRet[iNext].Output; } else { ret[mySucceededIndecies[iNext]].PossibleErrorReason = nextRet[iNext].PossibleErrorReason; } } return(ret); }
Cascade <TInputElement, TOutputElement, TNextInputElement, TNextOutputElement>( this Expression <Func <Element <TInputElement, TOutputElement>[]> > thisExpression, IDataProvider[] allDataProviders, IStep <TNextInputElement, TNextOutputElement> nextStep, Func <TOutputElement, TNextInputElement> connector) { Func <Element <TInputElement, TNextOutputElement>[]> retFunc = () => { // TODO: Replace with deferred execution var myRet = thisExpression.Compile()().ToArray(); // CallDataProviders(allDataProviders, input); var ret = myRet.Select(inp => new Element <TInputElement, TNextOutputElement>() { Input = inp.Input }).ToArray(); var mySucceededIndecies = Enumerable .Range(0, ret.Length) .Where(i => myRet[i].Succeeded) .ToArray(); var nextInput = mySucceededIndecies.Select(ind => connector(myRet[ind].Output)).ToArray(); var nextRet = nextStep.CallDataProviders(allDataProviders, nextInput); for (int iNext = 0; iNext < nextInput.Length; iNext++) { if (nextStep.IsElementSucceeded(nextRet[iNext])) { ret[mySucceededIndecies[iNext]].Output = nextRet[iNext].Output; } else { ret[mySucceededIndecies[iNext]].PossibleErrorReason = nextRet[iNext].PossibleErrorReason; } } return(ret); }; return(() => retFunc()); }