package expressions;

/**
 * UnaryFunctionExpression stellt eine unäre Funktion dar. Die Funktion wird mit ihrem Namen identifiziert.
 * Siehe switch-case in eval() für eine Liste der darstellbaren Funktionen. Die Funktion enthält die Unter-Expression
 * argument als Funktionsargument und stellt somit die Funktion name(argument) dar.
 */
public class UnaryFunctionExpression extends Expression {
    private final String name;
    private final Expression argument;

    /**
     * Initialisiert die UnaryFunctionExpression.
     *
     * @param name     Name der darzustellenden Funktion (z. B. sin, cos, sqrt), siehe eval() für unterstützte Funktionen.
     * @param argument Ausdruck, der als Funktionsargument genutzt wird.
     */
    public UnaryFunctionExpression(String name, Expression argument) {
        this.name = name;
        this.argument = argument;
    }

    // TODO: Vervollständige die eval Methode. Nutze dazu einen Switch-Case.
    // TODO: Wichtige Funktionen sind z.B. sin(x), cos(x), tan(x), log(x), sqrt(x)
    /**
     * Wertet die FunctionExpression aus. Hierbei wird zunächst die eval-Methode auf das argument aufgerufen
     * und dann in die angegeben Funktion eingesetzt.
     *
     * Nicht vergessen: default case mit einer IllegalArgumentException
     * mit aussagekräftiger Fehlermeldung!
     *
     * @param x Der für x einzusetzende Wert. Der Parameter x muss rekursiv an eval-Methode der Unter-Expression argument
     *          weitergegeben werden.
     * @return Der Wert der Funktion, ausgewertet an der Stelle, die dem ausgewerteten Wert von argument entspricht.
     * @throws IllegalArgumentException wird im Fehlerfall geworfen.
     */
    @Override
    public double eval(double x) {

    }
}
