ubu
06/01/2021, 2:08 PMabstract val property):
@optics
sealed class TestArrow {
abstract val isSelected : Boolean
companion object {}
@optics
data class Test1(override val isSelected: Boolean, val fooBar1: String) : TestArrow() {
companion object {}
}
@optics
data class Test2(override val isSelected: Boolean, val fooBar1: String) : TestArrow() {
companion object {}
}
@optics
data class Test3(override val isSelected: Boolean, val fooBar1: String) : TestArrow() {
companion object {}
}
}
fun TestArrow.updateSelected(isSelected: Boolean) : TestArrow {
return when(this) {
is TestArrow.Test1 -> this.copy(isSelected = isSelected)
is TestArrow.Test2 -> this.copy(isSelected = isSelected)
is TestArrow.Test3 -> this.copy(isSelected = isSelected)
}
}
Any help will be very appreciatedsimon.vergauwen
06/01/2021, 4:57 PMLens to update a common value in a sealed class but it's not yet supported by the @optics generator.
There is a ticket for it, which has been open for quite some time, but we're waiting until we can replace kapt by a MPP meta solution. Which is expected soon-ish.
You can however easily manually write a optic for it:
val isSelectedLens: Lens<TestArrow, Boolean> =
Lens(
get = { it.isSelected },
set = {
when(it) {
is TestArrow.Test1 -> this.copy(isSelected = isSelected)
is TestArrow.Test2 -> this.copy(isSelected = isSelected)
is TestArrow.Test3 -> this.copy(isSelected = isSelected)
}
}
)simon.vergauwen
06/01/2021, 4:58 PMubu
06/01/2021, 7:01 PMubu
06/01/2021, 7:31 PMTestArrow class. Could you elaborate on that?simon.vergauwen
06/03/2021, 7:52 AMTestArrow can be done with isSelectedLens in the following manners.
val value: TestArrow = ...
isSelectedLenes.modify(value) { boolean -> !boolean } // There is also `get`, `set`, etc
Or when nested in other types
val values: List<TestArrow> = ...
(Every.list<TestArrow>() compose isSelectedLens).modify(values) { bool -> !bool } // Modifies *all* TestArrow in the listsimon.vergauwen
06/03/2021, 7:56 AM@optics always generates optics for all values independenly.
You could however create a: Lens<TestArrow, Pair<Boolean, String>> which also updates the foobar properties even though it's not a shared value in TestArrow.
val isSelectedLens: Lens<TestArrow, Boolean> =
Lens(
get = {
when(it) {
is TestArrow.Test1 -> Pair(isSelected, foobar1)
is TestArrow.Test2 -> Pair(isSelected, foobar1)
is TestArrow.Test3 -> Pair(isSelected, foobar1)
} },
set = { value, (isSelected, foobar1) ->
when(value) {
is TestArrow.Test1 -> value.copy(isSelected = isSelected, foobar1= foobar1)
is TestArrow.Test2 -> value.copy(isSelected = isSelected, foobar1= foobar1)
is TestArrow.Test3 -> value.copy(isSelected = isSelected, foobar1= foobar1)
}
}
)
Which then could be used in the same manner as the other Lens above.simon.vergauwen
06/03/2021, 7:56 AM