A source can be used to receive elements from a channel.

trait Source[+T]:
  def receive(): T

Same as .send, the .receive method might block the current thread.

Creating sources

Sources can be created by instantiating a new channel, or using one of the many factory methods on the Source companion object, e.g.:

import ox.supervised
import ox.channels.Source

import scala.concurrent.duration.*

supervised {
  Source.fromValues(1, 2, 3)
  Source.tick(1.second, "x")
  Source.iterate(0)(_ + 1) // natural numbers

Each such source creates a fork, which takes care of sending the elements to the channel, once capacity is available. If the enclosing supervised scope ends, each such fork is cancelled.