package gadt;

/**
 * Created by bibou on 12/5/14.
 */
public class EvalVisitor implements Visitor<Id.t> {

    @Override
    public App<Id.t, Integer> caseIntLit(IntLit expr) {
        return Id.newA(expr.value);
    }

    @Override
    public App<Id.t, Boolean> caseBoolLit(BoolLit expr) {
        return Id.newA(expr.value);
    }

    @Override
    public App<Id.t, Integer> casePlus(Plus expr) {

        Id<Integer> left = Id.prj(expr.left.accept(this));
        Id<Integer> right = Id.prj(expr.right.accept(this));

        return Id.newA(left.value + right.value);
    }

    @Override
    public <T> App<Id.t, T> caseIf(If<T> expr) {
        Id<Boolean> test = Id.prj(expr.x.accept(this));

        return test.value ? expr.y.accept(this): expr.z.accept(this);
    }
}

@@ -97,24 +97,101 @@
 or%3CId.t%3E %7B%0A%0A
+    %3CT%3E Id%3CT%3E eval(Expr%3CT%3E e)%7B%0A        return Id.prj(e.accept(this));%0A    %7D%0A%0A
     @Overrid
@@ -503,24 +503,29 @@
 ft = Id.prj(
+eval(
 expr.left.ac
@@ -521,28 +521,16 @@
 xpr.left
-.accept(this
 ));%0A    
@@ -556,24 +556,29 @@
 ht = Id.prj(
+eval(
 expr.right.a
@@ -575,28 +575,16 @@
 pr.right
-.accept(this
 ));%0A%0A   
@@ -739,25 +739,18 @@
 rj(e
+val(e
 xpr.x
-.accept(this
 ));%0A
@@ -783,46 +783,32 @@
  ? e
-xpr.y.accept(this): expr.z.accept(this
+val(expr.y): eval(expr.z
 );%0A 

Add eval to EvalVisitor.