Je voudrais définir un LabelledGeneric
sans forme qui ignore un (ou plusieurs) champs lors de la conversion en HList
; lors de la conversion du HList
de nouveau il devrait substituer une valeur définie par l'utilisateur. Le but est de pouvoir écrire quelque chose comme ceci:Shapeless LabelledGeneric mais en ignorant certains champs
case class Foo(i: Int, s: String)
val foo = Foo(123, "Hello")
val gen = LabelledGeneric[Foo].ignoring('i)(defaultValue = -1)
val hlist = gen.to(foo)
// "Hello" :: HNil
val foo2 = gen.from(hlist)
assert(foo2 == Foo(-1, "Hello"))
C'est ce que j'ai jusqu'à présent. Il compile, mais je ne peux pas obtenir les types de s'aligner correctement pour la résolution implicite lorsque je tente de l'utiliser:
implicit class IgnoringOps[T](orig: LabelledGeneric[T]) {
def ignoring[Orig <: HList, V, Ign <: HList](k: Witness)(defaultValue: V)(implicit
gen: LabelledGeneric.Aux[T, Orig],
rem: Remover.Aux[Orig, FieldType[k.T, V], Ign],
upd: Updater.Aux[Ign, FieldType[k.T, V], Orig]): LabelledGeneric[T] = {
new LabelledGeneric[T] {
override type Repr = Ign
override def to(t: T): Ign = rem(gen.to(t))
override def from(r: Ign): T = gen.from(upd(r, field[k.T](defaultValue)))
}
}
}
Quelqu'un peut-il faire la lumière sur ce que je fais mal?
Aha! Il me manquait le 'Align' implicite, que j'avais oublié (j'ai tendance à penser à' record's comme Maps non ordonné, mais bien sûr l'ordre des choses quand vous reconstruisez l'instance de classe de cas). Je vous remercie :) –