gjesse
09/22/2017, 12:58 PMkotlin
fun main(args: Array<String>) {
val input = listOf("test",
"test\n",
"best",
"best\n",
"rest")
val lineMerger = Merger { it.endsWith("\n") }
input.fold(lineMerger) { acc, s ->
acc.accumulate(s)
}.let {
println(it.accumulated)
}
}
class Merger(
val accumulated: List<List<String>> = listOf(),
val nextStartsNew: Boolean = false,
val splitPredicate: (String) -> Boolean) {
fun accumulate(value: String): Merger {
val isLast = splitPredicate(value)
return if (nextStartsNew) {
val newAccumulation: List<List<String>> = accumulated + listOf(listOf(value))
Merger(newAccumulation, isLast, splitPredicate)
} else {
// firstPast
if (accumulated.isEmpty()) {
Merger(listOf(listOf(value)), isLast, splitPredicate)
} else {
// append to last list
val last = accumulated.last() + listOf(value)
val newAccumulation = accumulated.subList(0, accumulated.lastIndex) + listOf(last)
Merger(newAccumulation, isLast, splitPredicate)
}
}
}
}