@@ -23,13 +23,13 @@ trait GenHKDGeneric[A]:
2323 type ElemTop
2424
2525 /** A wrapper for [[Index ]] where we want wildcards of it. */
26- case class IdxWrapper [X ]( idx : Index [ X ])
26+ type IdxWrapper [X ] = HKDGeneric . IdxWrapper [ Index , X ]
2727 given [X ]: Conversion [IdxWrapper [X ], Index [X ]] = _.idx
28- given [X ]: Conversion [Index [X ], IdxWrapper [X ]] = IdxWrapper (_)
28+ given [X ]: Conversion [Index [X ], IdxWrapper [X ]] = HKDGeneric . IdxWrapper (_)
2929
3030 /** Upcast an index to its bound. */
3131 inline def upcastIndex [X ](idx : Index [X ]): IdxWrapper [_ <: ElemTop ] =
32- IdxWrapper (idx).asInstanceOf [IdxWrapper [_ <: ElemTop ]]
32+ HKDGeneric . IdxWrapper (idx).asInstanceOf [IdxWrapper [_ <: ElemTop ]]
3333
3434 /** The name of the [[A ]] type. */
3535 type TypeName <: String
@@ -117,6 +117,8 @@ object HKDGeneric:
117117 type Gen [B [_]] = Gen0 [B ]
118118 }
119119
120+ case class IdxWrapper [Index [_], X ](idx : Index [X ])
121+
120122 transparent inline given derived [A ](using m : Mirror .Of [A ], typeLength : TypeLength [A ])(
121123 using Finite .NotZero [typeLength.Length ] =:= true
122124 ): HKDGeneric [A ] = inline m match
@@ -270,7 +272,7 @@ object HKDProductGeneric:
270272
271273 private lazy val nameMap = namesArr.zipWithIndex.toMap
272274
273- override def nameToIndex (name : Names ): IdxWrapper [_ <: ElemTop ] = IdxWrapper (Finite .unsafeApply(nameMap(name)))
275+ override def nameToIndex (name : Names ): IdxWrapper [_ <: ElemTop ] = HKDGeneric . IdxWrapper (Finite .unsafeApply(nameMap(name)))
274276
275277 override type TupleRep = ElemTypes
276278 override def genToTuple [F [_]](gen : Gen [F ]): Helpers .TupleMap [TupleRep , F ] = gen.tuple
@@ -316,11 +318,9 @@ trait GenHKDSumGeneric[A] extends GenHKDGeneric[A]:
316318 * @tparam A
317319 * The type being abstracted over.
318320 */
319- trait HKDSumGeneric [A ] extends HKDGeneric [A ]:
321+ trait HKDSumGeneric [A ] extends HKDGeneric [A ] with GenHKDSumGeneric [ A ] :
320322 type Cat [B ] = Option [B ]
321323
322- override type ElemTop <: A
323-
324324 /**
325325 * Returns the index of a value. Because of soundness, this method can not be
326326 * used if X = A. In that case, use [[indexOfA ]] instead.
@@ -358,7 +358,7 @@ trait HKDSumGeneric[A] extends HKDGeneric[A]:
358358 ) { a =>
359359 val index = indexOf((a : A ).asInstanceOf [ElemTop ])
360360 // This cast is safe as we know A = Z
361- representable.tabulateK([Z ] => (i : Index [Z ]) => if i == index.idx then Some ((a : A ).asInstanceOf [Z ]) else None )
361+ representable.tabulateK([Z ] => (i : Index [Z ]) => if i == index then Some ((a : A ).asInstanceOf [Z ]) else None )
362362 }
363363
364364 /**
@@ -426,10 +426,12 @@ object HKDSumGeneric:
426426 type Gen [F [_]] = ProductK [F , TupleRep ]
427427 type Index [_] = Finite [typeLength.Length ]
428428 type TypeName = Label
429+ type ElemTop = A & Helpers .TupleUnion [TupleRep , Nothing ]
429430 } =
430431 new HKDSumGeneric [A ]:
431432 type Gen [F [_]] = ProductK [F , TupleRep ]
432433 type Index [_] = Finite [typeLength.Length ]
434+ type ElemTop = A & Helpers .TupleUnion [TupleRep , Nothing ]
433435
434436 override type TypeName = Label
435437 override def typeName : TypeName = label
@@ -441,7 +443,7 @@ object HKDSumGeneric:
441443
442444 private lazy val nameMap = namesArr.zipWithIndex.toMap
443445
444- override def nameToIndex (name : Names ): IdxWrapper [_ <: ElemTop ] = IdxWrapper (Finite .unsafeApply(nameMap(name)))
446+ override def nameToIndex (name : Names ): IdxWrapper [_ <: ElemTop ] = HKDGeneric . IdxWrapper (Finite .unsafeApply(nameMap(name)))
445447
446448 override def indexOf [X <: ElemTop ](x : X ): Index [X ] = Finite (typeLength.length, m.ordinal(x))
447449
0 commit comments