Mark
11/03/2020, 1:38 AMSequence
of `String`s and apply lots of mapping operations. Now, after these mappings I want to access the original index in the sequence. However, if I use mapIndexedValue
then I need to change each mapping operation implementation. Instead, is it recommended to declare and use something like this (not tested) so that we can continue to use the same transforms as before? Side note: is there a danger in using mutable values like this?
data class IndexedMutableValue<T>(val index: Int, var value: T)
fun <T> Sequence<T>.withIndexedMutableValue(): Sequence<IndexedMutableValue<T>> =
mapIndexed { index, t ->
IndexedMutableValue(index, t)
}
fun <T> Sequence<IndexedMutableValue<T>>.mapIndexedMutable(transform: (T) -> T): Sequence<IndexedMutableValue<T>> {
forEach { it.value = transform(it.value) }
return this
}
fun <T> Sequence<IndexedMutableValue<T>>.mapIndexedMutableNotNull(transform: (T) -> T?): Sequence<IndexedMutableValue<T>> {
forEach { it.value = transform(it.value) ?: return@forEach }
return this
}
fun <T> Sequence<IndexedMutableValue<T>>.flatMapIndexedMutable(transform: (T) -> Sequence<T>): Sequence<IndexedMutableValue<T>> {
return sequence {
forEach { indexedValue ->
transform(indexedValue.value).forEach { newValue ->
yield(indexedValue.copy(value = newValue))
}
}
}
}
ephemient
11/03/2020, 2:02 AMinline fun <T, R> Sequence<IndexedValue<T>>.mapValues(
crossinline transform: (T) -> R
): Sequence<IndexedValue<R>> = map { (i, v) -> IndexedValue(i, transform(v)) }
inline fun <T, R : Any> Sequence<IndexedValue<T>>.mapValuesNotNull(
crossinline transform: (T) -> R?
): Sequence<IndexedValue<R>> = mapNotNull { (i, v) ->
transform(v)?.let { IndexedValue(i, it) }
}
inline fun <T, R> Sequence<IndexedValue<T>>.flatMapValues(
crossinline transform: (T) -> Sequence<R>
): Sequence<IndexedValue<R>> = flatMap { (i, v) ->
transform(v).map { IndexedValue(i, it) }
}
ephemient
11/03/2020, 2:14 AMtransform: (T) -> T
ephemient
11/03/2020, 2:16 AM.withIndex()
.onEach { logLater(it) }
.mapValue { transform(it) }
Mark
11/03/2020, 2:20 AM