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 list
simon.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