summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorBurak Emir <emir@epfl.ch>2007-01-25 08:57:46 +0000
committerBurak Emir <emir@epfl.ch>2007-01-25 08:57:46 +0000
commitdd50828fda67a1af2b4bdaf760d88d065fb9a45f (patch)
tree9d57b0cb74fdb3579fbfd8ec8cb3043b228d3fe9 /src/library
parent3020baca77ebfd7b64a3920bec4aec73406a429c (diff)
downloadscala-dd50828fda67a1af2b4bdaf760d88d065fb9a45f.tar.gz
scala-dd50828fda67a1af2b4bdaf760d88d065fb9a45f.tar.bz2
scala-dd50828fda67a1af2b4bdaf760d88d065fb9a45f.zip
matching on arrays via unapplySeq
Diffstat (limited to 'src/library')
-rw-r--r--src/library/scala/Array.scala8
-rw-r--r--src/library/scala/Seq.scala13
-rw-r--r--src/library/scala/runtime/ScalaRunTime.scala1
3 files changed, 17 insertions, 5 deletions
diff --git a/src/library/scala/Array.scala b/src/library/scala/Array.scala
index 82745709ba..dd253ab658 100644
--- a/src/library/scala/Array.scala
+++ b/src/library/scala/Array.scala
@@ -157,6 +157,14 @@ object Array {
array
}
+ /** This method is called in a pattern match { case Array(...) => }.
+ *
+ * @param x the selector value
+ * @return array wrapped in an option, if this is a Seq, otherwise none
+ */
+ def unapplySeq[A](x: Any): Option[Seq[A]] =
+ if (x.isInstanceOf[Array[A]]) Some(x.asInstanceOf[Array[A]]) else None
+
}
/** This class represents polymorphic arrays. It is never instantiated.
diff --git a/src/library/scala/Seq.scala b/src/library/scala/Seq.scala
index 83deeef39e..1a488b82b2 100644
--- a/src/library/scala/Seq.scala
+++ b/src/library/scala/Seq.scala
@@ -23,13 +23,16 @@ object Seq {
def elements = Iterator.empty
}
- /** ...
+ /** This method is called in a pattern match { case Seq(...) => }.
*
- * @param x ...
- * @return ...
+ * @param x the selector value
+ * @return sequence wrapped in an option, if this is a Seq, otherwise none
*/
- def unapplySeq[A](x: Any): Option[Seq[A]] =
- if (x.isInstanceOf[Seq[A]]) Some(x.asInstanceOf[Seq[A]]) else None
+ def unapplySeq[A](x: Any): Option[Seq[A]] = x match {
+ case z: Seq[_] => Some(z.asInstanceOf[Seq[A]])
+ case z: AnyRef if runtime.ScalaRunTime.isArray(z) => Some(runtime.ScalaRunTime.boxArray(z).asInstanceOf[Seq[A]])
+ case _ => None
+ }
/** Builds a singleton sequence.
*
diff --git a/src/library/scala/runtime/ScalaRunTime.scala b/src/library/scala/runtime/ScalaRunTime.scala
index f29ca6d1e7..248904c0e1 100644
--- a/src/library/scala/runtime/ScalaRunTime.scala
+++ b/src/library/scala/runtime/ScalaRunTime.scala
@@ -39,6 +39,7 @@ object ScalaRunTime {
val BooleanTYPE = java.lang.Boolean.TYPE
val UnitTYPE = java.lang.Void.TYPE
+ def isArray(x:AnyRef): Boolean = x.getClass.isArray
def isValueTag(tag: String) = tag.charAt(0) == '.'
def isValueClass(clazz: Class) = clazz.isPrimitive()