Reader
エフェクトは「環境」に値を要求するために使う。主なメソッドは
ask
であり、現在の環境(または、そう見なすのがお好みなら「設定」)を取得する。それから
runReader
メソッドに環境を表す値を提供することで
Reader
エフェクトを含んだエフェクトスタックを実行することができる。
「局所的」な
Reader
を「より大きな」Reader
に注入することもできる。
import org.atnos.eff._, all._, syntax.all._
import cats.data._
case class Conf(host: String, port: Int)
type R1[A] = Reader[Int, A]
type R2[A] = Reader[Conf, A]
type S = Fx.fx2[R1, R2]
def getPort[R](implicit r: Reader[Int, *] |= R): Eff[R, String] = for {
p1 <- ask[R, Int]
} yield "the port is " + p1
getPort[S].translateReader((_: Conf).port).runReader(Conf("prod", 80)).run
> the port is 80