
/**
 * Representation for the sum of two subexpressions
 * 
 * @author Rusell C. Bjork
 * @version March 26, 2008
 */
public class Sum extends BinaryOperation
{
    /** Constructor
     * 
     *  @param left the first subexpression
     *  @param right the second subexpression
     */
    public Sum(Expression left, Expression right) {
        super(left, '+', right);
    }
   
    // toString is inherited from BinaryOperation
    
    public double evaluate(double x) {
        return left.evaluate(x) + right.evaluate(x);
    }
    
    public Expression derivative() {
        return new Sum(left.derivative(),
                       right.derivative());
    }
    
    // simplify() is inherited from Binary Operation
    
    public Expression simplify(Expression simplifiedLeft,
                               Expression simplifiedRight) {
        if (simplifiedLeft instanceof Constant && simplifiedLeft.evaluate(0) == 0)
            return simplifiedRight;
        else if (simplifiedRight instanceof Constant && simplifiedRight.evaluate(0) == 0)
            return simplifiedLeft;
        else if (simplifiedLeft == left && simplifiedRight == right)
            return this;
        else
            return new Sum(simplifiedLeft, simplifiedRight);
    }
    
    // draw is inherited from BinaryOperation
}
