2016-07-21 3 views
1

я следующее:Scala: Как фильтр Shapless HList основан на наклейках

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 

И я генерации HLists из классов случаев, как, например:

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

Как можно обрезать или фильтровать h2 так что он содержит только поля, присутствующие в h1? Я чувствую, что мне нужно что-то вроде val filtered = h2.foldRight(HNil)(keepFunc), но не смогли выяснить, как писать keepFunc. Есть идеи?

ответ

0

Вы можете фильтровать на основе ключей. Код не является общим, но, надеюсь, достаточным для иллюстрации концепции.

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) 
Смежные вопросы