Sometimes a source of data is not explicitly represented by a list or other data structure. Instead, it is made available through a site, which returns the values one at a time, each time it is called. We call such a site a stream. It is analogous to an iterator in a language like Java. Functions can also be used as streams, though typically they will not be pure functions, and should only return one value. A call to a stream may halt, to indicate that the end of the data has been reached, and no more values will become available. It is often useful to detect the end of a stream using the otherwise combinator.
Streams are common enough in Orc programming that there is a library function to take all of the
available publications from a stream; it is called
repeat, and it is analogous to
each for lists.
def repeat(f) = f() >x> (x | repeat(f))
repeat function calls the site or function
f with no arguments,
publishes its return value, and recurses to query for more values.
be used with sites or functions that block until a value is available. Notice that if any
f halts, then
repeat(f) consequently halts.
For example, it is very easy to treat a channel
c as a stream, reading any
values put on the channel as they become available: