Now

final case class Now[+A](a: A) extends Eager[A]

Constructs an eager Coeval instance from a strict value that's already known.

Constructs an eager Coeval instance from a strict value that's already known.

class Eager[A]
trait Product
trait Equals
class Coeval[A]
trait Serializable
trait () => A
class Object
trait Matchable
class Any

Value members

Concrete methods

override def apply(): A
Definition Classes
Coeval -> Function0
override def run(): Now[A]
Definition Classes
override def runAttempt(): Right[Nothing, A]
Definition Classes
override def runTry(): Success[A]
Definition Classes
override def value(): A
Definition Classes

Inherited methods

final def *>[B](that: Coeval[B]): Coeval[B]

Runs this coeval first and then, when successful, the given coeval. Returns the result of the given coeval.

Runs this coeval first and then, when successful, the given coeval. Returns the result of the given coeval.

Example:

 val combined = Coeval{println("first"); "first"} *> Coeval{println("second"); "second"}
 // Prints "first" and then "second"
 // Result value will be "second"
Inherited from
Coeval
final def <*[B](that: Coeval[B]): Coeval[A]

Runs this coeval first and then, when successful, the given coeval. Returns the result of this coeval.

Runs this coeval first and then, when successful, the given coeval. Returns the result of this coeval.

Example:

 val combined = Coeval{println("first"); "first"} <* Coeval{println("second"); "second"}
 // Prints "first" and then "second"
 // Result value will be "first"
Inherited from
Coeval
final def >>[B](that: => Coeval[B]): Coeval[B]

Runs this underlying computation first and then, when successful, the given one. Returns the result of the given underlying computation.

Runs this underlying computation first and then, when successful, the given one. Returns the result of the given underlying computation.

Example:

 val combined = Coeval{println("first"); "first"} >> Coeval{println("second"); "second"}
 // Prints "first" and then "second"
 // Result value will be "second"
Inherited from
Coeval
final def as[B](b: B): Coeval[B]

Returns this coeval mapped to the supplied value.

Returns this coeval mapped to the supplied value.

Inherited from
Coeval
final def attempt: Coeval[Either[Throwable, A]]

Creates a new Coeval that will expose any triggered error from the source.

Creates a new Coeval that will expose any triggered error from the source.

 val fa: Coeval[Int] =
   Coeval.raiseError[Int](new RuntimeException("dummy"))

 val fe: Coeval[Either[Throwable, Int]] =
   fa.attempt

 fe.map {
   case Left(_) => Int.MaxValue
   case Right(v) => v
 }

By exposing errors by lifting the Coeval's result into an Either value, we can handle those errors in flatMap transformations.

Also see materialize for working with Scala's Try or redeemWith for an alternative.

Inherited from
Coeval
final def bracket[B](use: A => Coeval[B])(release: A => Coeval[Unit]): Coeval[B]

Returns a task that treats the source as the acquisition of a resource, which is then exploited by the use function and then released.

Returns a task that treats the source as the acquisition of a resource, which is then exploited by the use function and then released.

The bracket operation is the equivalent of the try {} finally {} statements from mainstream languages, installing the necessary exception handler to release the resource in the event of an exception being raised during the computation. If an exception is raised, then bracket will re-raise the exception ''after'' performing the release.

Example:

 import java.io._

 def readFile(file: File): Coeval[String] = {
   // Opening a file handle for reading text
   val acquire = Coeval.eval(new BufferedReader(
     new InputStreamReader(new FileInputStream(file), "utf-8")
   ))

   acquire.bracket { in =>
     // Usage part
     Coeval.eval {
       // Yes, ugly Java, non-FP loop;
       // side-effects are suspended though
       var line: String = ""
       val buff = new StringBuilder()
       while (line != null) {
         line = in.readLine()
         if (line != null) buff.append(line)
       }
       buff.toString()
     }
   } { in =>
     // The release part
     Coeval.eval(in.close())
   }
 }

