たとえば、List(1, 0, 1, 1, 0, 1)というリストを 0 で区切ったリスト List(List(1), List(1, 1), List(1)) に変換したいときに使う。
def split[A](xs: List[A], f: A => Boolean): List[List[A]] = {
val (a, b) = xs.span((a: A) => !f(a))
b.isEmpty match {
case true => List[List[A]](a)
case false => List[List[A]](a) ++ split(b.tail, f)
}
}
assert(
split[Int](List(1, 0, 1, 1, 0, 1), _ == 0) == List(List(1), List(1, 1), List(1))
)
implicit class にしておくと使いまわしやすいかも。
implicit class SplittableList[A](list: List[A]) {
def splitBy(f: A => Boolean): List[List[A]] = splitList(list, f)
private def splitList(xs: List[A], p: A => Boolean): List[List[A]] = {
val (a, b) = xs.span((a: A) => !p(a))
b.isEmpty match {
case true => List[List[A]](a)
case false => List[List[A]](a) ++ splitList(b.tail, p)
}
}
}
assert(
List(1, 0, 1, 1, 0, 1).splitBy(_ == 0) == List(List(1), List(1, 1), List(1))
)