Extraktoren für Seq


Eine nützliche Funktion für Sequenzen ist indexOf, die die Position eines Elements innerhalb einer Sequenz bestimmt. Diese kann man in Extraktoren verpacken, z.B.:

object IndexOf {
   def unapply[T](pair:(Seq[T],T)):Option[Int] = {
     val index = pair._1.indexOf(pair._2)  
     if (index == -1) None else Some(index)
   }
}

object ReverseIndexOf {
   def unapply[T](pair:(Seq[T],T)):Option[Int] = {
     val index = pair._1.indexOf(pair._2)  
     if (index == -1) None else Some(pair._1.size - index - 1)
   }
} 

Nun kann man ein paar aus einer Sequenz und einem Element matchen:

def testIndexOf(n:Int) = (List(1,2,3,4,5,6,7),n) match {
  case IndexOf(0) => println("first")
  case IndexOf(1) => println("second")
  case ReverseIndexOf(1) => println("second to last")  
  case ReverseIndexOf(0) => println("last")  
  case IndexOf(x) => println("indexOf==" + x)
  case _ => println("not found")  
}

(1 to 8).foreach(testIndexOf(_))
//--> first
//--> second
//--> indexOf==2
//--> indexOf==3
//--> indexOf==4
//--> second to last
//--> last
//--> not found

In der vorliegenden Form ist das vielleicht noch nicht sooo furchtbar nützlich, aber das Prinzip lässt sich gut verallgemeinern. Ich finde es jedenfalls interessant, selbst Extraktoren zu schreiben, statt mich mit vorgefertigten oder durch Fallklassen autogenerierte Extraktoren zu begnügen.

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s