All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.atnos.eff.monix.TaskEffect.scala Maven / Gradle / Ivy

package org.atnos.eff.monix

import scala.util.control.NonFatal
import cats.data._
import Xor._
import org.atnos.eff._, Eff._, Interpret._
import _root_.monix.eval._
import _root_.monix.execution._

import scala.concurrent._
import scala.util._
import duration._

/**
 * Effect for Task computations
 */
trait TaskEffect extends
  TaskCreation with
  TaskInterpretation

object TaskEffect extends TaskEffect

trait TaskCreation {
  def sync[R, A](a: A)(implicit m: Member[Task, R]): Eff[R, A] =
    pure(a)

  def async[R, A](a: =>A)(implicit m: Member[Task, R]): Eff[R, A] =
    send(Task.fork(Task.evalOnce(a)))

}

trait TaskInterpretation {
  
  def awaitTask[R <: Effects, U <: Effects, A](r: Eff[R, A])(atMost: Duration)
      (implicit m: Member.Aux[Task, R, U], ec: ExecutionContext, s: Scheduler): Eff[U, Throwable Xor A] = {
    val recurse = new Recurse[Task, U, Throwable Xor A] {
      def apply[X](m: Task[X]) =
        try { Xor.left(Await.result(m.runAsync(s), atMost)) }
        catch { case NonFatal(t) => Xor.right(Eff.pure(Xor.left(t))) }
    }

    interpret1((a: A) => Xor.right(a): Throwable Xor A)(recurse)(r)
  }

}

object TaskInterpretation extends TaskInterpretation





© 2015 - 2025 Weber Informatics LLC | Privacy Policy