Documentation

Std.Sync.Channel

This module contains the implementation of Std.Channel. Std.Channel is a multi-producer multi-consumer FIFO channel that offers both bounded and unbounded buffering as well as synchronous and asynchronous APIs.

Additionally Std.CloseableChannel is provided in case closing the channel is of interest. The two are distinct as the non closable Std.Channel can never throw errors which makes for cleaner code.

Errors that may be thrown while interacting with the channel API.

  • closed : Error

    Tried to send to a closed channel.

  • alreadyClosed : Error

    Tried to close an already closed channel.

Instances For
Equations
  • One or more equations did not get rendered due to their size.
Equations
  • One or more equations did not get rendered due to their size.

A multi-producer multi-consumer FIFO channel that offers both bounded and unbounded buffering and an asynchronous API, to switch into synchronous mode use CloseableChannel.sync.

Additionally Std.CloseableChannel can be closed if necessary, unlike Std.Channel. This introduces a need for error handling in some cases, thus it is usually easier to use Std.Channel if applicable.

Equations
Instances For

A multi-producer multi-consumer FIFO channel that offers both bounded and unbounded buffering and a synchronous API. This type acts as a convenient layer to use a channel in a blocking fashion and is not actually different from the original channel.

Additionally Std.CloseableChannel.Sync can be closed if necessary, unlike Std.Channel.Sync. This introduces the need to handle errors in some cases, thus it is usually easier to use Std.Channel if applicable.

Equations
Instances For

Create a new channel, if:

  • capacity is none it will be unbounded (the default)
  • capacity is some 0 it will always force a rendezvous between sender and receiver
  • capacity is some n with n > 0 it will use a buffer of size n and begin blocking once it is filled
Equations

Try to send a value to the channel, if this can be completed right away without blocking return true, otherwise don't send the value and return false.

Equations

Send a value through the channel, returning a task that will resolve once the transmission could be completed. Note that the task may resolve to Except.error if the channel was closed before it could be completed.

Equations

Closes the channel, returns Except.ok when called the first time, otherwise Except.error. When a channel is closed:

  • no new values can be sent successfully anymore
  • all blocked consumers are resolved to none (as no new messages can be sent they will never resolve)
  • if there are already values waiting to be received they can still be received by subsequent recv calls
Equations

Try to receive a value from the channel, if this can be completed right away without blocking return some value, otherwise return none.

Equations

Receive a value from the channel, returning a task that will resolve once the transmission could be completed. Note that the task may resolve to none if the channel was closed before it could be completed.

Equations

Creates a Selector that resolves once ch has data available and provides that that data. In particular if ch is closed while waiting on this Selector and no data is available already this will resolve to none.

Equations

ch.forAsync f calls f for every message received on ch.

Note that if this function is called twice, each message will only arrive at exactly one invocation.

@[inline]

This function is a no-op and just a convenient way to expose the synchronous API of the channel.

Equations
@[inline]
def Std.CloseableChannel.Sync.new {α : Type} (capacity : Option Nat := none) :

Create a new channel, if:

  • capacity is none it will be unbounded (the default)
  • capacity is some 0 it will always force a rendezvous between sender and receiver
  • capacity is some n with n > 0 it will use a buffer of size n and begin blocking once it is filled
Equations
@[inline]
def Std.CloseableChannel.Sync.trySend {α : Type} (ch : Sync α) (v : α) :

Try to send a value to the channel, if this can be completed right away without blocking return true, otherwise don't send the value and return false.

Equations
def Std.CloseableChannel.Sync.send {α : Type} (ch : Sync α) (v : α) :

Send a value through the channel, blocking until the transmission could be completed. Note that this function may throw an error when trying to send to an already closed channel.

Equations
@[inline]

Closes the channel, returns Except.ok when called the first time, otherwise Except.error. When a channel is closed:

  • no new values can be sent successfully anymore
  • all blocked consumers are resolved to none (as no new messages can be sent they will never resolve)
  • if there are already values waiting to be received they can still be received by subsequent recv calls
Equations
@[inline]

Return true if the channel is closed.

Equations
@[inline]

Try to receive a value from the channel, if this can be completed right away without blocking return some value, otherwise return none.

Equations

Receive a value from the channel, blocking until the transmission could be completed. Note that the return value may be none if the channel was closed before it could be completed.

Equations

for msg in ch.sync do ... receives all messages in the channel until it is closed.

Equations
  • One or more equations did not get rendered due to their size.
structure Std.Channel (α : Type) :

A multi-producer multi-consumer FIFO channel that offers both bounded and unbounded buffering and an asynchronous API, to switch into synchronous mode use Channel.sync.

If a channel needs to be closed to indicate some sort of completion event use Std.CloseableChannel instead. Note that Std.CloseableChannel introduces a need for error handling in some cases, thus Std.Channel is usually easier to use if applicable.

Instances For

A multi-producer multi-consumer FIFO channel that offers both bounded and unbounded buffering and a synchronous API. This type acts as a convenient layer to use a channel in a blocking fashion and is not actually different from the original channel.

If a channel needs to be closed to indicate some sort of completion event use Std.CloseableChannel.Sync instead. Note that Std.CloseableChannel.Sync introduces a need for error handling in some cases, thus Std.Channel.Sync is usually easier to use if applicable.

Equations
Instances For
@[inline]
def Std.Channel.new {α : Type} (capacity : Option Nat := none) :

Create a new channel, if:

  • capacity is none it will be unbounded (the default)
  • capacity is some 0 it will always force a rendezvous between sender and receiver
  • capacity is some n with n > 0 it will use a buffer of size n and begin blocking once it is filled
Equations
@[inline]
def Std.Channel.trySend {α : Type} (ch : Channel α) (v : α) :

Try to send a value to the channel, if this can be completed right away without blocking return true, otherwise don't send the value and return false.

Equations
def Std.Channel.send {α : Type} (ch : Channel α) (v : α) :

Send a value through the channel, returning a task that will resolve once the transmission could be completed.

Equations
  • One or more equations did not get rendered due to their size.
@[inline]
def Std.Channel.tryRecv {α : Type} (ch : Channel α) :

Try to receive a value from the channel, if this can be completed right away without blocking return some value, otherwise return none.

Equations
def Std.Channel.recv {α : Type} [Inhabited α] (ch : Channel α) :

Receive a value from the channel, returning a task that will resolve once the transmission could be completed. Note that the task may resolve to none if the channel was closed before it could be completed.

Equations
  • One or more equations did not get rendered due to their size.

Creates a Selector that resolves once ch has data available and provides that that data.

Equations
  • One or more equations did not get rendered due to their size.
partial def Std.Channel.forAsync {α : Type} [Inhabited α] (f : αBaseIO Unit) (ch : Channel α) (prio : Task.Priority := Task.Priority.default) :

ch.forAsync f calls f for every message received on ch.

Note that if this function is called twice, each message will only arrive at exactly one invocation.

@[inline]
def Std.Channel.sync {α : Type} (ch : Channel α) :
Sync α

This function is a no-op and just a convenient way to expose the synchronous API of the channel.

Equations
@[inline]
def Std.Channel.Sync.new {α : Type} (capacity : Option Nat := none) :

Create a new channel, if:

  • capacity is none it will be unbounded (the default)
  • capacity is some 0 it will always force a rendezvous between sender and receiver
  • capacity is some n with n > 0 it will use a buffer of size n and begin blocking once it is filled
Equations
@[inline]
def Std.Channel.Sync.trySend {α : Type} (ch : Sync α) (v : α) :

Try to send a value to the channel, if this can be completed right away without blocking return true, otherwise don't send the value and return false.

Equations
def Std.Channel.Sync.send {α : Type} (ch : Sync α) (v : α) :

Send a value through the channel, blocking until the transmission could be completed.

Equations
@[inline]
def Std.Channel.Sync.tryRecv {α : Type} (ch : Sync α) :

Try to receive a value from the channel, if this can be completed right away without blocking return some value, otherwise return none.

Equations
def Std.Channel.Sync.recv {α : Type} [Inhabited α] (ch : Sync α) :

Receive a value from the channel, blocking until the transmission could be completed.

Equations

for msg in ch.sync do ... receives all messages in the channel until it is closed.

Equations
  • One or more equations did not get rendered due to their size.