'''NOTE on error handling''': one big difference versus try {} finally {} is that, in case both the release function and the use function throws, the error raised by use gets signaled and the error raised by release gets reported with System.err for Coeval or with Scheduler.reportFailure for Task.

   For example:
         Coeval("resource").bracket { _ =>
           // use
           Coeval.raiseError(new RuntimeException("Foo"))
         } { _ =>
           // release
           Coeval.raiseError(new RuntimeException("Bar"))
         }
   In this case the error signaled downstream is `"Foo"`,
   while the `"Bar"` error gets reported. This is consistent
   with the behavior of Haskell's `bracket` operation and NOT
   with `try {} finally {}` from Scala, Java or JavaScript.
Value Params
release

is a function that gets called after use terminates, either normally or in error, receiving as input the resource that needs to be released

use

is a function that evaluates the resource yielded by the source, yielding a result that will get generated by the task returned by this bracket function

See also
Inherited from
Coeval
final def bracketCase[B](use: A => Coeval[B])(release: (A, ExitCase[Throwable]) => Coeval[Unit]): Coeval[B]

Returns a new task that treats the source task as the acquisition of a resource, which is then exploited by the use function and then released, with the possibility of distinguishing between successful completion and failure, such that an appropriate release of resources can be executed.

Returns a new task that treats the source task as the acquisition of a resource, which is then exploited by the use function and then released, with the possibility of distinguishing between successful completion and failure, such that an appropriate release of resources can be executed.

The bracketCase operation is the equivalent of try {} catch {} finally {} statements from mainstream languages when used for the acquisition and release of resources.

The bracketCase operation installs the necessary exception handler to release the resource in the event of an exception being raised during the computation.

In comparison with the simpler bracket version, this one allows the caller to differentiate between normal termination and termination in error via an ExitCase parameter.

Value Params
release

is a function that gets called after use terminates, either normally or in error, receiving as input the resource that needs that needs release, along with the result of use

use

is a function that evaluates the resource yielded by the source, yielding a result that will get generated by this function on evaluation

See also
Inherited from
Coeval
final def bracketE[B](use: A => Coeval[B])(release: (A, Either[Throwable, B]) => Coeval[Unit]): Coeval[B]

Returns a task that treats the source task as the acquisition of a resource, which is then exploited by the use function and then released, with the possibility of distinguishing between successful termination and error, such that an appropriate release of resources can be executed.

Returns a task that treats the source task as the acquisition of a resource, which is then exploited by the use function and then released, with the possibility of distinguishing between successful termination and error, such that an appropriate release of resources can be executed.

The bracket operation is the equivalent of the try {} finally {} statements from mainstream languages, installing the necessary exception handler to release the resource in the event of an exception being raised during the computation. If an exception is raised, then bracket will re-raise the exception ''after'' performing the release.

The release function receives as input:

  • Left(error) in case use terminated with an error
  • Right(b) in case of success

'''NOTE on error handling''': one big difference versus try {} finally {} is that, in case both the release function and the use function throws, the error raised by use gets signaled and the error raised by release gets reported with System.err for Coeval or with Scheduler.reportFailure for Task.

   For example:
         Coeval("resource").bracket { _ =>
           // use
           Coeval.raiseError(new RuntimeException("Foo"))
         } { _ =>
           // release
           Coeval.raiseError(new RuntimeException("Bar"))
         }
   In this case the error signaled downstream is `"Foo"`,
   while the `"Bar"` error gets reported. This is consistent
   with the behavior of Haskell's `bracket` operation and NOT
   with `try {} finally {}` from Scala, Java or JavaScript.
Value Params
release

is a function that gets called after use terminates, either normally or in error, receiving as input the resource that needs that needs release, along with the result of use

use

is a function that evaluates the resource yielded by the source, yielding a result that will get generated by this function on evaluation

See also
Inherited from
Coeval
final def dematerialize[B](ev: A <:< Try[B]): Coeval[B]

Dematerializes the source's result from a Try.

Dematerializes the source's result from a Try.

This equivalence always holds:

fa.materialize.dematerialize <-> fa

Inherited from
Coeval
final def doOnFinish(f: Option[Throwable] => Coeval[Unit]): Coeval[A]

Returns a new Coeval in which f is scheduled to be run on completion. This would typically be used to release any resources acquired by this Coeval.

Returns a new Coeval in which f is scheduled to be run on completion. This would typically be used to release any resources acquired by this Coeval.

