Skip to content

Commit 87eac9c

Browse files
committed
Rewrite to method as an extension method
1 parent 1de80bb commit 87eac9c

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

core/shared/src/main/scala-3/org/typelevel/twiddles/Twiddles.scala

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,27 @@ package org.typelevel.twiddles
3232

3333
import cats.{Invariant, InvariantSemigroupal}
3434
import cats.syntax.all._
35+
import scala.compiletime.summonInline
3536

3637
trait TwiddleSyntax[F[_]]:
3738

3839
implicit def toTwiddleOpCons[B <: Tuple](fb: F[B]): TwiddleOpCons[F, B] = new TwiddleOpCons(
3940
fb
4041
)
42+
4143
implicit def toTwiddleOpTwo[B](fb: F[B]): TwiddleOpTwo[F, B] = new TwiddleOpTwo(fb)
4244

43-
implicit def toTwiddleOpTo[A](fa: F[A]): TwiddleOpTo[F, A] = new TwiddleOpTo(fa)
45+
extension [A](fa: F[A])
46+
inline def to[B]: F[B] =
47+
// Note: defining these as context params results in inference issues
48+
// See https://github.com/typelevel/twiddles/issues/19 and fix
49+
// https://github.com/typelevel/twiddles/issues/10#issuecomment-2833403842
50+
val iso = summonInline[Iso[A, B]]
51+
val F = summonInline[Invariant[F]]
52+
F.imap(fa)(iso.to)(iso.from)
53+
54+
@deprecated("1.0", "No lnoger needed")
55+
def toTwiddleOpTo[A](fa: F[A]): TwiddleOpTo[F, A] = new TwiddleOpTo(fa)
4456

4557
extension [A <: Tuple](fa: F[A])
4658
inline def dropUnits(using Invariant[F]): F[DropUnits[A]] =
@@ -87,5 +99,6 @@ final class TwiddleOpTwo[F[_], B](private val self: F[B]) extends AnyVal:
8799
case a *: b *: EmptyTuple => (a, b)
88100
}
89101

102+
@deprecated("1.0", "No longer needed")
90103
final class TwiddleOpTo[F[_], A](private val self: F[A]) extends AnyVal:
91104
def to[B](implicit iso: Iso[A, B], F: Invariant[F]): F[B] = self.imap(iso.to)(iso.from)

0 commit comments

Comments
 (0)