yield for / OptionT#run

yield for のリファクタメモしとく
ついでにOptionTうんぬん、

// action: OptionT[DBIO, DBIOAction[Int, ...
val action = for {
  i <- OptionT(DBIO.successful(Option(1)))
} yield for {
  ii <- DBIO.successful(i)
} yield ii

// DBIO[Option[DBIO[Int...
val dod = action.run

OptionT#run

final case class OptionT[F[_], A](val run : F[scala.Option[A]])

// OptionT[F[_], A] <- OptionT[DBIO, DBIOAction[Int, ...

シグネチャみるまではrunって関数かなんかだと思ってた、だってrunだし
つまりは、

F[scala.Option[A]]
// ↓
DBIO[scala.Option[DBIOAction[Int, ...

というわけで、

// DBIO[Option[DBIOAction[Int,...

こいつを合成したわけだが、今回FutureじゃなくてDBIOにしたのはDBIO.sequenceOptionがつかいたかったから。

val do = action.run.flatMap(DBIO.sequenceOption(_))
// : DBIO[Option[Int

sequenceOptionのシグネチャをみにいく、名前からしてsequenceのOption版だろうが、

  /** Transform a `Option[ DBIO[R] ]` into a `DBIO[ Option[R] ]`. */
  def sequenceOption[R, E <: Effect](in: Option[DBIOAction[R, NoStream, E]]): DBIOAction[Option[R], NoStream, E] = {
    implicit val ec = DBIO.sameThreadExecutionContext
    sequence(in.toList).map(_.headOption)
  }

はい、