arrow-fx / arrow.fx.typeclasses / Concurrent / Semaphore

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

Semaphore

Do you like Arrow?

Arrow Org
<