Ejemplo n.º 1
0
        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);
            }
Ejemplo n.º 4
0
 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);
         }
     }
 }