<@U6L7FL7R9> how about something along these lines...
# announcements
g
@purereborn how about something along these lines (works for the trivial example Karel mentioned)
Copy code
kotlin
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)
            }
        }
    }
}