private void DecomposePanickingFunctionalNode(FunctionalNode functionalNode, NIType createPanicResultSignature) { if (functionalNode.OutputTerminals.HasMoreThan(1)) { throw new NotSupportedException("Decomposing FunctionalNodes with multiple output parameters not supported yet."); } FunctionalNode createPanicResultNode = CreateInputReplacementNode(functionalNode, diagram => CreateFunctionalNodeWithFacade(diagram, createPanicResultSignature)); PanicOrContinueNode panicOrContinueNode = ConnectNewNodeToOutputTerminal(createPanicResultNode, diagram => new PanicOrContinueNode(diagram)); ConnectOutputTerminal(functionalNode.OutputTerminals[0], panicOrContinueNode.OutputTerminal); functionalNode.RemoveFromGraph(); }
private void DecomposeAsyncFunctionalNode(FunctionalNode functionalNode, NIType createPromiseSignature) { if (functionalNode.OutputTerminals.HasMoreThan(1)) { throw new NotSupportedException("Decomposing FunctionalNodes with multiple output parameters not supported yet."); } FunctionalNode createPromiseNode = CreateInputReplacementNode(functionalNode, diagram => CreateFunctionalNodeWithFacade(diagram, createPromiseSignature)); AwaitNode awaitNode = ConnectNewNodeToOutputTerminal(createPromiseNode, diagram => new AwaitNode(diagram)); ConnectOutputTerminal(functionalNode.OutputTerminals[0], awaitNode.OutputTerminal); VariableSet variableSet = awaitNode.GetVariableSet(); TypeVariableReference outputTypeVariable = awaitNode.OutputTerminal.GetTrueVariable().TypeVariableReference; TypeVariableReference pollResultTypeVariable = variableSet.TypeVariableSet.CreateReferenceToOptionType(outputTypeVariable); awaitNode.PollResultVariable = variableSet.CreateNewVariable( diagramId: 0, variableType: pollResultTypeVariable, mutable: false); functionalNode.RemoveFromGraph(); }