Вместо DatabaseIncomingThing
val updated: DatabaseIncomingThing =
genDatabase.from(structuralVersionOfIncomingThing + ('id ->> UUID.randomUUID()))
вы можете работать с необработанными HList
val updated1: FieldType[Witness.`'name`.T, String] :: FieldType[Witness.`'age`.T, Int] :: FieldType[Witness.`'id`.T, UUID] :: HNil =
structuralVersionOfIncomingThing + ('id ->> UUID.randomUUID())
val updated2: FieldType[Witness.`'name`.T, String] :: FieldType[Witness.`'age`.T, Int] :: HNil =
updated1 - 'id
На уровне типа
implicitly[Remover.Aux[FieldType[Witness.`'name`.T, String] :: FieldType[Witness.`'age`.T, Int] :: FieldType[Witness.`'id`.T, UUID] :: HNil,
Witness.`'id`.T,
(UUID, FieldType[Witness.`'name`.T, String] :: FieldType[Witness.`'age`.T, Int] :: HNil)]]
implicitly[Updater.Aux[
FieldType[Witness.`'name`.T, String] :: FieldType[Witness.`'age`.T, Int] :: HNil,
FieldType[Witness.`'id`.T, UUID],
FieldType[Witness.`'name`.T, String] :: FieldType[Witness.`'age`.T, Int] :: FieldType[Witness.`'id`.T, UUID] :: HNil]]
Выможете создать свой класс типов
trait WithoutField[A, K] {
type Out <: HList
}
object WithoutField {
type Aux[A, K, Out0 <: HList] = WithoutField[A, K] { type Out = Out0 }
def instance[A, K, Out0 <: HList]: Aux[A, K, Out0] = new WithoutField[A, K] { type Out = Out0 }
implicit def mkWithoutField[A, L <: HList, K, T, L1 <: HList](implicit
labelledGeneric: LabelledGeneric.Aux[A, L],
remover: Remover.Aux[L, K, (T, L1)]): Aux[A, K, L1] = instance
}
и использовать его
def foo[Out <: HList](implicit withoutField: WithoutField.Aux[DatabaseIncomingThing, Witness.`'id`.T, Out]) = {
// now you can use type Out inside
type IncomingThing = Out
???
}