Mark
06/07/2022, 2:05 AMfun <T> Iterable<T>.splitByIndex(index: Int): Pair<List<T>, List<T>> {
    if (index <= 0) {
        return emptyList<T>() to this.toList()
    }
    val iterator = this.iterator()
    val firstList = mutableListOf<T>()
    val secondList = mutableListOf<T>()
    var activeList = firstList
    while (iterator.hasNext()) {
        if (activeList.size == index) {
            activeList = secondList
        }
        activeList.add(iterator.next())
    }
    return firstList to secondList
}sizeIntephemient
06/07/2022, 2:09 AMListfun <T> List<T>.splitAt(index: Int) = take(index) to drop(index).subList()ListArrayListephemient
06/07/2022, 2:10 AMListindexephemient
06/07/2022, 2:11 AMsubListephemient
06/07/2022, 2:11 AMsliceMark
06/07/2022, 2:14 AMIterable.take()if (this is Collection<T>) {
    if (n >= size) return toList()
    if (n == 1) return listOf(first())
}ephemient
06/07/2022, 2:15 AMephemient
06/07/2022, 2:18 AMCopyOnWriteArrayListephemient
06/07/2022, 2:21 AMmutableListOf(...)CopyOnWriteArrayListiterator()Mark
06/07/2022, 2:23 AMfun <T> Iterable<T>.splitAt(index: Int): Pair<List<T>, List<T>> {
    if (index <= 0) {
        return emptyList<T>() to this.toList()
    }
    if (this is List) { // optimization to avoid iterator
        val safeList = this.toList()
        if (index >= safeList.size) {
            return safeList to emptyList()
        }
        return safeList.subList(0, index) to safeList.subList(index, safeList.size)
    }
    val iterator = this.iterator()
    val firstList = mutableListOf<T>()
    val secondList = mutableListOf<T>()
    var activeList = firstList
    while (iterator.hasNext()) {
        if (activeList.size == index) {
            activeList = secondList
        }
        activeList.add(iterator.next())
    }
    return firstList to secondList
}ListtoList()subListephemient
06/07/2022, 2:33 AMbuildList {
    repeat(index) {
        if (!iterator.hasNext()) return@buildList
        add(iterator.next())
    }
} to buildList {
    while (iterator.hasNext()) add(iterator.next())
}Iterable { iterator }.take(index) to Iterable { iterator }.toList()Mark
06/07/2022, 2:33 AMsafeListfun <T> Iterable<T>.splitAt(index: Int): Pair<List<T>, List<T>> {
    if (index <= 0) {
        return emptyList<T>() to this.toList()
    }
    val safeList = this.toList()
    if (index >= safeList.size) {
        return safeList to emptyList()
    }
    return safeList.subList(0, index) to safeList.subList(index, safeList.size)
}ephemient
06/07/2022, 2:35 AMephemient
06/07/2022, 2:37 AMMark
06/07/2022, 2:37 AMMark
06/07/2022, 2:45 AMsubListfun <T> Iterable<T>.splitAt(index: Int): Pair<List<T>, List<T>> {
    if (index <= 0) {
        return emptyList<T>() to this.toList()
    }
    val iterator = iterator()
    return Iterable { iterator }.take(index) to Iterable { iterator }.toList()
}