Skip to content

Commit 4682455

Browse files
committed
Fix ExprHKDGeneric sum impl
1 parent 0b82341 commit 4682455

File tree

2 files changed

+19
-24
lines changed

2 files changed

+19
-24
lines changed

dotty/derivation/src/main/scala/perspective/derivation/exprHkdGeneric.scala

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ object ExprHKDProductGeneric:
212212
private lazy val nameMap = namesArr.zipWithIndex.toMap
213213

214214
override def nameToIndex(name: Names): IdxWrapper[_ <: ElemTop] =
215-
IdxWrapper(Finite.unsafeApply(nameMap(name)))
215+
HKDGeneric.IdxWrapper(Finite.unsafeApply(nameMap(name)))
216216

217217
override type TupleRep = ElemTypes
218218

@@ -494,7 +494,6 @@ object ExprHKDProductGeneric:
494494

495495
trait ExprHKDSumGeneric[A] extends GenHKDSumGeneric[A] with ExprHKDGeneric[A]:
496496
type Cat[B] = Expr[Option[B]]
497-
type ElemTop <: A
498497

499498
/**
500499
* Returns the index of a value. Because of soundness, this method can not be
@@ -555,7 +554,6 @@ object ExprHKDSumGeneric:
555554
}
556555
}
557556

558-
/*
559557
transparent inline given derived[A](using q: Quotes, aType: Type[A]): ExprHKDSumGeneric[A] =
560558
Expr.summon[Mirror.SumOf[A]] match
561559
case Some('{
@@ -621,9 +619,11 @@ object ExprHKDSumGeneric:
621619
type Index[_] = Finite[typeLength.Length]
622620
type TypeName = Label
623621
type TupleRep = ElemTypes
622+
type ElemTop = A & Helpers.TupleUnion[TupleRep, Nothing]
624623
} = new ExprHKDSumGeneric[A]:
625624
override type Gen[F[_]] = ProductK[F, ElemTypes]
626625
override type Index[_] = Finite[typeLength.Length]
626+
override type ElemTop = A & Helpers.TupleUnion[TupleRep, Nothing]
627627

628628
override def genType: Type[Gen] = Type.of[Gen]
629629

@@ -643,7 +643,7 @@ object ExprHKDSumGeneric:
643643
private lazy val nameMap = namesArr.zipWithIndex.toMap
644644

645645
override def nameToIndex(name: Names): IdxWrapper[_ <: ElemTop] =
646-
IdxWrapper(Finite.unsafeApply(nameMap(name)))
646+
HKDGeneric.IdxWrapper(Finite.unsafeApply(nameMap(name)))
647647

648648
override type TupleRep = ElemTypes
649649

@@ -686,21 +686,15 @@ object ExprHKDSumGeneric:
686686
'{ $ret._2 }
687687

688688

689-
/*
690689
override def indexOf[X <: ElemTop: Type](x: Expr[X]): Expr[Index[X]] =
691690
'{ Finite.unsafeApply($m.ordinal($x)) }
692691

693692
override def indexOfA(a: Expr[A]): Expr[IdxWrapper[_ <: ElemTop]] =
694-
given Type[IdxWrapper] = Type.of[IdxWrapper]
695-
given Type[ElemTop] = Type.of[ElemTop]
696-
'{ new IdxWrapper(${ indexOf(a.asInstanceOf[Expr[ElemTop]]) }) }
693+
'{ new HKDGeneric.IdxWrapper[Index, ElemTop](Finite.unsafeApply($m.ordinal($a))) }
697694

698695
override def indexOfACasting(a: Expr[A]): IndexOfACasting[Index, ElemTop] =
699-
given Type[IdxWrapper] = Type.of[IdxWrapper]
700-
given Type[ElemTop] = Type.of[ElemTop]
701-
val idx = indexOfA(a)
702-
new IndexOfACasting.IndexOfACastingImpl[Index, ElemTop, ElemTop]('{ $idx.idx }, a.asInstanceOf[Expr[ElemTop]])
703-
*/
696+
val idx = '{ Finite.unsafeApply[typeLength.Length]($m.ordinal($a)) }
697+
new IndexOfACasting.IndexOfACastingImpl[Index, ElemTop, ElemTop](idx, a.asInstanceOf[Expr[ElemTop]])
704698

705699
extension [B[_]: Type](gen: Gen[B])
706700
override def traverseKExprId[D[_]: Type](f: B :~>: Compose2[Expr, D]): Expr[Gen[D]] =
@@ -749,5 +743,4 @@ object ExprHKDSumGeneric:
749743
ProductK.productKInstance[ElemTypes]
750744

751745
override val representable: BoundedRepresentableKC.Aux[Gen, Index] = instance
752-
override val traverse: TraverseKC[Gen] = instance
753-
*/
746+
override val traverse: TraverseKC[Gen] = instance

dotty/derivation/src/main/scala/perspective/derivation/hkdGeneric.scala

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)