ScalaのCatsにifMという便利なやつがある。IO[Boolean]
に対して条件分岐を適用して、true
の場合とfalse
の場合とで異なるIO
を返すというもの。別にIO
でなくとも良くて、Monad
などの仲間であればifM
は定義されている。例えばOption[Boolean]
に対してもifM
が使える。
http://typelevel.org/cats/api/cats/index.html?search=ifm
このようなシチュエーションがあるときにifM
を使うとシンプルになる:
val condition: IO[Boolean] = ... condition.flatMap { cond => val ioForTrue: IO[A] = ... val ioForFalse: IO[A] = ... if (cond) { ioForTrue } else { ioForFalse } }
condition
の内容をflatMap
で展開し、Boolean
の値によってioForTrue
を呼んだりioForFalse
を呼んだりしている。このようなパターンはifM
で置換可能だ:
val condition: IO[Boolean] = ... val ioForTrue: IO[A] = ... val ioForFalse: IO[A] = ... condition.ifM(ioForTrue, ioForFalse)
条件がIO
でなくても、IO.pure(boolean)
とすることで短く書けるようになるので、使ってみると良いだろう。