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))
The repeat
function calls the site or function f
with no arguments,
publishes its return value, and recurses to query for more values. repeat
should
be used with sites or functions that block until a value is available. Notice that if any
call to 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:
repeat(c.get)