Concurrent

object Concurrent
Companion
class
class Object
trait Matchable
class Any

Type members

Classlikes

trait AllOps[F[_], A] extends Ops[F, A] with AllOps[F, A]
trait Ops[F[_], A]
class `ops$`

Value members

Concrete methods

@inline
def apply[F[_]](instance: Concurrent[F]): Concurrent[F]

Summon an instance of Concurrent for F.

Summon an instance of Concurrent for F.

def cancelableF[F[_], A](k: Either[Throwable, A] => Unit => F[CancelToken[F]])(F: Concurrent[F]): F[A]

Function that creates an async and cancelable F[A], similar with Concurrent.cancelable, but with the semantics of Async.asyncF.

Function that creates an async and cancelable F[A], similar with Concurrent.cancelable, but with the semantics of Async.asyncF.

Example building an asynchronous queue, with the state being kept in cats.effect.concurrent.Ref and thus needing cancelableF:

 import cats.syntax.all._
 import cats.effect.{CancelToken, Concurrent}
 import cats.effect.concurrent.Ref
 import scala.collection.immutable.Queue

 final class AsyncQueue[F[_], A] private (
   ref: Ref[F, AsyncQueue.State[A]])
   (implicit F: Concurrent[F]) {

   import AsyncQueue._

   def poll: F[A] =
     Concurrent.cancelableF { cb =>
       ref.modify {
         case Await(listeners) =>
           (Await(listeners.enqueue(cb)), F.pure(unregister(cb)))
         case Available(queue) =>
           queue.dequeueOption match {
             case None =>
               (Await(Queue(cb)), F.pure(unregister(cb)))
             case Some((a, queue2)) =>
               (Available(queue2), F.delay(cb(Right(a))).as(unregister(cb)))
           }
       }.flatten
     }

   def offer(a: A): F[Unit] = {
     // Left as an exercise for the reader ;-)
     ???
   }

   private def unregister(cb: Either[Throwable, A] => Unit): CancelToken[F] =
     ref.update {
       case Await(listeners) => Await(listeners.filter(_ != cb))
       case other => other
     }
 }

 object AsyncQueue {
   def empty[F[_], A](implicit F: Concurrent[F]): F[AsyncQueue[F, A]] =
     for {
       ref <- Ref.of[F, State[A]](Available(Queue.empty))
     } yield {
       new AsyncQueue[F, A](ref)
     }

   private sealed trait State[A]

   private case class Await[A](listeners: Queue[Either[Throwable, A] => Unit])
     extends State[A]

   private case class Available[A](values: Queue[A])
     extends State[A]
 }

==Contract==

The given generator function will be executed uninterruptedly, via bracket, because due to the possibility of auto-cancellation we can have a resource leak otherwise.

This means that the task generated by k cannot be cancelled while being evaluated. This is in contrast with Async.asyncF, which does allow cancelable tasks.

Value Params
k

is a function that's going to be injected with a callback, to call on completion, returning an effect that's going to be evaluated to a cancellation token

def continual[F[_], A, B](fa: F[A])(f: Either[Throwable, A] => F[B])(F: Concurrent[F]): F[B]

This is the default Concurrent.continual implementation.

This is the default Concurrent.continual implementation.

def liftIO[F[_], A](ioa: IO[A])(F: Concurrent[F]): F[A]

Lifts any IO value into any data type implementing Concurrent.

Lifts any IO value into any data type implementing Concurrent.

Compared with Async.liftIO, this version preserves the interruptibility of the given IO value.

This is the default Concurrent.liftIO implementation.

def memoize[F[_], A](f: F[A])(F: Concurrent[F]): F[F[A]]

Lazily memoizes f. Assuming no cancellation happens, the effect f will be performed at most once for every time the returned F[F[A]] is bound (when the inner F[A] is bound the first time).

Lazily memoizes f. Assuming no cancellation happens, the effect f will be performed at most once for every time the returned F[F[A]] is bound (when the inner F[A] is bound the first time).

If you try to cancel an inner F[A], f is only interrupted if there are no other active subscribers, whereas if there are, f keeps running in the background.