Inherited from
Coeval
final def failed: Coeval[Throwable]

Returns a failed projection of this coeval.

Returns a failed projection of this coeval.

The failed projection is a Coeval holding a value of type Throwable, emitting the error yielded by the source, in case the source fails, otherwise if the source succeeds the result will fail with a NoSuchElementException.

Inherited from
Coeval
final def flatMap[B](f: A => Coeval[B]): Coeval[B]

Creates a new Coeval by applying a function to the successful result of the source, and returns a new instance equivalent to the result of the function.

Creates a new Coeval by applying a function to the successful result of the source, and returns a new instance equivalent to the result of the function.

The application of flatMap is always lazy and because of the implementation it is memory safe and thus it can be used in recursive loops.

Sample:

 import scala.util.Random

 def randomEven: Coeval[Int] =
   Coeval(Random.nextInt()).flatMap { x =>
     if (x < 0 || x % 2 == 1)
       randomEven // retry
     else
       Coeval.now(x)
   }
Inherited from
Coeval
final def flatMapLoop[S](seed: S)(f: (A, S, S => Coeval[S]) => Coeval[S]): Coeval[S]

Describes flatMap-driven loops, as an alternative to recursive functions.

Describes flatMap-driven loops, as an alternative to recursive functions.

Sample:

 import scala.util.Random

 val random = Coeval(Random.nextInt())
 val loop = random.flatMapLoop(Vector.empty[Int]) { (a, list, continue) =>
   val newList = list :+ a
   if (newList.length < 5)
     continue(newList)
   else
     Coeval.now(newList)
 }
Value Params
f

is the function that updates the result on each iteration, returning a Coeval.

seed

initializes the result of the loop

Returns

a new Coeval that contains the result of the loop.

Inherited from
Coeval
final def flatten[B](ev: A <:< Coeval[B]): Coeval[B]

Given a source Coeval that emits another Coeval, this function flattens the result, returning a Coeval equivalent to the emitted Coeval by the source.

Given a source Coeval that emits another Coeval, this function flattens the result, returning a Coeval equivalent to the emitted Coeval by the source.

This equivalence with flatMap always holds:

fa.flatten <-> fa.flatMap(x => x)

Inherited from
Coeval
final def foreach(f: A => Unit): Unit

Triggers the evaluation of the source, executing the given function for the generated element.

Triggers the evaluation of the source, executing the given function for the generated element.

The application of this function has strict behavior, as the coeval is immediately executed.

Inherited from
Coeval
final def foreachL(f: A => Unit): Coeval[Unit]

Returns a new task that upon evaluation will execute the given function for the generated element, transforming the source into a Coeval[Unit].

Returns a new task that upon evaluation will execute the given function for the generated element, transforming the source into a Coeval[Unit].

Similar in spirit with normal foreach, but lazy, as obviously nothing gets executed at this point.

Inherited from
Coeval
final def guarantee(finalizer: Coeval[Unit]): Coeval[A]

Executes the given finalizer when the source is finished, either in success or in error, or if canceled.

Executes the given finalizer when the source is finished, either in success or in error, or if canceled.

This variant of guaranteeCase evaluates the given finalizer regardless of how the source gets terminated:

  • normal completion
  • completion in error
  • cancellation

As best practice, it's not a good idea to release resources via guaranteeCase in polymorphic code. Prefer bracket for the acquisition and release of resources.

See also

guaranteeCase for the version that can discriminate between termination conditions

bracket for the more general operation

Inherited from
Coeval
final def guaranteeCase(finalizer: ExitCase[Throwable] => Coeval[Unit]): Coeval[A]

Executes the given finalizer when the source is finished, either in success or in error, or if canceled, allowing for differentiating between exit conditions.

Executes the given finalizer when the source is finished, either in success or in error, or if canceled, allowing for differentiating between exit conditions.

This variant of guarantee injects an ExitCase in the provided function, allowing one to make a difference between:

  • normal completion
  • completion in error
  • cancellation

As best practice, it's not a good idea to release resources via guaranteeCase in polymorphic code. Prefer bracketCase for the acquisition and release of resources.

