Plus-colon extractor for collections.
I often find myself writing the following for helpful head-tail decomposition:
package scala.collection
object +: {
def unapply[T,Coll <: SeqLike[T, Coll]](
t: Coll with SeqLike[T, Coll]): Option[(T, Coll)] =
t.headOption map ( h => (h, t.tail))
}
And then using it for head-tail decomposition like this:
scala> val x = Vector(1,2,3)
x: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3)
scala> x match {
| case x +: xs => println(x); xs
| }
1
res1: scala.collection.immutable.Vector[Int] = Vector(2, 3)
rather than the 'classical' variant:
scala> x match {
| case Seq(x, xs @ _*) => println(x); xs
| }
1
res2: Seq[Int] = Vector(2, 3)
I was curious if anyone else desired a parallelism to +: in pattern matching that mimics what's available for Lists (::). If you're like me, feel free to borrow the code, but also speak up! I'll find out about adding it into the standard library.
Note: We could also have a matching :+ operator for (x.init, x.last) decomposition as well. (Only really efficient for IndexedSeq, I would guess).
Published on December 28, 2011 00:00
No comments have been added yet.
Joshua Suereth's Blog
- Joshua Suereth's profile
- 3 followers
Joshua Suereth isn't a Goodreads Author
(yet),
but they
do have a blog,
so here are some recent posts imported from
their feed.
