State
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 a type alias PriceLog
for MutableList<Tuple2<String, Double>>
. PriceLog
will be our State
representation; each step represented...