Стрелка в настоящее время не предоставляет такой функциональности, но вы можете легко написать общее решение самостоятельно.
Фрагмент ниже демонстрирует, как его можно достичь, вы можете добавить дополнительные методы для компоновки от Lens<S, Tuple2<FA, FB>>
до Lens<S, Tuple3<FA, FB, FC>>
и т. д.
@optics data class Char(val name: String, val health: Int) {
companion object
}
infix fun <S, FA, FB> Lens<S, FA>.aside(other: Lens<S, FB>): Lens<S, Tuple2<FA, FB>> = object : Lens<S, Tuple2<FA, FB>> {
override fun get(s: S): Tuple2<FA, FB> = Tuple2(this@aside.get(s), other.get(s))
override fun set(s: S, b: Tuple2<FA, FB>): S = other.set(this@aside.set(s, b.a), b.b)
}
fun main() {
val original = Char("", 0)
val charName: Lens<Char, String> = Char.name
val charHealth: Lens<Char, Int> = Char.health
val charNameAndHealth: Lens<Char, Tuple2<String, Int>> = charName.aside(charHealth)
charNameAndHealth.modify(original) { Tuple2("Test", 30) }
}