@@ -39,24 +39,22 @@ object typeclasses {
39
39
case eq : Eq [TT ] => eq.eql(x, y)
40
40
}
41
41
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 =
43
43
inline erasedValue[Elems ] match {
44
44
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] ) &&
46
46
eqlElems[elems1](n + 1 )(x, y)
47
47
case _ : EmptyTuple =>
48
48
true
49
49
}
50
50
51
- inline def eqlProduct [T ](m : Mirror .ProductOf [T ])(x : Any , y : Any ): Boolean =
52
- eqlElems[m.MirroredElemTypes ](0 )(x, y)
53
-
54
51
inline def eqlCases [Alts ](n : Int )(x : Any , y : Any , ord : Int ): Boolean =
55
52
inline erasedValue[Alts ] match {
56
53
case _ : (alt *: alts1) =>
57
54
if (ord == n)
58
55
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 ])
60
58
}
61
59
else eqlCases[alts1](n + 1 )(x, y, ord)
62
60
case _ : EmptyTuple =>
@@ -70,7 +68,7 @@ object typeclasses {
70
68
val ord = m.ordinal(x)
71
69
ord == m.ordinal(y) && eqlCases[m.MirroredElemTypes ](0 )(x, y, ord)
72
70
case m : Mirror .ProductOf [T ] =>
73
- eqlElems[m.MirroredElemTypes ](0 )(x, y)
71
+ eqlElems[m.MirroredElemTypes ](0 )(x. asInstanceOf [ Product ] , y. asInstanceOf [ Product ] )
74
72
}
75
73
}
76
74
@@ -96,10 +94,10 @@ object typeclasses {
96
94
case pkl : Pickler [T ] => pkl.pickle(buf, x)
97
95
}
98
96
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 =
100
98
inline erasedValue[Elems ] match {
101
99
case _ : (elem *: elems1) =>
102
- tryPickle[elem](buf, productElement[elem](x, n) )
100
+ tryPickle[elem](buf, x. productElement(n). asInstanceOf [elem] )
103
101
pickleElems[elems1](n + 1 )(buf, x)
104
102
case _ : EmptyTuple =>
105
103
}
@@ -109,7 +107,7 @@ object typeclasses {
109
107
case _ : (alt *: alts1) =>
110
108
if (ord == n)
111
109
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 ] )
113
111
}
114
112
else pickleCases[alts1](n + 1 )(buf, x, ord)
115
113
case _ : EmptyTuple =>
@@ -119,22 +117,26 @@ object typeclasses {
119
117
case pkl : Pickler [T ] => pkl.unpickle(buf)
120
118
}
121
119
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 =
123
121
inline erasedValue[Elems ] match {
124
122
case _ : (elem *: elems1) =>
125
- elems(n) = tryUnpickle[elem](buf). asInstanceOf [ AnyRef ]
123
+ elems(n) = tryUnpickle[elem](buf)
126
124
unpickleElems[elems1](n + 1 )(buf, elems)
127
125
case _ : EmptyTuple =>
128
126
}
129
127
130
128
inline def unpickleCase [T , Elems <: Tuple ](buf : mutable.ListBuffer [Int ], m : Mirror .ProductOf [T ]): T = {
131
129
inline val size = constValue[Tuple .Size [Elems ]]
132
130
inline if (size == 0 )
133
- m.fromProduct(EmptyProduct )
131
+ m.fromProduct(EmptyTuple )
134
132
else {
135
- val elems = new ArrayProduct (size)
133
+ val elems = new Array [ Any ] (size)
136
134
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
+ })
138
140
}
139
141
}
140
142
@@ -159,7 +161,7 @@ object typeclasses {
159
161
buf += ord
160
162
pickleCases[m.MirroredElemTypes ](0 )(buf, x, ord)
161
163
case m : Mirror .ProductOf [T ] =>
162
- pickleElems[m.MirroredElemTypes ](0 )(buf, x)
164
+ pickleElems[m.MirroredElemTypes ](0 )(buf, x. asInstanceOf [ Product ] )
163
165
}
164
166
def unpickle (buf : mutable.ListBuffer [Int ]): T =
165
167
inline ev match {
@@ -188,13 +190,13 @@ object typeclasses {
188
190
189
191
inline def tryShow [T ](x : T ): String = summonInline[Show [T ]].show(x)
190
192
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 ] =
192
194
inline erasedValue[Elems ] match {
193
195
case _ : (elem *: elems1) =>
194
196
inline erasedValue[Labels ] match {
195
197
case _ : (label *: labels1) =>
196
198
val formal = constValue[label]
197
- val actual = tryShow(productElement[elem](x, n) )
199
+ val actual = tryShow(x. productElement(n). asInstanceOf [elem] )
198
200
s " $formal = $actual" :: showElems[elems1, labels1](n + 1 )(x)
199
201
}
200
202
case _ : EmptyTuple =>
@@ -205,7 +207,7 @@ object typeclasses {
205
207
val label = constValue[m.MirroredLabel ]
206
208
inline m match {
207
209
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( " , " , " , " )" )
209
211
}
210
212
}
211
213
0 commit comments