See also

guarantee for the simpler version

bracketCase for the more general operation

Inherited from
Coeval
final def isError: Boolean

Returns true if result is an error.

Returns true if result is an error.

Inherited from
Eager
final def isSuccess: Boolean

Returns true if value is a successful one.

Returns true if value is a successful one.

Inherited from
Eager
final def map[B](f: A => B): Coeval[B]

Returns a new Coeval that applies the mapping function to the element emitted by the source.

Returns a new Coeval that applies the mapping function to the element emitted by the source.

Can be used for specifying a (lazy) transformation to the result of the source.

This equivalence with flatMap always holds:

fa.map(f) <-> fa.flatMap(x => Coeval.pure(f(x)))

Inherited from
Coeval
final def materialize: Coeval[Try[A]]

Creates a new Coeval that will expose any triggered error from the source.

Creates a new Coeval that will expose any triggered error from the source.

Also see attempt for working with Scala's Either or redeemWith for an alternative.

Inherited from
Coeval
@UnsafeBecauseImpure
final def memoize: Coeval[A]

Memoizes (caches) the result of the source and reuses it on subsequent invocations of value.

Memoizes (caches) the result of the source and reuses it on subsequent invocations of value.

The resulting coeval will be idempotent, meaning that evaluating the resulting coeval multiple times will have the same effect as evaluating it once.

'''UNSAFE''' — this operation allocates a shared, mutable reference, which can break in certain cases referential transparency, even if this operation guarantees idempotency (i.e. referential transparency implies idempotency, but idempotency does not imply referential transparency).

   The allocation of a mutable reference is known to be a
   side effect, thus breaking referential transparency,
   even if calling this method does not trigger the evaluation
   of side effects suspended by the source.

   Use with care. Sometimes it's easier to just keep a shared,
   memoized reference to some connection, but keep in mind
   it might be better to pass such a reference around as
   a parameter.
See also

memoizeOnSuccess for a version that only caches successful results

Inherited from
Coeval
@UnsafeBecauseImpure
final def memoizeOnSuccess: Coeval[A]

Memoizes (cache) the successful result of the source and reuses it on subsequent invocations of value. Thrown exceptions are not cached.

Memoizes (cache) the successful result of the source and reuses it on subsequent invocations of value. Thrown exceptions are not cached.

The resulting coeval will be idempotent, but only if the result is successful.

'''UNSAFE''' — this operation allocates a shared, mutable reference, which can break in certain cases referential transparency, even if this operation guarantees idempotency (i.e. referential transparency implies idempotency, but idempotency does not imply referential transparency).

   The allocation of a mutable reference is known to be a
   side effect, thus breaking referential transparency,
   even if calling this method does not trigger the evaluation
   of side effects suspended by the source.

   Use with care. Sometimes it's easier to just keep a shared,
   memoized reference to some connection, but keep in mind
   it might be better to pass such a reference around as
   a parameter.
See also

memoize for a version that caches both successful results and failures

Inherited from
Coeval
final def onErrorFallbackTo[B >: A](that: Coeval[B]): Coeval[B]

Creates a new coeval that in case of error will fallback to the given backup coeval.

Creates a new coeval that in case of error will fallback to the given backup coeval.

Inherited from
Coeval
final def onErrorHandle[U >: A](f: Throwable => U): Coeval[U]

Creates a new coeval that will handle any matching throwable that this coeval might emit.

Creates a new coeval that will handle any matching throwable that this coeval might emit.

See onErrorRecover for the version that takes a partial function.

Inherited from
Coeval
final def onErrorHandleWith[B >: A](f: Throwable => Coeval[B]): Coeval[B]

Creates a new coeval that will handle any matching throwable that this coeval might emit by executing another coeval.

Creates a new coeval that will handle any matching throwable that this coeval might emit by executing another coeval.

See onErrorRecoverWith for the version that takes a partial function.

Inherited from
Coeval
final def onErrorRecover[U >: A](pf: PartialFunction[Throwable, U]): Coeval[U]

Creates a new coeval that on error will try to map the error to another value using the provided partial function.

Creates a new coeval that on error will try to map the error to another value using the provided partial function.

