Quite often, you will come across a situation where a type that you don't have control over will benefit from an extra function. Maybe you've always wished that String had a reverse() function, or perhaps that list had a drop function that would return a copy of list with the first k elements removed.
An object-orientated approach would be to extend the type, thereby creating a subtype that adds the required new functions:
abstract class DroppableList<E> : ArrayList<E>() { fun drop(k: Int): List<E> { val resultSize = size - k when { resultSize <= 0 -> return emptyList<E>() else -> { val list = ArrayList<E>(resultSize) for (index in k..size - 1) { list.add(this[index]) } return list ...