Skip to content

Commit ecf93db

Browse files
authored
Merge pull request #4115 from armanbilge/topic/ref-mapk-constraint
Refactor `Ref#mapK` to take `Functor[G]` constraint instead of `Functor[F]`
2 parents 0600ea6 + 95f3d2f commit ecf93db

File tree

1 file changed

+28
-3
lines changed
  • kernel/shared/src/main/scala/cats/effect/kernel

1 file changed

+28
-3
lines changed

kernel/shared/src/main/scala/cats/effect/kernel/Ref.scala

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package effect
1919
package kernel
2020

2121
import cats.data.State
22-
import cats.effect.kernel.Ref.TransformedRef
22+
import cats.effect.kernel.Ref.{TransformedRef, TransformedRef2}
2323
import cats.syntax.all._
2424

2525
/**
@@ -186,8 +186,12 @@ abstract class Ref[F[_], A] extends RefSource[F, A] with RefSink[F, A] {
186186
/**
187187
* Modify the context `F` using transformation `f`.
188188
*/
189-
def mapK[G[_]](f: F ~> G)(implicit F: Functor[F]): Ref[G, A] =
190-
new TransformedRef(this, f)
189+
def mapK[G[_]](f: F ~> G)(implicit G: Functor[G], dummy: DummyImplicit): Ref[G, A] =
190+
new TransformedRef2(this, f)
191+
192+
@deprecated("Use mapK with Functor[G] constraint", "3.6.0")
193+
def mapK[G[_]](f: F ~> G, F: Functor[F]): Ref[G, A] =
194+
new TransformedRef(this, f)(F)
191195
}
192196

193197
object Ref {
@@ -361,6 +365,27 @@ object Ref {
361365
def empty[A: Monoid]: F[Ref[F, A]] = of(Monoid[A].empty)
362366
}
363367

368+
final private[kernel] class TransformedRef2[F[_], G[_], A](
369+
underlying: Ref[F, A],
370+
trans: F ~> G)(
371+
implicit G: Functor[G]
372+
) extends Ref[G, A] {
373+
override def get: G[A] = trans(underlying.get)
374+
override def set(a: A): G[Unit] = trans(underlying.set(a))
375+
override def getAndSet(a: A): G[A] = trans(underlying.getAndSet(a))
376+
override def tryUpdate(f: A => A): G[Boolean] = trans(underlying.tryUpdate(f))
377+
override def tryModify[B](f: A => (A, B)): G[Option[B]] = trans(underlying.tryModify(f))
378+
override def update(f: A => A): G[Unit] = trans(underlying.update(f))
379+
override def modify[B](f: A => (A, B)): G[B] = trans(underlying.modify(f))
380+
override def tryModifyState[B](state: State[A, B]): G[Option[B]] =
381+
trans(underlying.tryModifyState(state))
382+
override def modifyState[B](state: State[A, B]): G[B] = trans(underlying.modifyState(state))
383+
384+
override def access: G[(A, A => G[Boolean])] =
385+
G.compose[(A, *)].compose[A => *].map(trans(underlying.access))(trans(_))
386+
}
387+
388+
@deprecated("Use TransformedRef2 with Functor[G] constraint", "3.6.0")
364389
final private[kernel] class TransformedRef[F[_], G[_], A](
365390
underlying: Ref[F, A],
366391
trans: F ~> G)(

0 commit comments

Comments
 (0)