See onErrorHandle for the version that takes a total function.

Inherited from
Coeval
final def onErrorRecoverWith[B >: A](pf: PartialFunction[Throwable, Coeval[B]]): Coeval[B]

Creates a new coeval that will try recovering from an error by matching it with another coeval using the given partial function.

Creates a new coeval that will try recovering from an error by matching it with another coeval using the given partial function.

See onErrorHandleWith for the version that takes a total function.

Inherited from
Coeval
final def onErrorRestart(maxRetries: Long): Coeval[A]

Creates a new coeval that in case of error will retry executing the source again and again, until it succeeds.

Creates a new coeval that in case of error will retry executing the source again and again, until it succeeds.

In case of continuous failure the total number of executions will be maxRetries + 1.

Inherited from
Coeval
final def onErrorRestartIf(p: Throwable => Boolean): Coeval[A]

Creates a new coeval that in case of error will retry executing the source again and again, until it succeeds.

Creates a new coeval that in case of error will retry executing the source again and again, until it succeeds.

In case of continuous failure the total number of executions will be maxRetries + 1.

Inherited from
Coeval
final def onErrorRestartLoop[S, B >: A](initial: S)(f: (Throwable, S, S => Coeval[B]) => Coeval[B]): Coeval[B]

On error restarts the source with a customizable restart loop.

On error restarts the source with a customizable restart loop.

This operation keeps an internal state, with a start value, an internal state that gets evolved and based on which the next step gets decided, e.g. should it restart, or should it give up and rethrow the current error.

Example that implements a simple retry policy that retries for a maximum of 10 times before giving up:

 import scala.util.Random

 val fa = Coeval {
   if (Random.nextInt(20) > 10)
     throw new RuntimeException("boo")
   else 78
 }

 fa.onErrorRestartLoop(10) { (err, maxRetries, retry) =>
   if (maxRetries > 0)
     // Do next retry please
     retry(maxRetries - 1)
   else
     // No retries left, rethrow the error
     Coeval.raiseError(err)
 }

The given function injects the following parameters:

  1. error reference that was thrown
  2. the current state, based on which a decision for the retry is made
  3. retry: S => Task[B] function that schedules the next retry
Value Params
f

is a function that injects the current error, state, a function that can signal a retry is to be made and returns the next coeval

initial

is the initial state used to determine the next on error retry cycle

Inherited from
Coeval
def productElementNames: Iterator[String]
Inherited from
Product
def productIterator: Iterator[Any]
Inherited from
Product
def redeem[B](recover: Throwable => B, map: A => B): Coeval[B]

Returns a new value that transforms the result of the source, given the recover or map functions, which get executed depending on whether the result is successful or if it ends in error.

Returns a new value that transforms the result of the source, given the recover or map functions, which get executed depending on whether the result is successful or if it ends in error.

This is an optimization on usage of attempt and map, this equivalence being true:

coeval.redeem(recover, map) <-> coeval.attempt.map(_.fold(recover, map))

Usage of redeem subsumes onErrorHandle because:

coeval.redeem(fe, id) <-> coeval.onErrorHandle(fe)

Value Params
map

is a function used for mapping the result of the source in case it ends in success

recover

is a function used for error recover in case the source ends in error

Inherited from
Coeval
def redeemWith[B](recover: Throwable => Coeval[B], bind: A => Coeval[B]): Coeval[B]

Returns a new value that transforms the result of the source, given the recover or bind functions, which get executed depending on whether the result is successful or if it ends in error.

Returns a new value that transforms the result of the source, given the recover or bind functions, which get executed depending on whether the result is successful or if it ends in error.

This is an optimization on usage of attempt and flatMap, this equivalence being available:

coeval.redeemWith(recover, bind) <-> coeval.attempt.flatMap(_.fold(recover, bind))

Usage of redeemWith subsumes onErrorHandleWith because:

coeval.redeemWith(fe, F.pure) <-> coeval.onErrorHandleWith(fe)

Usage of redeemWith also subsumes flatMap because:

coeval.redeemWith(Coeval.raiseError, fs) <-> coeval.flatMap(fs)

Value Params
bind

is the function that gets to transform the source in case of success

