arrow-fx / arrow.fx.typeclasses / Concurrent / Semaphore
open fun Semaphore(n:
Long
): Kind<F,
Semaphore
<F>>
Create a pure Semaphore that can be used to control access in a concurrent system.
import arrow.Kind
import arrow.fx.*
import arrow.fx.extensions.io.concurrent.concurrent
import arrow.fx.typeclasses.Concurrent
fun main(args: Array<String>) {
fun <F> Concurrent<F>.promiseExample(): Kind<F, Unit> =
//sampleStart
fx.concurrent {
val semaphore = !Semaphore(4)
!semaphore.acquireN(4)
val left = !semaphore.available()
!effect { println("There are $left permits left") }
!semaphore.withPermit(effect { println("Fork & wait until permits become available") }).fork()
!effect { println("Making permit available") }
.followedBy(semaphore.releaseN(4))
}
//sampleEnd
IO.concurrent().promiseExample()
.fix().unsafeRunSync()
}
See Also
Do you like Arrow?
✖