Newer
Older
commitconf24 / snippets / Expr.java
@Antonio Muñoz Antonio Muñoz on 14 Mar 2024 1 KB update
package snippets;

sealed interface Expr {

    record Lit(int value) implements Expr {}
    record Sum(Expr left, Expr right) implements Expr {}
    record Diff(Expr left, Expr right) implements Expr {}
    record Times(Expr left, Expr right) implements Expr {}

    default int evaluate() {
        return switch (this) {
            case Lit(var value) -> value;
            case Sum(var left, var right) -> left.evaluate() + right.evaluate();
            case Diff(var left, var right) -> left.evaluate() - right.evaluate();
            case Times(var left, var right) -> left.evaluate() * right.evaluate();
        };
    }
      
    default String print() {
        return switch (this) {
            case Lit(var value) -> String.valueOf(value);
            case Sum(var left, var right) -> "(" + left.print() + "+" + right.print() + ")";
            case Diff(var left, var right) -> "(" + left.print() + "-" + right.print() + ")";
            case Times(var left, var right) -> "(" + left.print() + "*" + right.print() + ")";
        };
    }

    static Expr lit(int value) {
        return new Lit(value);
    }

    static Expr sum(Expr left, Expr right) {
        return new Sum(left, right);
    }

    static Expr diff(Expr left, Expr right) {
        return new Diff(left, right);
    }

    static Expr times(Expr left, Expr right) {
        return new Times(left, right);
    }

    static void run() {
        sum(lit(1), lit(2)).evaluate(); // 3
        sum(diff(lit(10), lit(8)), lit(2)).evaluate(); // 4
    }
}