The otherwise combinator is also useful for trying alternatives in sequence. Consider an expression of
the form F0 ; F1 ; F2 ; ...
. If Fi does not publish
and halts, then Fi+1 is executed. We can think of the Fi's as a series of
alternatives that are explored until a publication occurs.
Suppose that we would like to poll a list of channels for available data. The list of channels is ordered by priority. The first channel in the list has the highest priority, so it is polled first. If it has no data, then the next channel is polled, and so on.
Here is a function which polls a prioritized list of channels in this way. It
publishes the first item that it finds, removing it from the originating
channel. If all channels are empty, the function halts. We use the getnb
("get non-blocking") method of the channel, which retrieves the first
available item if there is one, and halts otherwise.
def priorityPoll([]) = stop def priorityPoll(b:bs) = b.getD() ; priorityPoll(bs)