public override void UnifyWithConnectedWireTypeAsNodeInput(VariableReference wireFacadeVariable, TerminalTypeUnificationResults unificationResults) { TypeVariableSet typeVariableSet = Terminal.GetTypeVariableSet(); ITypeUnificationResult inputUnificationResult = unificationResults.GetTypeUnificationResult(Terminal, TrueVariable.TypeVariableReference, wireFacadeVariable.TypeVariableReference); typeVariableSet.Unify(TrueVariable.TypeVariableReference, wireFacadeVariable.TypeVariableReference, inputUnificationResult); TrueVariable.MergeInto(wireFacadeVariable); string constructorName; TypeVariableReference innerType, optionType; if (typeVariableSet.TryDecomposeConstructorType(TrueVariable.TypeVariableReference, out constructorName, out innerType) && constructorName == "Option") { optionType = TrueVariable.TypeVariableReference; } else { optionType = typeVariableSet.CreateReferenceToConstructorType("Option", TrueVariable.TypeVariableReference); } TypeVariableReference outputTypeReference = _outputTerminalFacade.TrueVariable.TypeVariableReference; ITypeUnificationResult outputUnificationResult = unificationResults.GetTypeUnificationResult(_outputTerminalFacade.Terminal, outputTypeReference, optionType); typeVariableSet.Unify(outputTypeReference, optionType, outputUnificationResult); }
public override void UnifyWithConnectedWireTypeAsNodeInput(VariableReference wireFacadeVariable, TerminalTypeUnificationResults unificationResults) { ITypeUnificationResult unificationResult = unificationResults.GetTypeUnificationResult( Terminal, FacadeVariable.TypeVariableReference, wireFacadeVariable.TypeVariableReference); FacadeVariable.UnifyTypeVariableInto(wireFacadeVariable, unificationResult); FacadeVariable.MergeInto(wireFacadeVariable); }
public override void UnifyWithConnectedWireTypeAsNodeInput(VariableReference wireFacadeVariable, TerminalTypeUnificationResults unificationResults) { FacadeVariable.MergeInto(wireFacadeVariable); bool setExpectedMutable; TypeVariableReference typeToUnifyWith = ComputeTypeToUnifyWith(wireFacadeVariable, out setExpectedMutable); ITypeUnificationResult unificationResult = unificationResults.GetTypeUnificationResult( Terminal, TrueVariable.TypeVariableReference, typeToUnifyWith); if (setExpectedMutable) { unificationResult.SetExpectedMutable(); } TypeVariableSet.Unify(TrueVariable.TypeVariableReference, typeToUnifyWith, unificationResult); }
protected override void VisitWire(Wire wire) { // Merge the wire's input terminal with its connected source foreach (var wireTerminal in wire.InputTerminals) { var connectedNodeTerminal = wireTerminal.ConnectedTerminal; if (connectedNodeTerminal != null) { VariableReference wireVariable = wireTerminal.GetFacadeVariable(), nodeVariable = connectedNodeTerminal.GetFacadeVariable(); ITypeUnificationResult unificationResult = _typeUnificationResults.GetTypeUnificationResult( wireTerminal, wireVariable.TypeVariableReference, nodeVariable.TypeVariableReference); wireVariable.UnifyTypeVariableInto(nodeVariable, unificationResult); wireVariable.MergeInto(nodeVariable); } } }