Task
エフェクトは
Monix の
Task
の薄いラッパーだ。このエフェクトは Eff
のコアにはバンドルされておらず、使うには
eff-monix
拡張モジュールが必要だ。
それでは
Task
エフェクトをいくつか作ってみよう。
import org.atnos.eff._
import org.atnos.eff.addon.monix.task._
import org.atnos.eff.syntax.addon.monix.task._
import monix.eval.Task
type R = Fx.fx2[Task, Option]
val action: Eff[R, Int] =
for {
// 新しい値を即座に作る
a <- Eff.pure[R, Int](1)
// Monix の `Scheduler` で指定されたスレッドプールで値をあとで評価し、評価が完了したら処理を続ける
b <- taskDelay[R, Int](1)
} yield b
それから、この計算を開始するには Monix の
Scheduler
を渡す必要がある。
implicit val scheduler =
monix.execution.Scheduler(ExecutionContext.fromExecutorService(Executors.newScheduledThreadPool(10)): ExecutionContext)
Monix は Task の結果をブロッキングで取得する Await API
をネイティブでは提供していない。代わりに、Scala の Future
に変換して
Await.result
を使うことを勧めている。
import scala.concurrent.Await
Await.result(action.runOption.runAsync.runToFuture, 1 second)
> Some(1)