Immutable data
At the very beginning of this book, back in Chapter 1, Getting Started with Kotlin, we mentioned how Kotlin favors immutability with the values over variables and immutable collections being the default. But the Arrow library takes this concept even further with its Optics module.
In order to work with the Optics library, we need to add the following dependency to our project:
implementation("io.arrow-kt:arrow-optics:1.2.1")
When discussing data classes in Chapter 2, Working with Creational Patterns, we mentioned that they have a copy method, which is undoubtedly useful for keeping immutable state but may be slightly cumbersome if we wanted to change deeply nested structures.
Let’s take the following example. We have a box of donuts that contains just a list of already familiar donuts:
data class DonutBoxOptics(val donuts: List<Donut>)
val donutBox = DonutBoxOptics(
listOf(
Donut("Gianduja Chocolate &...