If f is successfully canceled, the next time an inner F[A] is bound f will be restarted again. Note that this can mean the effects of f happen more than once.

You can look at Async.memoize for a version of this function which does not allow cancellation.

def parSequenceN[T[_], M[_], A](n: Long)(tma: T[M[A]])(`evidence$2`: Traverse[T], M: Concurrent[M], P: Parallel[M]): M[T[A]]

Like Parallel.parSequence, but limits the degree of parallelism.

Like Parallel.parSequence, but limits the degree of parallelism.

def parTraverseN[T[_], M[_], A, B](n: Long)(ta: T[A])(f: A => M[B])(`evidence$1`: Traverse[T], M: Concurrent[M], P: Parallel[M]): M[T[B]]

Like Parallel.parTraverse, but limits the degree of parallelism.

Like Parallel.parTraverse, but limits the degree of parallelism.

def timeout[F[_], A](fa: F[A], duration: FiniteDuration)(F: Concurrent[F], timer: Timer[F]): F[A]

Returns an effect that either completes with the result of the source within the specified time duration or otherwise raises a TimeoutException.

Returns an effect that either completes with the result of the source within the specified time duration or otherwise raises a TimeoutException.

The source is cancelled in the event that it takes longer than the specified time duration to complete.

Value Params
duration

is the time span for which we wait for the source to complete; in the event that the specified time has passed without the source completing, a TimeoutException is raised

def timeoutTo[F[_], A](fa: F[A], duration: FiniteDuration, fallback: F[A])(F: Concurrent[F], timer: Timer[F]): F[A]

Returns an effect that either completes with the result of the source within the specified time duration or otherwise evaluates the fallback.

Returns an effect that either completes with the result of the source within the specified time duration or otherwise evaluates the fallback.

The source is cancelled in the event that it takes longer than the FiniteDuration to complete, the evaluation of the fallback happening immediately after that.

Value Params
duration

is the time span for which we wait for the source to complete; in the event that the specified time has passed without the source completing, the fallback gets evaluated

fallback

is the task evaluated after the duration has passed and the source canceled

Concrete fields

val ops: `ops$`

Implicits

Implicits

implicit def catsEitherTConcurrent[F[_], L](`evidence$3`: Concurrent[F]): Concurrent[[_] =>> EitherT[F, L, _$18]]

Concurrent instance built for cats.data.EitherT values initialized with any F data type that also implements Concurrent.

Concurrent instance built for cats.data.EitherT values initialized with any F data type that also implements Concurrent.

implicit def catsIorTConcurrent[F[_], L](`evidence$8`: Concurrent[F], `evidence$9`: Semigroup[L]): Concurrent[[_] =>> IorT[F, L, _$26]]

Concurrent instance built for cats.data.IorT values initialized with any F data type that also implements Concurrent.

Concurrent instance built for cats.data.IorT values initialized with any F data type that also implements Concurrent.

implicit def catsKleisliConcurrent[F[_], R](`evidence$5`: Concurrent[F]): Concurrent[[_] =>> Kleisli[F, R, _$22]]

Concurrent instance built for cats.data.Kleisli values initialized with any F data type that also implements Concurrent.

Concurrent instance built for cats.data.Kleisli values initialized with any F data type that also implements Concurrent.

implicit def catsOptionTConcurrent[F[_]](`evidence$4`: Concurrent[F]): Concurrent[[_] =>> OptionT[F, _$20]]

Concurrent instance built for cats.data.OptionT values initialized with any F data type that also implements Concurrent.

Concurrent instance built for cats.data.OptionT values initialized with any F data type that also implements Concurrent.

implicit def catsWriterTConcurrent[F[_], L](`evidence$6`: Concurrent[F], `evidence$7`: Monoid[L]): Concurrent[[_] =>> WriterT[F, L, _$24]]

Concurrent instance built for cats.data.WriterT values initialized with any F data type that also implements Concurrent.

Concurrent instance built for cats.data.WriterT values initialized with any F data type that also implements Concurrent.