Task

Task エフェクトは MonixTask の薄いラッパーだ。このエフェクトは 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)