简体   繁体   中英

HList(DValue[A], DValue[B]) to HList(A, B) at library level?

I'm building a data binding library, which has 3 fundamental classes

trait DValue[+T] {
  def get:T
}
class DField[T] extends DValue[T] {
  // allow writes + notifying observers
}
class DFunction[T](deps:DValue[_]*)(compute :=> T) extends DValue[T] {
  def get = compute // internally compute will use values in deps
}

However, in this approach, the definition of DFunction is not quite robust - it requires the user of DFunction to make sure all DValues used in compute are put into the 'deps' list. So I want the user to be able to do something like this:

val dvCount:DValue[Int] = DField(3)
val dvElement:DValue[String] = DField("Hello")
val myFunction = DFunction(dvCount, dvElement) { (count, element) => // compiler knows their type
  Range(count).map(_ => element).toSeq
}

As you can see when I'm constructing 'myFunction', the referenced fields and the usage is clearly mapped. I feel maybe HList would allow me to provide something at library level that'd allow this, but I cannot figure out how, would this be possible with HList? or there's something else that'd help achieve this?

shapeless.ops.hlist.Mapper allows you to do this with a Poly function.

Unfortunately the documentation on it isn't great; you might need to do some source diving to see how to use it

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM