TSemaphore
A convenience implementation of a semaphore in the Txn monad, built on top of
TVar.
import cats.effect.IO
import cats.effect.unsafe.implicits.global
import io.github.timwspence.cats.stm.STM
val stm = STM.runtime[IO].unsafeRunSync()
// stm: STM[IO] = io.github.timwspence.cats.stm.STM$Make$$anon$1$$anon$2@61a90b49
import stm._
val txn: Txn[Long] = for {
tsem <- TSemaphore.make(1)
_ <- tsem.acquire
zero <- tsem.available
_ <- tsem.release
} yield zero
// txn: Txn[Long] = Bind(
// txn = Bind(
// txn = Alloc(
// v = Delay(
// thunk = cats.effect.IO$$$Lambda$10430/0x0000000802e05840@40cace72,
// event = cats.effect.tracing.TracingEvent$StackTrace
// )
// ),
// f = scala.Function1$$Lambda$10502/0x0000000802ede840@5dbd149d
// ),
// f = <function1>
// )
val result = stm.commit(txn).unsafeRunSync()
// result: Long = 0L