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) }
はい、