Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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());
        }