Ejemplo n.º 1
0
        public override IExpression Specialize(IEnumerable <Type> allowedTypes)
        {
            var unified = Types.SpecializeTo(allowedTypes);

            if (unified == null)
            {
                return(null);
            }

            var isFormAb = formAB.UnifyAll(unified) != null;
            var isFormCd = formCD.UnifyAll(unified) != null;

            if (isFormAb && isFormCd)
            {
                return(new EitherFunc(unified)); // Can't make a decision yet
            }

            if (isFormAb)
            {
                return(Funcs.Const.Specialize(unified));
            }

            if (isFormCd)
            {
                return(Funcs.ConstRight.Specialize(unified));
            }

            return(null);
        }