recover

is the function that gets called to recover the source in case of error

Inherited from
Coeval
final def restartUntil(p: A => Boolean): Coeval[A]

Given a predicate function, keep retrying the coeval until the function returns true.

Given a predicate function, keep retrying the coeval until the function returns true.

Inherited from
Coeval
final def tapError[B](f: Throwable => Coeval[B]): Coeval[A]

Creates a new Coeval that will run the given function in case of error and raise the original error in case the provided function is successful.

Creates a new Coeval that will run the given function in case of error and raise the original error in case the provided function is successful.

Example:

  // will result in Left("Error")
  Coeval
     .raiseError(new RuntimeException("Error"))
     .tapError(err => Coeval(err))

If provided function returns an error then the resulting coeval will raise that error instead.

Example:

  // will result in Left("Error2")
  Coeval
     .raiseError(new RuntimeException("Error1"))
     .tapError(err => Coeval.raiseError(new RuntimeException("Error2")))
Inherited from
Coeval
final def tapEval[B](f: A => Coeval[B]): Coeval[A]

Creates a new Coeval that will run the given function on the success and return the original value.

Creates a new Coeval that will run the given function on the success and return the original value.

Inherited from
Coeval
final def to[F[_]](F: CoevalLift[F]): F[A]

Converts the source Coeval into any F[_] that implements cats.effect.Sync.

Converts the source Coeval into any F[_] that implements cats.effect.Sync.

For example it can work with cats.effect.IO:

 import cats._
 import cats.effect._

 val source = Coeval { 1 + 1 }

 val asIO: IO[Int]     = source.to[IO]
 val asEval: Eval[Int] = source.to[Eval]
 val asTask: Task[Int] = source.to[Task]
Inherited from
Coeval
final def toEither: Either[Throwable, A]

Converts this Eager value into a scala.Either.

Converts this Eager value into a scala.Either.

Inherited from
Eager
override def toString: String
Definition Classes
Coeval -> Function0 -> Any
Inherited from
Coeval
final def toSync[F[_]](F: Sync[F]): F[A]

Converts the source to any value that implements cats.effect.Sync.

Converts the source to any value that implements cats.effect.Sync.

Prefer to use to, this method is provided in order to force the usage of cats.effect.Sync instances (instead of CoevalLift).

Inherited from
Coeval
final def toTry: Try[A]

Converts this Eager value into a scala.util.Try.

Converts this Eager value into a scala.util.Try.

Inherited from
Eager
final def void: Coeval[Unit]

Returns this coeval mapped to unit

Returns this coeval mapped to unit

Inherited from
Coeval
final def zip[B](that: Coeval[B]): Coeval[(A, B)]

Zips the values of this and that coeval, and creates a new coeval that will emit the tuple of their results.

Zips the values of this and that coeval, and creates a new coeval that will emit the tuple of their results.

Inherited from
Coeval
final def zipMap[B, C](that: Coeval[B])(f: (A, B) => C): Coeval[C]

Zips the values of this and that and applies the given mapping function on their results.

Zips the values of this and that and applies the given mapping function on their results.

Inherited from
Coeval

Deprecated and Inherited methods

@deprecated("Please use `Coeval.redeem`", since = "3.0.0-RC2")
final def transform[R](fa: A => R, fe: Throwable => R): Coeval[R]

Deprecated — use redeem instead.

Deprecated — use redeem instead.

Coeval.redeem is the same operation, but with a different name and the function parameters in an inverted order, to make it consistent with fold on Either and others (i.e. the function for error recovery is at the left).

Deprecated
[Since version 3.0.0-RC2]
Inherited from
Coeval
@deprecated("Please use `Coeval.redeemWith`", since = "3.0.0-RC2")
final def transformWith[R](fa: A => Coeval[R], fe: Throwable => Coeval[R]): Coeval[R]

Deprecated — use redeemWith instead.

Deprecated — use redeemWith instead.

Coeval.redeemWith is the same operation, but with a different name and the function parameters in an inverted order, to make it consistent with fold on Either and others (i.e. the function for error recovery is at the left).

Deprecated
[Since version 3.0.0-RC2]
Inherited from
Coeval