domfox
08/16/2018, 5:11 PMinline fun <T, K> Sequence<T>.groupByAndReduce(keySelector: (T) -> K, crossinline reducer: (T, T) -> T): Map<K, T> =
groupByAndReduceTo(LinkedHashMap(), keySelector, reducer)
inline fun <T, K, M : MutableMap<in K, T>> Sequence<T>.groupByAndReduceTo(destination: M, keySelector: (T) -> K, crossinline reducer: (T, T) -> T): M {
for (element in this) {
val k = keySelector(element)
destination.compute(k) { _, v -> if (v == null) element else reducer(v, element) }
}
return destination
}
inline fun <T, A, K> Sequence<T>.groupByAndFold(keySelector: (T) -> K, seedValue: A, crossinline folder: (A, T) -> A): Map<K, A> =
groupByAndFoldTo(LinkedHashMap(), keySelector, seedValue, folder)
inline fun <T, A, K, M : MutableMap<in K, A>> Sequence<T>.groupByAndFoldTo(destination: M, keySelector: (T) -> K, seedValue: A, crossinline folder: (A, T) -> A): M {
for (element in this) {
val k = keySelector(element)
destination.compute(k) { _, v -> folder(v ?: seedValue, element) }
}
return destination
}
orangy
ilya.gorbunov
08/16/2018, 5:47 PMdomfox
08/17/2018, 9:06 AM