Раз пошла такая пьянка, решил глянуть, что у нас понаписано во всяких core-tools. Вдруг бросится в глаза, что можно выкинуть.
1. числа - всё плохо с BigDecimal/BigInteger. из коробки полно extension для Float/Double/Int, но нет аналогов для BigDecimal/BigInteger. Сиди пиши сам
2. Sequence - здесь более хитрые штуки, которые изначально мы реализовывали руками, но после появления windowedSequence часть кода ушла. Всё равно остаются кастомные сплиттеры (по условию, балансировщик, ...) и аналоги аналитических функций из SQL (скользящие окна, в которых агрегаты пересчитываются с учётом ограничений на контракт функции). Зачем-то сделан свой аналог FlatteningSequence. Возможно его не было в те времена
%)
3. ленивые Tuples
4. curry/uncarry/compose/decompose - вот это вообще подстава, так как приходится писать бесконечное кол-во довольно тупых перегрузок
5. мемоизация
6. recursiveConstruct(constructor: (() -> T) -> T), когда объекту для конструирования нужно передать способ получения себя же готового
7. Деревья/иерархии
8. interface Mapping<K, V> {
operator fun get(key: K): V?
}, KeyValue<K,V>, ... Всё-таки Map<K,V> это очень жирный интерфейс со строгим контрактом. Как только хочешь сделать что-то ленивое и всякие там copy-on-write сразу хочется вырезать из него всё лишнее (ключи заранее неизвестны, никаких тебе isEmpty, keys, values, ...) Очень жалко, что у Map в Kotlin нет вменяемых предков, так можно было бы не извращаться с адаптерами