Search code examples
scalashapeless

Shapeless HList appender


I'm trying to write a function that would append an HList, I found that Updater is the closest to what I want:

  def appender[L <: HList, V, Out <: HList](hl: L, k: Witness, v: V)(implicit updater: Updater.Aux[L, FieldType[k.T, V], Out]) : Out = {
    updater(hl, field[k.T](v))
  }

I have this function that updates and appends an HList, but I'd like to disable the update and only allow the function to append, so that:

val hl = 'field1 ->> 1 :: HNil
appender(hl, 'field2, 2) //should compile
appender(hl, 'field1, 2) //should fail

Currently both compile. Anyway I can express this constraint with Shapeless? I thought maybe possible to ask evidence that the Out type is one element longer than the in type?


Solution

  • Use shapeless.ops.record.LacksKey:

      def appender[L <: HList, V, Out <: HList](hl: L, k: Witness, v: V)(implicit
                                                                         updater: Updater.Aux[L, FieldType[k.T, V], Out],
                                                                         lk: LacksKey[L, k.T]) : Out = {
        updater(hl, field[k.T](v))
      }