Mikel San Vicente
Mikel San Vicente

Reputation: 3863

Extract type of labelled generic column

I have the following case class

case class Test(field1: Int, field2: String)

I want to be able to have a method that for a column name it can map that value to other, I want it to be typesafe meaning that the funtion f should accept the same type as the symbol K

def mapColumn[A, K, KV, Repr <: HList, Out](obj: A, witness: Witness.Aux[K], f: KV => Out) 
  (implicit mkLens: MkFieldLens[A, K], 
    gen: LabelledGeneric.Aux[A, Repr]): Out = ??? 

How can I make that KV is of the type of the symbol K?

For example

mapColumn(Test(1, "hello"), 'field1, (v: Int) => v + 1) // this should retrieve 2
mapColumn(Test(1, "hello"), 'field2, (v:String) => v + 1) // this should retrieve "hello1"
mapColumn(Test(1, "hello"), 'field2, (v: Int) => v + 1) // this should be a compilation error

Upvotes: 0

Views: 106

Answers (1)

Mikel San Vicente
Mikel San Vicente

Reputation: 3863

I've found the way

def mapColumn[A, K, KV, Repr <: HList, Out](obj: A, witness: Witness.Aux[K], f: KV => Out) 
    (implicit mkLens: MkFieldLens[A, K], 
     gen: LabelledGeneric.Aux[A, Repr],
     fieldTypesRest: Selector.Aux[Repr, K, KV]): Out = ???

Upvotes: 2

Related Questions