特定のタイプのフィールドを選択できるタイプクラスを作成しようとしています。これは私がこれまでにやっていることですが、コンパイラがSelector.Auxタイプ別にフィールドを選択
case class AddressKey(street: String, city: String)
trait AddressKeySelector[A] {
def addressKey(v: A): AddressKey
def addressKeyColumnName: String
}
object AddressKeySelector {
implicit def typeAddressKeySelector[A, Repr <: HList, K](
implicit gen: Generic.Aux[A, Repr],
reprSelector: Selector.Aux[Repr, K, AddressKey]): AddressKeySelector[A] =
new AddressKeySelector[A] {
override def addressKey(v: A): AddressKey = reprSelector(gen.to(v))
override def addressKeyColumnName: String = ???
}
}
を見つけることができない1つのみがある場合には、うまく動作するはずです。この
case class MyType(addressKeyField: AddressKey, otherField: String)
val data = MyType(AddressKey("addr", "city"), "other")
val addrKey = AddressKeySelector[MyType].addressKey(data)
// addrKey: AddressKey = AddressKey(addr,city)
val addrField = AddressKeySelector[MyType].addressKeyColumnName(data)
// addrField: String = addressKeyField
のように使用されますAddressKey型のフィールド。どのようにそれを実装する上の任意のアイデア?
SwapRecord型クラスは何をしていますか? – Mikel
'HList'の' FieldType [K、V] 'を' FieldType [V、K] 'に入れ替えます。 –
キーでのみ選択できます。したがって、キーと値を入れ替えると、値(キーになっている)を選択できます。 –