- 
                Notifications
    You must be signed in to change notification settings 
- Fork 1.1k
Closed
Labels
Description
import Tuple.{ Head, Tail }
trait Idnt[T1 <: Tuple] {
  type Res <: Tuple
  extension (t1: T1) def idnt: Res
}
type Aux[T1 <: Tuple, Res0] = Idnt[T1] { type Res = Res0 }
given [T1 <: NonEmptyTuple, TZ <: Tuple](using Aux[Tail[T1], TZ]) : Aux[T1, Head[T1] *: TZ] = new Idnt[T1] {
  type Res = Head[T1] *: TZ
  extension (t1: T1) def idnt: Res = t1.head *: t1.tail.idnt
}
given Aux[Unit, Unit] = new Idnt[Unit] {
  type Res = Unit
  extension (t1: Unit) def idnt: Unit = ()
}
val x: (1, 2, 3) = (1, 2, 3)
val z: (1, 2, 3) = x.idntSays:
-- [E008] Member Not Found Error: ../pg/Main.scala:23:21 -----------------------
23 |val z: (1, 2, 3) = x.idnt
   |                   ^^^^^^
   |value idnt is not a member of (Int(1), Int(2), Int(3)) - did you mean x._1?.
   |An extension method was tried, but could not be fully constructed:
   |
   |    Main$package.Aux_T1_Head_given[(Int(1), Int(2), Int(3)), Tuple](
   |      Main$package.Aux_T1_Head_given[T1, TZ]
   |    ).idnt()
one error foundBut:
import Tuple.{ Head, Tail }
trait Idnt[T1 <: Tuple] {
  type Res <: Tuple
  def (t1: T1) idnt: Res
}
type Aux[T1 <: Tuple, Res0] = Idnt[T1] { type Res = Res0 }
given [T1 <: NonEmptyTuple] as Aux[T1, Head[T1] *: Tail[T1]]
  = new Idnt[T1] {
  type Res = Head[T1] *: Tail[T1]
  def (t1: T1) idnt: Res = t1.head *: t1.tail
}
given as Aux[Unit, Unit] = new Idnt[Unit] {
  type Res = Unit
  def (t1: Unit) idnt: Unit = ()
}
val x: (1, 2, 3) = (1, 2, 3)
val z: (1, 2, 3) = x.idntWorks. My gut feeling tells me it is related to #7049 and #7050.