summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library/scala/PartialFunction.scala11
-rw-r--r--test/files/run/emptypf.check3
-rw-r--r--test/files/run/emptypf.scala14
3 files changed, 26 insertions, 2 deletions
diff --git a/src/library/scala/PartialFunction.scala b/src/library/scala/PartialFunction.scala
index b8e20c2de1..51bb3dc93e 100644
--- a/src/library/scala/PartialFunction.scala
+++ b/src/library/scala/PartialFunction.scala
@@ -81,8 +81,15 @@ trait PartialFunction[-A, +B] extends (A => B) {
* @author Paul Phillips
* @since 2.8
*/
-object PartialFunction
-{
+object PartialFunction {
+ private[this] final val empty_pf = new PartialFunction[Any, Nothing] {
+ def isDefinedAt(x: Any) = false
+ def apply(x: Any): Nothing = sys.error("undefined")
+ override def orElse[A1, B1](that: PartialFunction[A1, B1]): PartialFunction[A1, B1] = that
+ override def lift = (x: Any) => None
+ }
+ def empty[A, B] : PartialFunction[A, B] = empty_pf.asInstanceOf[PartialFunction[A, B]]
+
/** Creates a Boolean test based on a value and a partial function.
* It behaves like a 'match' statement with an implied 'case _ => false'
* following the supplied cases.
diff --git a/test/files/run/emptypf.check b/test/files/run/emptypf.check
new file mode 100644
index 0000000000..f6c39921bc
--- /dev/null
+++ b/test/files/run/emptypf.check
@@ -0,0 +1,3 @@
+100
+3
+false
diff --git a/test/files/run/emptypf.scala b/test/files/run/emptypf.scala
new file mode 100644
index 0000000000..eb3e3e6380
--- /dev/null
+++ b/test/files/run/emptypf.scala
@@ -0,0 +1,14 @@
+object Test {
+ val f: PartialFunction[String, Int] = {
+ PartialFunction.empty[String, Int] orElse {
+ case "abc" => 100
+ case s => s.length
+ }
+ }
+
+ def main(args: Array[String]): Unit = {
+ println(f("abc"))
+ println(f("def"))
+ println(PartialFunction.empty[String, Int] isDefinedAt "abc")
+ }
+}