@@ -32,15 +32,27 @@ package org.typelevel.twiddles
3232
3333import cats .{Invariant , InvariantSemigroupal }
3434import cats .syntax .all ._
35+ import scala .compiletime .summonInline
3536
3637trait 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" )
90103final 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