From 1aa65ccb60905320dea16bb20a5b4d5e4ba57ff1 Mon Sep 17 00:00:00 2001
From: Etienne Kneuss <ekneuss@gmail.com>
Date: Fri, 19 Oct 2012 16:57:29 +0200
Subject: [PATCH] Add choose with return types, example

---
 library/Utils.scala    | 14 +++++++-------
 testcases/Choose.scala |  7 +++++++
 2 files changed, 14 insertions(+), 7 deletions(-)
 create mode 100644 testcases/Choose.scala

diff --git a/library/Utils.scala b/library/Utils.scala
index 44b05cd36..12c81d7a0 100644
--- a/library/Utils.scala
+++ b/library/Utils.scala
@@ -22,11 +22,11 @@ object Utils {
 
   private def noChoose = throw new RuntimeException("Implementation not supported")
 
-  def choose[A](predicate: A => Boolean) = noChoose
-  def choose[A, B](predicate: (A, B) => Boolean) = noChoose
-  def choose[A, B, C](predicate: (A, B, C) => Boolean) = noChoose
-  def choose[A, B, C, D](predicate: (A, B, C, D) => Boolean) = noChoose
-  def choose[A, B, C, D, E](predicate: (A, B, C, D, E) => Boolean) = noChoose
-  def choose[A, B, C, D, E, F](predicate: (A, B, C, D, E, F) => Boolean) = noChoose
-  def choose[A, B, C, D, E, F, G](predicate: (A, B, C, D, E, F, G) => Boolean) = noChoose
+  def choose[A](predicate: A => Boolean): A = noChoose
+  def choose[A, B](predicate: (A, B) => Boolean): (A, B) = noChoose
+  def choose[A, B, C](predicate: (A, B, C) => Boolean): (A, B, C) = noChoose
+  def choose[A, B, C, D](predicate: (A, B, C, D) => Boolean): (A, B, C, D) = noChoose
+  def choose[A, B, C, D, E](predicate: (A, B, C, D, E) => Boolean): (A, B, C, D, E) = noChoose
+  def choose[A, B, C, D, E, F](predicate: (A, B, C, D, E, F) => Boolean): (A, B, C, D, E, F) = noChoose
+  def choose[A, B, C, D, E, F, G](predicate: (A, B, C, D, E, F, G) => Boolean): (A, B, C, D, E, F, G) = noChoose
 }
diff --git a/testcases/Choose.scala b/testcases/Choose.scala
new file mode 100644
index 000000000..22dbc18f4
--- /dev/null
+++ b/testcases/Choose.scala
@@ -0,0 +1,7 @@
+import leon.Utils._
+
+object Abs {
+
+  def abs(x: Int): Int = choose{ x: Int => x > 0 }
+
+}
-- 
GitLab