protected override JToken Serialize(MathExpression <TUnit> value)
            {
                if (value == null)
                {
                    return(JToken.FromObject(""));
                }

                return(JToken.FromObject(value.Expression));
            }
        public static MathExpression <TUnit> operator /(MathExpression <TUnit> left, double right)
        {
            var result = new MathExpression <TUnit>(string.Format("({0})/{1}", left.Expression, right));

            left.variables
            .ForEach(kvp => result.variables[kvp.Key] = kvp.Value);

            result.CustomConstructor = left.CustomConstructor;

            return(result);
        }
        public static MathExpression <TUnit> operator *(double left, MathExpression <TUnit> right)
        {
            var result = new MathExpression <TUnit>(string.Format("{0}*({1})", left, right.Expression));

            right.variables
            .ForEach(kvp => result.variables[kvp.Key] = kvp.Value);

            result.CustomConstructor = right.CustomConstructor;

            return(result);
        }
        public bool Equals(MathExpression <TUnit> p)
        {
            // If parameter is null return false:
            if ((object)p == null)
            {
                return(false);
            }

            // Return true if the fields match:
            return(Expression == p.Expression);
        }
        public MathExpression <TUnit> DeepClone()
        {
            var clone = new MathExpression <TUnit>(Expression);

            clone.CustomConstructor = customConstructor;

            foreach (var variable in variables)
            {
                clone.variables[variable.Key] = variable.Value;
            }

            return(clone);
        }
        public override bool Equals(object obj)
        {
            // If parameter is null return false.
            if (obj == null)
            {
                return(false);
            }

            // If parameter cannot be cast to Point return false.
            MathExpression <TUnit> p = obj as MathExpression <TUnit>;

            if ((System.Object)p == null)
            {
                return(false);
            }

            // Return true if the fields match:
            return(Expression == p.Expression);
        }