State is a structure that provides a functional approach for handling application state. State<S, A> is an abstraction over S -> Tuple2<S, A>. S represents the state type, and Tuple2<S, A> is the result, with S for the newly updated state and A for the function return.
We can start with a simple example, a function that returns two things, a price and the steps to calculate it. To calculate a price, we need to add VAT of 20% and apply a discount if the price value goes above some threshold:
import arrow.core.Tuple2
import arrow.core.toT
import arrow.data.State
typealias PriceLog = MutableList<Tuple2<String, Double>>
fun addVat(): State<PriceLog, Unit> = State { log: PriceLog ->
val (_, price) = log.last()
val vat = price * 0.2
log.add("Add VAT: $vat" toT price + vat)
log toT Unit
}
We have...