2016-07-21 13 views
1

Ich habe folgende auf Filter:Scala: Wie Shapless hList basierend auf Labels

sealed trait baseData { 
    def weight: Int 
    def priority: Int 
} 

sealed trait moreData { 
    def weight: Int 
    def priority: Int 
    def t: String 
    def id: String 
} 

case class data1(override val weight: Int, override val priority: Int) extends baseData 
case class moreData1 (override val weight:Int, override val priority: Int, override val t: String, override val id: String)extends moreData 

Und bin Erzeugung HLists aus den Fallklassen als solche:

val h1 = LabelledGeneric[data1].to(data1(1,2)) 
val h2 = LabelledGeneric[moreData1].to(moreData1(3,4,"a","b")) 

Wie kann ich trimmen oder Filter h2 so dass es nur Felder enthält, die in h1 vorhanden sind? Ich spüre, ich brauche etwas von der Art val filtered = h2.foldRight(HNil)(keepFunc), aber ich konnte nicht herausfinden, wie man keepFunc schreibt. Irgendwelche Ideen?

Antwort

0

Sie könnten basierend auf den Schlüsseln filtern. Der Code ist nicht generisch, aber hoffentlich ausreichend, um das Konzept zu veranschaulichen.

val gen1 = LabelledGeneric[data1] 
val gen2 = LabelledGeneric[moreData1] 

val h1 = gen1.to(data1(1,2)) 
val h2 = gen2.to(moreData1(3,4,"a","b")) 

val keys1 = Keys[gen1.Repr].apply 
val keys2 = Keys[gen2.Repr].apply 

object pair extends Poly2 { 
    implicit def default[T, U] = at[T, U]((_, _)) 
} 

object keep extends Poly2 { 
    implicit def keepFunc[T, K, L <: HList] = 
    at[(T, K), L] { case ((t, key), l) => 
     if (keys1.toList.contains(key)) t :: l else l 
    } 
} 

val filtered = h2.zipWith(keys2)(pair).foldRight(HNil)(keep)