CanPerform

trait CanPerform[Z <: Signature] extends Signature
trait Signature
class Object
trait Matchable
class Any
trait Effect[Z]
trait AcyclicMemoizer[K, V]
trait AutoInc
trait CyclicMemoizer[K, V]
trait MonoGraph[K, V]
trait PolyGraph[K, V]
trait Choice
object Each.type
object Fail.type
trait ErrorEffect[E, E1]
trait Error[E]
trait ErrorG[M, K, V]
trait ErrorGK[M, K, F, V]
trait ErrorK[F, E]
trait Reader[R]
trait State[S]
trait WriterEffect[W, W1]
trait Writer[W]
trait WriterG[M, K, V]
trait WriterGK[M, K, F, V]
trait WriterK[F, W]

Type members

Types

final override type !@![+A, U] = Computation[A, U]

Inherited types

Abstract type that must be used in definitions of effect's operations.

Abstract type that must be used in definitions of effect's operations.

From the perspective of effect's user, ThisEffect is just an alias of this.type. The final-override happens in Effect.

From the perspective of handler, ThisEffect definition is enriched in a way depending on the chosen Interpreter.

Inherited from:
Signature

Value members

Concrete methods

final def perform[A, U <: ThisEffect](f: Z & Signature { type ThisEffect = U; } => A !@! U { def apply(z: Z & Signature { type ThisEffect = U; }): A !@! U; }): Computation[A, U]

Lifts an invocation of this Signature's method into the Computation monad.

Lifts an invocation of this Signature's method into the Computation monad.

The purpose of perform is similar to:

  • send function form various effect systems (Eff monad, etc.)
  • serviceWith from ZIO 1.x.
  • serviceWithZIO from ZIO 2.x.

⚠️ Scaladoc displays the definition of perform as more complex than it actually is:

final def perform[A, U <: ThisEffect](f: (z: Z & Signature { type ThisEffect = U }) => z.!@![A, U]): A !! U
final def pure[A](a: A): Computation[A, ThisEffect]

Like !!.pure(a), but with effect-set up-casted to ThisEffect

Like !!.pure(a), but with effect-set up-casted to ThisEffect