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)とすることで短く書けるようになるので、使ってみると良いだろう。