package nl.utwente.viskell.haskell.expr; import java.util.List; import nl.utwente.viskell.haskell.type.HaskellTypeError; import nl.utwente.viskell.haskell.type.Type; public class Case extends Expression { private List<Alternative> alternatives; private Expression expression; public static final class Alternative { private final Binder pattern; private final LetExpression guards; public Alternative(Binder pattern, LetExpression guards) { this.pattern = pattern; this.guards = guards; } } public Case(Expression e, List<Alternative> alternatives) { expression = e; this.alternatives = alternatives; } @Override public Type inferType() throws HaskellTypeError { return expression.inferType(); } @Override public String toHaskell() { StringBuilder sb = new StringBuilder(); sb.append("case "+expression.toHaskell()+" of {"); alternatives.forEach(alternative -> { sb.append(alternative.pattern.getUniqueName()+" | "+alternative.guards.toHaskell()+"; "); }); sb.append("}"); return sb.toString(); } @Override public String toString() { return toHaskell(); } }