static void UpgradeEnumerableInputDependency(WorkflowBuilder builder, WorkflowInputDependency inputDependency) { var dependency = builder.Workflow.Build(inputDependency.Dependency); var sourceType = dependency.Type.GetGenericArguments()[0]; if (ExpressionHelper.IsEnumerableType(sourceType) && sourceType != typeof(string)) { var workflow = inputDependency.Target; var inputNode = workflow.FirstOrDefault(node => { return(ExpressionBuilder.Unwrap(node.Value) is WorkflowInputBuilder inputBuilder && inputBuilder.Index == 0); }); if (inputNode != null) { var mergeBuilder = new CombinatorBuilder { Combinator = new Reactive.Merge() }; var mergeNode = workflow.Add(mergeBuilder); foreach (var successor in inputNode.Successors) { mergeNode.Successors.Add(successor); } inputNode.Successors.Clear(); workflow.AddEdge(inputNode, mergeNode, new ExpressionBuilderArgument()); } } }
static IEnumerable <WorkflowInputDependency> GetEnumerableUpgradeTargets(ExpressionBuilderGraph workflow) { foreach (var node in workflow.TopologicalSort()) { var workflowBuilder = node.Value as WorkflowExpressionBuilder; if (workflowBuilder != null) { foreach (var dependency in GetEnumerableUpgradeTargets(workflowBuilder.Workflow)) { yield return(dependency); } } var successor = node.Successors.FirstOrDefault(edge => edge.Label.Index == 0 && (edge.Target.Value is SelectManyBuilder || edge.Target.Value is WindowWorkflowBuilder)); if (successor != null) { var inputDependency = new WorkflowInputDependency(); inputDependency.Dependency = node.Value; inputDependency.Target = ((WorkflowExpressionBuilder)successor.Target.Value).Workflow; yield return(inputDependency); } } }