Skip to content

Instantly share code, notes, and snippets.

@ChristopherDavenport
Created June 23, 2021 22:54
Show Gist options
  • Save ChristopherDavenport/fac5adaeffd8a47d1a64c089b1951a36 to your computer and use it in GitHub Desktop.
Save ChristopherDavenport/fac5adaeffd8a47d1a64c089b1951a36 to your computer and use it in GitHub Desktop.
CE3 FiberLocal
import cats.effect._
trait FiberLocal[F[_], A]{
def get: F[A]
def set(value: A): F[Unit]
def reset: F[Unit]
def update(f: A => A): F[Unit]
def modify[B](f: A => (A, B)): F[B]
def getAndSet(value: A): F[A]
def getAndReset: F[A]
}
trait FiberLocalGen[F[_]]{
def create[A](default: A): F[FiberLocal[F, A]]
}
object FiberLocalGen {
def apply[F[_]](implicit ev1: FiberLocalGen[F]): ev1.type = ev1
class IOFiberLocal[F[_], A](private val ioLocal: IOLocal[A]) extends FiberLocal[IO, A]{
def get: IO[A] = ioLocal.get
def set(value: A): IO[Unit] = ioLocal.set(value)
def reset: IO[Unit] = ioLocal.reset
def update(f: A => A): IO[Unit] = ioLocal.update(f)
def modify[B](f: A => (A, B)): IO[B] = ioLocal.modify(f)
def getAndSet(value: A): IO[A] = ioLocal.getAndSet(value)
def getAndReset: IO[A] = ioLocal.getAndReset
}
implicit val io: FiberLocalGen[IO] = new FiberLocalGen[IO]{
def create[A](default: A): IO[FiberLocal[IO, A]] = IOLocal(default).map(new IOFiberLocal(_))
}
}
import cats.effect.unsafe.implicits._
@main def example =
FiberLocalGen[IO].create("Initial").flatMap{local =>
local.set("Aha!") >>
local.get.flatMap(a => IO(println(a)))
}.unsafeRunSync()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment