ScalaDSL

trait ScalaDSL extends TimerDSL with CrashDSL with InvertDSL

Supports manipulating Scala values via pure Scala functions. Also extends InvertDSL (and thus ClosedDSL), TimerDSL and CrashDSL, since these are expected to be possible on a target platform that already supports Scala functions.

trait InvertDSL
trait ClosedDSL
trait CrashDSL
trait TimerDSL
trait CoreDSL
class Object
trait Matchable
class Any

Type members

Inherited classlikes

trait $Ops
Inherited from
CoreDSL
Inherited from
ClosedDSL
implicit
class DemandExprOps[B](expr: $[-[B]])
Inherited from
InvertDSL

Types

type Neg[A] = -[Val[A]]

Demand for a Scala value of type A.

Demand for a Scala value of type A.

Somewhat analogous to scala.concurrent.Promise

type Res[A]

Resource that is a Scala object of type A. Unlike Val, a resource can be mutable, cannot in general be neglected or duplicated, and is automatically cleaned-up in case of crash.

Resource that is a Scala object of type A. Unlike Val, a resource can be mutable, cannot in general be neglected or duplicated, and is automatically cleaned-up in case of crash.

It is recommended to define custom opaque type aliases of resources, such as

opaque type Input = Res[java.io.InputStream]
type Val[A]

Scala value of type A.

Scala value of type A.

Somewhat analogous to scala.concurrent.Future.

Inherited types

type $[A]

The type of auxiliary placeholder variables used in construction of λ-expressions.

The type of auxiliary placeholder variables used in construction of λ-expressions.

Inherited from
CoreDSL
type -[A]

-[A] is a demand for A.

-[A] is a demand for A.

Inverts the flow of information: whatever travels through A in one direction, travels through -[A] in the opposite direction.

Inherited from
InvertDSL
type -⚬[A, B]

Libretto arrow, also called a ''component'' or a ''linear function''.

Libretto arrow, also called a ''component'' or a ''linear function''.

┏━━━━━━━━━━┓
┞───┐      ┞───┐
╎ A │      ╎ B │
┟───┘      ┟───┘
┗━━━━━━━━━━┛

In A -⚬ B, we say that the ''in-port'' is of type A and the ''out-port'' is of type B. Note that the distinction between the in-port and the out-port is only formal. Information or resources may flow in and out through both the in-port and the out-port.

"Linear" means that each input is ''consumed'' exactly once, in particular, it cannot be ignored or used twice.

Inherited from
CoreDSL
override
type =⚬[A, B] = -[A] |*| B
Inherited from
InvertDSL
type Done

Signal that travels in the direction of -⚬, i.e. the positive direction. It may signal completion of a (potentially effectful) computation. It cannot be ignored. (If this signal was the only handle to an (effectful) computation, ignoring it would mean losing track of that computation, which is considered to be a resource leak.)

Signal that travels in the direction of -⚬, i.e. the positive direction. It may signal completion of a (potentially effectful) computation. It cannot be ignored. (If this signal was the only handle to an (effectful) computation, ignoring it would mean losing track of that computation, which is considered to be a resource leak.)

Inherited from
CoreDSL

A black hole that can absorb (i.e. take over the responsibility to await) Need signals, but from which there is no escape.

A black hole that can absorb (i.e. take over the responsibility to await) Need signals, but from which there is no escape.

Inherited from
CoreDSL
type Need

Signal that travels in the direction opposite to -⚬, i.e. the negative direction. It may signal completion of a (potentially effectful) computation. It cannot be ignored. (If this signal was the only handle to an (effectful) computation, ignoring it would mean losing track of that computation, which is considered to be a resource leak.)

Signal that travels in the direction opposite to -⚬, i.e. the negative direction. It may signal completion of a (potentially effectful) computation. It cannot be ignored. (If this signal was the only handle to an (effectful) computation, ignoring it would mean losing track of that computation, which is considered to be a resource leak.)

Inherited from
CoreDSL
type NoCaptureException <: Throwable
Inherited from
ClosedDSL
type NotLinearException <: Throwable
Inherited from
CoreDSL
type One

No resource. It is the identity element for |*|. There is no flow of information through a One-typed port.

No resource. It is the identity element for |*|. There is no flow of information through a One-typed port.

Inherited from
CoreDSL
type Ping

Signal that travels in the direction of -⚬, i.e. the positive direction. [Unlike Done, it cannot be the only handle to an effectful computation. As such, it can be ignored, e.g. as the losing contestant in racePair.

Signal that travels in the direction of -⚬, i.e. the positive direction. [Unlike Done, it cannot be the only handle to an effectful computation. As such, it can be ignored, e.g. as the losing contestant in racePair.

Inherited from
CoreDSL
type Pong

Signal that travels in the direction opposite to -⚬, i.e. the negative direction. Unlike Need, it cannot be the only handle to an effectful computation. As such, it can be ignored, e.g. as the losing contestant in selectPair.

Signal that travels in the direction opposite to -⚬, i.e. the negative direction. Unlike Need, it cannot be the only handle to an effectful computation. As such, it can be ignored, e.g. as the losing contestant in selectPair.

Inherited from
CoreDSL

A black hole that can absorb (i.e. take over the responsibility to await) Done signals, but from which there is no escape.

A black hole that can absorb (i.e. take over the responsibility to await) Done signals, but from which there is no escape.

Inherited from
CoreDSL
type Rec[F[_]]
Inherited from
CoreDSL
type UnboundVariablesException <: Throwable
Inherited from
CoreDSL
type Zero

Impossible resource. Analogous to Nothing. It is the identity element for |+|.

Impossible resource. Analogous to Nothing. It is the identity element for |+|.

Inherited from
CoreDSL
type |&|[A, B]

Choice between A and B. The consumer chooses whether to get A or B (but can get only one of them). The producer has to be ready to provide either of them.

Choice between A and B. The consumer chooses whether to get A or B (but can get only one of them). The producer has to be ready to provide either of them.

Inherited from
CoreDSL
type |*|[A, B]

Concurrent pair. Also called a ''tensor product'' or simply ''times''.

Concurrent pair. Also called a ''tensor product'' or simply ''times''.

Inherited from
CoreDSL
type |+|[A, B]

Either A or B. Analogous to scala.Either. Whether it is going to be A or B is decided by the producer. The consumer has to be ready to handle either of the two cases.

Either A or B. Analogous to scala.Either. Whether it is going to be A or B is decided by the producer. The consumer has to be ready to handle either of the two cases.

Inherited from
CoreDSL
type [A, B] = A |+| B

Alias for |+|.

Alias for |+|.

Inherited from
CoreDSL
type [A, B] = A |*| B

Alias for |*|.

Alias for |*|.

Inherited from
CoreDSL

Value members

Abstract methods

def acquire[A, R, B](acquire: A => (R, B), release: Option[R => Unit]): Val[A] -⚬ Res[R] |*| Val[B]

Acquires a resource of type R.

Acquires a resource of type R.

Type Params
A

parameters of the acquire function

B

additional data produced by acquiring the resource

R

type of the resource

Value Params
release

called to release the resource in case of a crash. None means no cleanup is needed

def blocking[A, B](f: A => B): Val[A] -⚬ Val[B]

Executes a potentially blocking operation. The implementation must ensure that the blocking operation does not impede any of the concurrently happening non-blocking computations.

Executes a potentially blocking operation. The implementation must ensure that the blocking operation does not impede any of the concurrently happening non-blocking computations.

def constNeg[A](a: A): Neg[A] -⚬ Need
def constVal[A](a: A): Done -⚬ Val[A]
def debugPrint(msg: String): Ping -⚬ One

Prints the given message to the console, without creating an obligation to await.

Prints the given message to the console, without creating an obligation to await.

def delay: Val[FiniteDuration] -⚬ Done
def effectAsync[R, A, B](f: (R, A) => Async[B]): Res[R] |*| Val[A] -⚬ Res[R] |*| Val[B]
def effectWrAsync[R, A](f: (R, A) => Async[Unit]): Res[R] |*| Val[A] -⚬ Res[R]
def liftEither[A, B]: Val[Either[A, B]] -⚬ Val[A] |+| Val[B]
def liftPair[A, B]: Val[(A, B)] -⚬ Val[A] |*| Val[B]
def mapVal[A, B](f: A => B): Val[A] -⚬ Val[B]

Lifts an ordinary Scala function to a linear function on Vals.

Lifts an ordinary Scala function to a linear function on Vals.

def neglect[A]: Val[A] -⚬ Done
def notifyNeg[A]: Pong |*| Neg[A] -⚬ Neg[A]
def notifyVal[A]: Val[A] -⚬ Ping |*| Val[A]
def release[R]: Res[R] -⚬ Done

Releases a resource using the release function registered during resource acquisition.

Releases a resource using the release function registered during resource acquisition.

def releaseAsync[R, A, B](f: (R, A) => Async[B]): Res[R] |*| Val[A] -⚬ Val[B]
def tryAcquireAsync[A, R, B, E](acquire: A => Async[Either[E, (R, B)]], release: Option[R => Async[Unit]]): Val[A] -⚬ Val[E] |+| Res[R] |*| Val[B]
def trySplitResourceAsync[R, A, S, T, B, E](f: (R, A) => Async[Either[E, (S, T, B)]], release1: Option[S => Async[Unit]], release2: Option[T => Async[Unit]]): Res[R] |*| Val[A] -⚬ Val[E] |+| Res[S] |*| Res[T] |*| Val[B]
def tryTransformResourceAsync[R, A, S, B, E](f: (R, A) => Async[Either[E, (S, B)]], release: Option[S => Async[Unit]]): Res[R] |*| Val[A] -⚬ Val[E] |+| Res[S] |*| Val[B]
def unliftPair[A, B]: Val[A] |*| Val[B] -⚬ Val[(A, B)]

Concrete methods

def acquireAsync[A, R, B](acquire: A => Async[(R, B)], release: Option[R => Async[Unit]]): Val[A] -⚬ Res[R] |*| Val[B]
def contramapNeg[A, B](f: A => B): Neg[B] -⚬ Neg[A]

Lifts an ordinary Scala function to a linear function on demands, in opposite direction.

Lifts an ordinary Scala function to a linear function on demands, in opposite direction.

override
def delay(d: FiniteDuration): Done -⚬ Done
Definition Classes
def delayNeed: Need -⚬ Neg[FiniteDuration]
def dup[A]: Val[A] -⚬ Val[A] |*| Val[A]
def dupNeg[A]: Neg[A] |*| Neg[A] -⚬ Neg[A]
def effect[R, A, B](f: (R, A) => B): Res[R] |*| Val[A] -⚬ Res[R] |*| Val[B]

Performs a (potentially) effectful operation on a resource, producing some output.

Performs a (potentially) effectful operation on a resource, producing some output.

Type Params
A

additional parameter of the operation

B

additional output of the operation

R

type of the resource

Value Params
f

the effectful operation

def effectWr[R, A](f: (R, A) => Unit): Res[R] |*| Val[A] -⚬ Res[R]

Variant of effect that does not produce output in addition to performing the effect. Can be viewed as ''wr''iting an A into the resource.

Variant of effect that does not produce output in addition to performing the effect. Can be viewed as ''wr''iting an A into the resource.

def fulfill[A]: Val[A] |*| Neg[A] -⚬ One

Uses the value (eventually) produced by Val to satisfy the demand of Neg.

Uses the value (eventually) produced by Val to satisfy the demand of Neg.

def inflate[A]: Need -⚬ Neg[A]
def liftNegPair[A, B]: Neg[(A, B)] -⚬ Neg[A] |*| Neg[B]
def promise[A]: One -⚬ Neg[A] |*| Val[A]

Creates an entangled pair of demand (Neg) and supply (Val) such that when the demand is fulfilled with a value, that value will be produced by the supply.

Creates an entangled pair of demand (Neg) and supply (Val) such that when the demand is fulfilled with a value, that value will be produced by the supply.

def release[R, A, B](f: (R, A) => B): Res[R] |*| Val[A] -⚬ Val[B]

Releases a resource using the given function. The release function previously registered during resource acquisition is not used.

Releases a resource using the given function. The release function previously registered during resource acquisition is not used.

Type Params
A

additional parameter of the release function

B

additional data produced by the release function

R

type of the resource

Value Params
f

the release function

def splitResource[R, A, S, T, B](f: (R, A) => (S, T, B), release1: Option[S => Unit], release2: Option[T => Unit]): Res[R] |*| Val[A] -⚬ Res[S] |*| Res[T] |*| Val[B]
def splitResourceAsync[R, A, S, T, B](f: (R, A) => Async[(S, T, B)], release1: Option[S => Async[Unit]], release2: Option[T => Async[Unit]]): Res[R] |*| Val[A] -⚬ Res[S] |*| Res[T] |*| Val[B]
def transformResource[R, A, S, B](f: (R, A) => (S, B), release: Option[S => Unit]): Res[R] |*| Val[A] -⚬ Res[S] |*| Val[B]

Transforms a resource into a resource of (possibly) different type.

Transforms a resource into a resource of (possibly) different type.

Type Params
A

additional parameter of the transformation

B

additional output of the transformation

R

type of the input resource

S

type of the output resource

Value Params
f

the transformation function. It receives the input resource and additional input of type A. It returns the new resource and additional output of type B.

release

called to release the new resource in case of a crash. None means no cleanup is needed

def transformResourceAsync[R, A, S, B](f: (R, A) => Async[(S, B)], release: Option[S => Async[Unit]]): Res[R] |*| Val[A] -⚬ Res[S] |*| Val[B]
def tryAcquire[A, R, B, E](acquire: A => Either[E, (R, B)], release: Option[R => Unit]): Val[A] -⚬ Val[E] |+| Res[R] |*| Val[B]

Acquires a resource of type R. Might fail with an error of type E.

Acquires a resource of type R. Might fail with an error of type E.

Type Params
A

parameters of the acquire function

B

additional data produced by acquiring the resource

E

type of the error

R

type of the resource

Value Params
release

called to release the resource in case of a crash. None means no cleanup is needed

def trySplitResource[R, A, S, T, B, E](f: (R, A) => Either[E, (S, T, B)], release1: Option[S => Unit], release2: Option[T => Unit]): Res[R] |*| Val[A] -⚬ Val[E] |+| Res[S] |*| Res[T] |*| Val[B]
def tryTransformResource[R, A, S, B, E](f: (R, A) => Either[E, (S, B)], release: Option[S => Unit]): Res[R] |*| Val[A] -⚬ Val[E] |+| Res[S] |*| Val[B]

Transforms a resource into a resource of (possibly) different type. Might fail with an error of type E.

Transforms a resource into a resource of (possibly) different type. Might fail with an error of type E.

Type Params
A

additional parameter of the transformation

B

additional output of the transformation

E

type of the error

R

type of the input resource

S

type of the output resource

Value Params
f

the transformation function. It receives the input resource and additional input of type A. It returns either an error of type E or the new resource and additional output of type B. In case the transformation results in an error, the original resource is ''not'' released automatically— the passing of the original resource R to the transformation function f indicates transfer of responsibility for the resource to the function f.

release

called to release the new resource in case of a crash. None means no cleanup is needed

def unliftEither[A, B]: Val[A] |+| Val[B] -⚬ Val[Either[A, B]]
def unliftNegPair[A, B]: Neg[A] |*| Neg[B] -⚬ Neg[(A, B)]

Inherited methods

def andThen[A, B, C](f: A -⚬ B, g: B -⚬ C): A -⚬ C
Inherited from
CoreDSL
def assocLR[A, B, C]: A |*| B |*| C -⚬ A |*| B |*| C
Inherited from
CoreDSL
def assocRL[A, B, C]: A |*| B |*| C -⚬ A |*| B |*| C
Inherited from
CoreDSL
def backvert[A]: A |*| -[A] -⚬ One
Inherited from
InvertDSL
def choice[A, B, C](caseLeft: A -⚬ B, caseRight: A -⚬ C): A -⚬ B |&| C
Inherited from
CoreDSL
def chooseL[A, B]: A |&| B -⚬ A
Inherited from
CoreDSL
def chooseLOnPong[A, B]: A |&| B -⚬ Pong |*| A
Inherited from
CoreDSL
def chooseR[A, B]: A |&| B -⚬ B
Inherited from
CoreDSL
def chooseROnPong[A, B]: A |&| B -⚬ Pong |*| B
Inherited from
CoreDSL
def coDistributeL[A, B, C]: A |*| B |&| A |*| C -⚬ A |*| B |&| C

Inverse of coFactorL.

Inverse of coFactorL.

Inherited from
CoreDSL
def coDistributeR[A, B, C]: A |*| C |&| B |*| C -⚬ A |&| B |*| C

Inverse of coFactorR.

Inverse of coFactorR.

Inherited from
CoreDSL
def coFactorL[A, B, C]: A |*| B |&| C -⚬ A |*| B |&| A |*| C
Inherited from
CoreDSL
def coFactorR[A, B, C]: A |&| B |*| C -⚬ A |*| C |&| B |*| C
Inherited from
CoreDSL
def contrapositive[A, B](f: A -⚬ B): -[B] -⚬ -[A]
Inherited from
InvertDSL
def crashNow[A, B](msg: String): A -⚬ B
Inherited from
CrashDSL
def crashWhenDone[A, B](msg: String): Done |*| A -⚬ B

Starts propagating an error downstream (which might be through both the in-port and the out-port).

Starts propagating an error downstream (which might be through both the in-port and the out-port).

Use only for irrecoverable errors. Recoverable errors should be expressed in function signature and handled appropriately.

Done on the in-port is the trigger to crash. A on the in-port allows to consume any unhandled resources. B on the out-port allows to fulfill any obligation to produce resources.

Inherited from
CrashDSL
def crashWhenNeed[A, B](msg: String): A -⚬ Need |*| B
Inherited from
CrashDSL
def crashd(msg: String): Done -⚬ Done
Inherited from
CrashDSL
def crashn(msg: String): Need -⚬ Need
Inherited from
CrashDSL
override
def curry[A, B, C](f: A |*| B -⚬ C): A -⚬ B =⚬ C
Definition Classes
Inherited from
InvertDSL
def delayNeed(d: FiniteDuration): Need -⚬ Need
Inherited from
TimerDSL
def demand[A]: One -⚬ -[A] |*| A

Creates a demand on the first out-port, channeling the provided resource to the second out-port. Alias for forevert.

Creates a demand on the first out-port, channeling the provided resource to the second out-port. Alias for forevert.

Inherited from
InvertDSL
def demandChoice[A, B]: -[A] |+| -[B] -⚬ -[A |&| B]

Converts an obligation to handle either demand to an obligation to supply a choice. Alias for factorInversionOutOf_|+|.

Converts an obligation to handle either demand to an obligation to supply a choice. Alias for factorInversionOutOf_|+|.

Inherited from
InvertDSL
def demandChosen[A, B]: -[A |&| B] -⚬ -[A] |+| -[B]

Converts a demand for choice to a demand of the chosen side. Alias for distributeInversionInto_|&amp;|.

Converts a demand for choice to a demand of the chosen side. Alias for distributeInversionInto_|&amp;|.

Inherited from
InvertDSL
def demandEither[A, B]: -[A] |&| -[B] -⚬ -[A |+| B]

Converts choice of demands to demand of either. Alias for factorInversionOutOf_|&amp;|.

Converts choice of demands to demand of either. Alias for factorInversionOutOf_|&amp;|.

Inherited from
InvertDSL
def demandSeparately[A, B]: -[A |*| B] -⚬ -[A] |*| -[B]
Inherited from
InvertDSL
def demandTogether[A, B]: -[A] |*| -[B] -⚬ -[A |*| B]

Alias for factorOutInversion.

Alias for factorOutInversion.

Inherited from
InvertDSL
def die[A]: -[-[A]] -⚬ A

Double-inversion elimination.

Double-inversion elimination.

Inherited from
InvertDSL
def dii[A]: A -⚬ -[-[A]]

Double-inversion introduction.

Double-inversion introduction.

Inherited from
InvertDSL
Inherited from
CoreDSL
Inherited from
CoreDSL
def distributeInversion[A, B]: -[A |*| B] -⚬ -[A] |*| -[B]
Inherited from
InvertDSL
def distributeInversionInto_|&|[A, B]: -[A |&| B] -⚬ -[A] |+| -[B]
Inherited from
InvertDSL
def distributeInversionInto_|+|[A, B]: -[A |+| B] -⚬ -[A] |&| -[B]
Inherited from
InvertDSL
def distributeL[A, B, C]: A |*| B |+| C -⚬ A |*| B |+| A |*| C

Distribute the factor on the left into the summands on the right. Inverse of factorL.

Distribute the factor on the left into the summands on the right. Inverse of factorL.

Inherited from
CoreDSL
def distributeR[A, B, C]: A |+| B |*| C -⚬ A |*| C |+| B |*| C

Distribute the factor on the right into the summands on the left. Inverse of factorR.

Distribute the factor on the right into the summands on the left. Inverse of factorR.

Inherited from
CoreDSL
Inherited from
CoreDSL

Alias for die.

Alias for die.

Inherited from
InvertDSL

Alias for dii.

Alias for dii.

Inherited from
InvertDSL
def either[A, B, C](caseLeft: A -⚬ C, caseRight: B -⚬ C): A |+| B -⚬ C
Inherited from
CoreDSL
def elimFst[A, B](f: A -⚬ One): A |*| B -⚬ B
Inherited from
CoreDSL
def elimFst[B]: One |*| B -⚬ B
Inherited from
CoreDSL
def elimSnd[A, B](f: B -⚬ One): A |*| B -⚬ A
Inherited from
CoreDSL
def elimSnd[A]: A |*| One -⚬ A
Inherited from
CoreDSL
override
def eval[A, B]: A =⚬ B |*| A -⚬ B
Definition Classes
Inherited from
InvertDSL
def factorInversionOutOf_|&|[A, B]: -[A] |&| -[B] -⚬ -[A |+| B]
Inherited from
InvertDSL
def factorInversionOutOf_|+|[A, B]: -[A] |+| -[B] -⚬ -[A |&| B]
Inherited from
InvertDSL
def factorL[A, B, C]: A |*| B |+| A |*| C -⚬ A |*| B |+| C

Factor out the factor A on the left of both summands.

Factor out the factor A on the left of both summands.

Inherited from
CoreDSL
def factorOutInversion[A, B]: -[A] |*| -[B] -⚬ -[A |*| B]
Inherited from
InvertDSL
def factorR[A, B, C]: A |*| C |+| B |*| C -⚬ A |+| B |*| C

Factor out the factor C on the right of both summands.

Factor out the factor C on the right of both summands.

Inherited from
CoreDSL
def forevert[A]: One -⚬ -[A] |*| A
Inherited from
InvertDSL
Inherited from
CoreDSL
def forkMap[A, B](f: Done -⚬ A, g: Done -⚬ B): Done -⚬ A |*| B
Inherited from
CoreDSL
def forkMapNeed[A, B](f: A -⚬ Need, g: B -⚬ Need): A |*| B -⚬ Need
Inherited from
CoreDSL
Inherited from
CoreDSL
Inherited from
CoreDSL
Inherited from
CoreDSL
def fst[A, B, C](f: A -⚬ B): A |*| C -⚬ B |*| C
Inherited from
CoreDSL
def id[A]: A -⚬ A
Inherited from
CoreDSL
def injectL[A, B]: A -⚬ A |+| B
Inherited from
CoreDSL
def injectLOnPing[A, B]: Ping |*| A -⚬ A |+| B
Inherited from
CoreDSL
def injectR[A, B]: B -⚬ A |+| B
Inherited from
CoreDSL
def injectROnPing[A, B]: Ping |*| B -⚬ A |+| B
Inherited from
CoreDSL
def introFst[A, X](f: One -⚬ X): A -⚬ X |*| A
Inherited from
CoreDSL
def introFst[B]: B -⚬ One |*| B
Inherited from
CoreDSL
def introSnd[A, X](f: One -⚬ X): A -⚬ A |*| X
Inherited from
CoreDSL
def introSnd[A]: A -⚬ A |*| One
Inherited from
CoreDSL
def invertClosure[A, B]: -[A =⚬ B] -⚬ B =⚬ A
Inherited from
InvertDSL
Inherited from
CoreDSL
def joinMap[A, B](f: A -⚬ Done, g: B -⚬ Done): A |*| B -⚬ Done
Inherited from
CoreDSL
def joinMapNeed[A, B](f: Need -⚬ A, g: Need -⚬ B): Need -⚬ A |*| B
Inherited from
CoreDSL
Inherited from
CoreDSL
Inherited from
CoreDSL
Inherited from
CoreDSL

Reverses the Need signal (flowing in the negative direciton, i.e. against the -⚬ arrow) into a Done signal (flowing in the positive direction, i.e. along the -⚬ arrow).

Reverses the Need signal (flowing in the negative direciton, i.e. against the -⚬ arrow) into a Done signal (flowing in the positive direction, i.e. along the -⚬ arrow).

 ┏━━━━━━┓
 ┃      ┞────┐
 ┃   ┌┄┄╎Need│
 ┃   ┆  ┟────┘
 ┃   ┆  ┃
 ┃   ┆  ┞────┐
 ┃   └┄→╎Done│
 ┃      ┟────┘
 ┗━━━━━━┛
Inherited from
CoreDSL
Inherited from
CoreDSL
def notifyChoice[A, B]: Pong |*| A |&| B -⚬ A |&| B

Signals (in the negative direction) when it is known which side of the choice (A |&| B) has been chosen.

Signals (in the negative direction) when it is known which side of the choice (A |&| B) has been chosen.

Inherited from
CoreDSL
Inherited from
CoreDSL
Inherited from
CoreDSL
def notifyEither[A, B]: A |+| B -⚬ Ping |*| A |+| B

Signals when it is decided whether A |+| B actually contains the left side or the right side.

Signals when it is decided whether A |+| B actually contains the left side or the right side.

Inherited from
CoreDSL
Inherited from
CoreDSL
Inherited from
CoreDSL
def obj[A, B](f: A -⚬ B): One -⚬ A =⚬ B

Turn a function into a function object.

Turn a function into a function object.

Inherited from
ClosedDSL
override
def out[A, B, C](f: B -⚬ C): A =⚬ B -⚬ A =⚬ C
Definition Classes
Inherited from
InvertDSL
def pack[F[_]]: F[Rec[F]] -⚬ Rec[F]

Hides one level of a recursive type definition.

Hides one level of a recursive type definition.

Inherited from
CoreDSL
def packDemand[F[_]]: -[F[Rec[F]]] -⚬ -[Rec[F]]
Inherited from
InvertDSL
def par[A, B, C, D](f: A -⚬ B, g: C -⚬ D): A |*| C -⚬ B |*| D
Inherited from
CoreDSL
Inherited from
CoreDSL
Inherited from
CoreDSL

Reverses the Done signal (flowing in the positive direction, i.e. along the -⚬ arrow) into a Need signal (flowing in the negative direciton, i.e. against the -⚬ arrow).

Reverses the Done signal (flowing in the positive direction, i.e. along the -⚬ arrow) into a Need signal (flowing in the negative direciton, i.e. against the -⚬ arrow).

 ┏━━━━━━━━━━━┓
 ┞────┐      ┃
 ╎Done│┄┄┐   ┃
 ┟────┘  ┆   ┃
 ┃       ┆   ┃
 ┞────┐  ┆   ┃
 ╎Need│←┄┘   ┃
 ┟────┘      ┃
 ┗━━━━━━━━━━━┛
Inherited from
CoreDSL

Races the two Ping signals. Produces left if the first signal wins and right if the second signal wins. It is biased to the left: if both signals have arrived by the time of inquiry, returns left.

Races the two Ping signals. Produces left if the first signal wins and right if the second signal wins. It is biased to the left: if both signals have arrived by the time of inquiry, returns left.

Inherited from
CoreDSL
def rec[A, B](f: A -⚬ B => A -⚬ B): A -⚬ B
Inherited from
CoreDSL

Races the two Pong signals (traveling from right to left). Chooses left if the first signal wins and right if the second signal wins. It is biased to the left: if both signals have arrived by the time of inquiry, chooses left.

Races the two Pong signals (traveling from right to left). Chooses left if the first signal wins and right if the second signal wins. It is biased to the left: if both signals have arrived by the time of inquiry, chooses left.

Inherited from
CoreDSL
def snd[A, B, C](f: B -⚬ C): A |*| B -⚬ A |*| C
Inherited from
CoreDSL
Inherited from
CoreDSL
Inherited from
CoreDSL
def supply[A]: A |*| -[A] -⚬ One

Uses the resource from the first in-port to satisfy the demand from the second in-port. Alias for backvert.

Uses the resource from the first in-port to satisfy the demand from the second in-port. Alias for backvert.

Inherited from
InvertDSL
def swap[A, B]: A |*| B -⚬ B |*| A
Inherited from
CoreDSL
def toChoiceOfDemands[A, B]: -[A |+| B] -⚬ -[A] |&| -[B]

Converts demand for either to a choice of which side to supply. Alias for distributeInversionInto_|+|.

Converts demand for either to a choice of which side to supply. Alias for distributeInversionInto_|+|.

Inherited from
InvertDSL
def unContrapositive[A, B](f: -[A] -⚬ -[B]): B -⚬ A
Inherited from
InvertDSL
def unInvertClosure[A, B]: A =⚬ B -⚬ -[B =⚬ A]
Inherited from
InvertDSL
def uncurry[A, B, C](f: A -⚬ B =⚬ C): A |*| B -⚬ C
Inherited from
ClosedDSL
def unpack[F[_]]: Rec[F] -⚬ F[Rec[F]]

Unpacks one level of a recursive type definition.

Unpacks one level of a recursive type definition.

Inherited from
CoreDSL
def unpackDemand[F[_]]: -[Rec[F]] -⚬ -[F[Rec[F]]]
Inherited from
InvertDSL
def Λ[A, B](f: $[A] => $[B])(implicit file: File, line: Line): $[A =⚬ B]

Creates a closure (A =⚬ B), i.e. a function that captures variables from the outer scope, as an expression ($[A =⚬ B]) that can be used in outer λ or Λ.

Creates a closure (A =⚬ B), i.e. a function that captures variables from the outer scope, as an expression ($[A =⚬ B]) that can be used in outer λ or Λ.

Inherited from
ClosedDSL
def λ[A, B](f: $[A] => $[B])(implicit file: File, line: Line): A -⚬ B

Used to define a linear function A -⚬ B in a point-full style, i.e. as a lambda expression.

Used to define a linear function A -⚬ B in a point-full style, i.e. as a lambda expression.

Recall that when defining A -⚬ B, we never get a hold of a: A as a Scala value. However, by using this method we get a hold of a: $[A], a placeholder variable, and construct the result expression $[B]. This method then inspects how the input variable a: $[A] is used in the result $[B] and infers a (point-free) construction of A -⚬ B.

Throws
NotLinearException

if the given function violates linearity, i.e. if the input variable is not used exactly once.

UnboundVariablesException

if the result expression contains free variables (from outer λs).

Inherited from
CoreDSL

Inherited fields

override
Inherited from
ClosedDSL

Implicits

Inherited implicits

final implicit
def DemandExprOps[B](expr: $[-[B]]): DemandExprOps[B]
Inherited from
InvertDSL