object Pack { def pack[T](xs: List[T]): List[List[T]] = xs match { case Nil => Nil case x :: xs1 => val (first, last) = xs span(y => y == x) // takeWhile + dropWhile first :: pack(last) } def encode[T](xs: List[T]): List[(T,Int)] = pack(xs) map (ys => (ys.head, ys.length)) def run = { println("Pack") val l = List("a", "a", "a", "b", "c", "c", "a") println(pack(l)) println(encode(l)) } }