예제 #1
0
        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();
        }
예제 #2
0
        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();
        }