¿Cómo usar las tablas mapeadas de Slick con claves externas?

Estoy luchando con las tablas de incrustación y mapeado de Slick. La API me parece extraña, tal vez solo porque está estructurada de una manera que no me resulta familiar.

Quiero construir una tarea / lista de tareas. Hay dos entidades:

Tarea: Cada tarea tiene una referencia opcional a la tarea siguiente. De esa manera se construye una lista enlazada. La intención es que el usuario pueda ordenar las tareas por su prioridad. Este orden está representado por las referencias de tarea a tarea.

Lista de tareas: representa una lista de tareas con una etiqueta y una referencia a la primera tarea de la lista.

case class Task(id: Option[Long], title: String, nextTask: Option[Task])
case class TaskList(label: String, firstTask: Option[Task])

Ahora intenté escribir un objeto de acceso a datos (DAO) para estas dos entidades.

import scala.slick.driver.H2Driver.simple._
import slick.lifted.MappedTypeMapper

implicit val session: Session = Database.threadLocalSession
val queryById = Tasks.createFinderBy( t => t.id )

def task(id: Long): Option[Task] = queryById(id).firstOption

  private object Tasks extends Table[Task]("TASKS") {
    def id = column[Long]("ID", O.PrimaryKey, O.AutoInc)
    def title = column[String]("TITLE")
    def nextTaskId = column[Option[Long]]("NEXT_TASK_ID")
    def nextTask = foreignKey("NEXT_TASK_FK", nextTaskId, Tasks)(_.id)
    def * = id ~ title ~ nextTask <> (Task, Task.unapply _)
  }

  private object TaskLists extends Table[TaskList]("TASKLISTS") {
    def label = column[String]("LABEL", O.PrimaryKey)
    def firstTaskId = column[Option[Long]]("FIRST_TASK_ID")
    def firstTask = foreignKey("FIRST_TASK_FK", firstTaskId, Tasks)(_.id)
    def * = label ~ firstTask <> (Task, Task.unapply _)
  }

Lamentablemente no se compila. Los problemas estan en el* proyección de ambas mesas ennextTask respectivofirstTask.

could not find implicit value for evidence parameter of type scala.slick.lifted.TypeMapper[scala.slick.lifted.ForeignKeyQuery[SlickTaskRepository.this.Tasks.type,justf0rfun.bookmark.model.Task]]could not find implicit value for evidence parameter of type scala.slick.lifted.TypeMapper[scala.slick.lifted.ForeignKeyQuery[SlickTaskRepository.this.Tasks.type,justf0rfun.bookmark.model.Task]]

Traté de resolver eso con el siguiente TypeMapper pero eso no compila, también.

  implicit val taskMapper = MappedTypeMapper.base[Option[Long], Option[Task]](
    option => option match {
      case Some(id) => task(id)
      case _ => None
    },
    option => option match {
      case Some(task) => task.id
      case _ => None
    })
could not find implicit value for parameter tm: scala.slick.lifted.TypeMapper[Option[justf0rfun.bookmark.model.Task]]not enough arguments for method base: (implicit tm: scala.slick.lifted.TypeMapper[Option[justf0rfun.bookmark.model.Task]])scala.slick.lifted.BaseTypeMapper[Option[Long]]. Unspecified value parameter tm.

Pregunta principal: ¿Cómo usar las tablas de incrustación y mapeo levantadas de Slick de la manera correcta? ¿Cómo consigo que esto funcione?

Gracias por adelantado.

Respuestas a la pregunta(1)

Su respuesta a la pregunta