Every
combines the powers of Traversal
and Fold
.
It can focus into a structure S
to see all its foci A
.
Every
can easily be created given a Traversal
and Fold
instance.
import arrow.optics.*
import arrow.optics.typeclasses.*
val every: Every<List<Int>, Int> = Every.from(Traversal.list<Int>(), Fold.list<Int>())
every.lastOrNull(listOf(1, 2, 3))
every.lastOrNull(emptyList())
Every
instancesArrow provides Every
instances for some common datatypes in Arrow and Kotlin Std. You can find them on the companion object of Every
.
You may create instances of Every
for your own datatypes, which you will be able to use as demonstrated in the example above.
This can be done by implementing both foldMap
and modify
yourself.
import arrow.typeclasses.Monoid
fun <A> PEvery.Companion.list(): Every<List<A>, A> = object : Every<List<A>, A> {
override fun <R> foldMap(M: Monoid<R>, s: List<A>, map: (A) -> R): R =
M.run { s.fold(empty()) { acc, a -> acc.combine(map(a)) } }
override fun modify(s: List<A>, map: (focus: A) -> A): List<A> =
s.map(map)
}
Do you like Arrow?
✖