aboutsummaryrefslogtreecommitdiff
path: root/tests/run/enum-Tree.scala
blob: ef5bd7a5714e1f82686df7106156afe5fab327df (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
enum Tree[T] {
  case True extends Tree[Boolean]
  case False extends Tree[Boolean]
  case Zero extends Tree[Int]
  case Succ(n: Tree[Int]) extends Tree[Int]
  case Pred(n: Tree[Int]) extends Tree[Int]
  case IsZero(n: Tree[Int]) extends Tree[Boolean]
  case If(cond: Tree[Boolean], thenp: Tree[T], elsep: Tree[T])
}

object Test {
  import Tree._

  def eval[T](e: Tree[T]): T = e match {
    case True => true
    case False => false
    case Zero => 0
    case Succ(f) => eval(f) + 1
    case Pred(f) => eval(f) - 1
    case IsZero(f) => eval(f) == 0
    case If(cond, thenp, elsep) => if (eval(cond)) eval(thenp) else eval(elsep)
  }

  val data = If(IsZero(Pred(Succ(Zero))), Succ(Succ(Zero)), Pred(Pred(Zero)))

  def main(args: Array[String]) = {
    println(s"$data --> ${eval(data)}")
  }
}