@@ -39,24 +39,22 @@ object typeclasses {
3939 case eq : Eq [TT ] => eq.eql(x, y)
4040 }
4141
42- inline def eqlElems [Elems <: Tuple ](n : Int )(x : Any , y : Any ): Boolean =
42+ inline def eqlElems [Elems <: Tuple ](n : Int )(x : Product , y : Product ): Boolean =
4343 inline erasedValue[Elems ] match {
4444 case _ : (elem *: elems1) =>
45- tryEql[elem](productElement[elem](x, n), productElement [elem](y, n) ) &&
45+ tryEql[elem](x. productElement(n). asInstanceOf [elem], y.productElement(n). asInstanceOf [elem] ) &&
4646 eqlElems[elems1](n + 1 )(x, y)
4747 case _ : EmptyTuple =>
4848 true
4949 }
5050
51- inline def eqlProduct [T ](m : Mirror .ProductOf [T ])(x : Any , y : Any ): Boolean =
52- eqlElems[m.MirroredElemTypes ](0 )(x, y)
53-
5451 inline def eqlCases [Alts ](n : Int )(x : Any , y : Any , ord : Int ): Boolean =
5552 inline erasedValue[Alts ] match {
5653 case _ : (alt *: alts1) =>
5754 if (ord == n)
5855 summonFrom {
59- case m : Mirror .ProductOf [`alt`] => eqlElems[m.MirroredElemTypes ](0 )(x, y)
56+ case m : Mirror .ProductOf [`alt`] =>
57+ eqlElems[m.MirroredElemTypes ](0 )(x.asInstanceOf [Product ], y.asInstanceOf [Product ])
6058 }
6159 else eqlCases[alts1](n + 1 )(x, y, ord)
6260 case _ : EmptyTuple =>
@@ -70,7 +68,7 @@ object typeclasses {
7068 val ord = m.ordinal(x)
7169 ord == m.ordinal(y) && eqlCases[m.MirroredElemTypes ](0 )(x, y, ord)
7270 case m : Mirror .ProductOf [T ] =>
73- eqlElems[m.MirroredElemTypes ](0 )(x, y)
71+ eqlElems[m.MirroredElemTypes ](0 )(x. asInstanceOf [ Product ] , y. asInstanceOf [ Product ] )
7472 }
7573 }
7674
@@ -96,10 +94,10 @@ object typeclasses {
9694 case pkl : Pickler [T ] => pkl.pickle(buf, x)
9795 }
9896
99- inline def pickleElems [Elems <: Tuple ](n : Int )(buf : mutable.ListBuffer [Int ], x : Any ): Unit =
97+ inline def pickleElems [Elems <: Tuple ](n : Int )(buf : mutable.ListBuffer [Int ], x : Product ): Unit =
10098 inline erasedValue[Elems ] match {
10199 case _ : (elem *: elems1) =>
102- tryPickle[elem](buf, productElement[elem](x, n) )
100+ tryPickle[elem](buf, x. productElement(n). asInstanceOf [elem] )
103101 pickleElems[elems1](n + 1 )(buf, x)
104102 case _ : EmptyTuple =>
105103 }
@@ -109,7 +107,7 @@ object typeclasses {
109107 case _ : (alt *: alts1) =>
110108 if (ord == n)
111109 summonFrom {
112- case m : Mirror .ProductOf [`alt`] => pickleElems[m.MirroredElemTypes ](0 )(buf, x)
110+ case m : Mirror .ProductOf [`alt`] => pickleElems[m.MirroredElemTypes ](0 )(buf, x. asInstanceOf [ Product ] )
113111 }
114112 else pickleCases[alts1](n + 1 )(buf, x, ord)
115113 case _ : EmptyTuple =>
@@ -119,22 +117,26 @@ object typeclasses {
119117 case pkl : Pickler [T ] => pkl.unpickle(buf)
120118 }
121119
122- inline def unpickleElems [Elems <: Tuple ](n : Int )(buf : mutable.ListBuffer [Int ], elems : ArrayProduct ): Unit =
120+ inline def unpickleElems [Elems <: Tuple ](n : Int )(buf : mutable.ListBuffer [Int ], elems : Array [ Any ] ): Unit =
123121 inline erasedValue[Elems ] match {
124122 case _ : (elem *: elems1) =>
125- elems(n) = tryUnpickle[elem](buf). asInstanceOf [ AnyRef ]
123+ elems(n) = tryUnpickle[elem](buf)
126124 unpickleElems[elems1](n + 1 )(buf, elems)
127125 case _ : EmptyTuple =>
128126 }
129127
130128 inline def unpickleCase [T , Elems <: Tuple ](buf : mutable.ListBuffer [Int ], m : Mirror .ProductOf [T ]): T = {
131129 inline val size = constValue[Tuple .Size [Elems ]]
132130 inline if (size == 0 )
133- m.fromProduct(EmptyProduct )
131+ m.fromProduct(EmptyTuple )
134132 else {
135- val elems = new ArrayProduct (size)
133+ val elems = new Array [ Any ] (size)
136134 unpickleElems[Elems ](0 )(buf, elems)
137- m.fromProduct(elems)
135+ m.fromProduct(new Product {
136+ def canEqual (that : Any ): Boolean = true
137+ def productArity : Int = size
138+ def productElement (idx : Int ): Any = elems(idx)
139+ })
138140 }
139141 }
140142
@@ -159,7 +161,7 @@ object typeclasses {
159161 buf += ord
160162 pickleCases[m.MirroredElemTypes ](0 )(buf, x, ord)
161163 case m : Mirror .ProductOf [T ] =>
162- pickleElems[m.MirroredElemTypes ](0 )(buf, x)
164+ pickleElems[m.MirroredElemTypes ](0 )(buf, x. asInstanceOf [ Product ] )
163165 }
164166 def unpickle (buf : mutable.ListBuffer [Int ]): T =
165167 inline ev match {
@@ -188,13 +190,13 @@ object typeclasses {
188190
189191 inline def tryShow [T ](x : T ): String = summonInline[Show [T ]].show(x)
190192
191- inline def showElems [Elems <: Tuple , Labels <: Tuple ](n : Int )(x : Any ): List [String ] =
193+ inline def showElems [Elems <: Tuple , Labels <: Tuple ](n : Int )(x : Product ): List [String ] =
192194 inline erasedValue[Elems ] match {
193195 case _ : (elem *: elems1) =>
194196 inline erasedValue[Labels ] match {
195197 case _ : (label *: labels1) =>
196198 val formal = constValue[label]
197- val actual = tryShow(productElement[elem](x, n) )
199+ val actual = tryShow(x. productElement(n). asInstanceOf [elem] )
198200 s " $formal = $actual" :: showElems[elems1, labels1](n + 1 )(x)
199201 }
200202 case _ : EmptyTuple =>
@@ -205,7 +207,7 @@ object typeclasses {
205207 val label = constValue[m.MirroredLabel ]
206208 inline m match {
207209 case m : Mirror .Singleton => label
208- case _ => showElems[m.MirroredElemTypes , m.MirroredElemLabels ](0 )(x).mkString(s " $label( " , " , " , " )" )
210+ case _ => showElems[m.MirroredElemTypes , m.MirroredElemLabels ](0 )(x. asInstanceOf [ Product ] ).mkString(s " $label( " , " , " , " )" )
209211 }
210212 }
211213
0 commit comments