В вашем коде проблема в том, что простые вызовы вашего предиката делают его O (N ^ 2). Кроме того, я думаю, что объектно-ориентированные вещи слишком сложны.
Я придумал:
scala> def lsplit(x : List[Int], limit : Int) =
(x foldLeft (0, Nil.asInstanceOf[List[List[Int]]])) ((x, y) => x match {
case (v, l::xs) if v+y < limit => (v+y, (y::l)::xs)
case (_, xs) => (y, (y::Nil)::xs)
})._2.reverse.map(x => x.reverse)
lsplit: (List[Int],Int)List[List[Int]]
scala> lsplit(List.range(1,50), 100)
res9: List[List[Int]] = List(List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13), List(14, 15, 16, 17, 18, 19), List(20, 21, 22, 23), List(24, 25, 26), List(27, 28, 29), List(30, 31, 32), List(33, 34), List(35, 36), List(37, 38), List(39, 40), List(41, 42), List(43, 44), List(45, 46), List(47, 48), List(49))
scala> lsplit(List.range(1,50), 122)
res10: List[List[Int]] = List(List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), List(16, 17, 18, 19, 20, 21), List(22, 23, 24, 25, 26), List(27, 28, 29, 30), List(31, 32, 33), List(34, 35, 36), List(37, 38, 39), List(40, 41), List(42, 43), List(44, 45), List(46, 47), List(48, 49))
Это не позволяет вам указать произвольный предикат, но вы можете заставить его работать для складчатых предикатов, изменяя манипуляции с первым элементом пары в foldLeft.