diff options
Diffstat (limited to 'src/library/scala/util/control/TailRec.scala')
-rwxr-xr-x | src/library/scala/util/control/TailRec.scala | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/library/scala/util/control/TailRec.scala b/src/library/scala/util/control/TailRec.scala new file mode 100755 index 0000000000..db6cbfa2ed --- /dev/null +++ b/src/library/scala/util/control/TailRec.scala @@ -0,0 +1,24 @@ +package scala.util.control + +abstract class TailRec[+A] + +object TailRec { + + case class Call[A](rest: () => TailRec[A]) extends TailRec[A] + case class Done[A](result: A) extends TailRec[A] + + def tailcall[A](rest: => TailRec[A]) = new Call(() => rest) + def done [A](result: A) = new Done(result) + def trampoline[A](body: TailRec[A]): A = { + def loop(body: TailRec[A]): A = body match { + case Call(rest) => loop(rest()) + case Done(result) => result + } + loop(body) + } + def loop[A](body: TailRec[A]): A = body match { + case Call(rest) => loop[A](rest()) + case Done(result) => result + } +} + |