Skip to content

Instantly share code, notes, and snippets.

@ChristopherDavenport
Created March 11, 2021 20:49
Show Gist options
  • Select an option

  • Save ChristopherDavenport/d7bd0c82df4f1a46e40a8cb0ae326c79 to your computer and use it in GitHub Desktop.

Select an option

Save ChristopherDavenport/d7bd0c82df4f1a46e40a8cb0ae326c79 to your computer and use it in GitHub Desktop.
Wrapping Read-Write Lock
import cats.effect._
trait Lock[F[_]]{
def lock: F[Unit]
def unlock: F[Unit]
}
object Lock {
def fromLock[F[_]: Sync](jlock: java.util.concurrent.locks.Lock): Lock[F] = new Lock[F]{
def lock: F[Unit] = Sync[F].blocking(jlock.lockInterruptibly())
def unlock: F[Unit] = Sync[F].blocking(jlock.unlock())
}
}
trait ReadWriteLock[F[_]]{
def readLock: Lock[F]
def writeLock: Lock[F]
}
object ReadWriteLock {
def impl[F[_]: Sync](jlock: java.util.concurrent.locks.ReadWriteLock): ReadWriteLock[F] =
new ReadWriteLock[F] {
def readLock: Lock[F] = Lock.fromLock(jlock.readLock())
def writeLock: Lock[F] = Lock.fromLock(jlock.writeLock())
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment