here's how to do something like select(), i.e. read from one of several
channels, which every is ready first:
proc multiplex (i1:ischannel[int], i2:ischannel[int], o:oschannel[int]) {
spawn_fthread { while true do var x = read i1; write (o,x); done };
spawn_fthread { while true do var x = read i2; write (o,x); done };
}
var i1,o1 = mk_ioschannel_pair[int]();
var i2,o2 = mk_ioschannel_pair[int]();
var i3,o3 = mk_ioschannel_pair[int]();
spawn_fthread { multiplex (i1, i2, o3); };
spawn_fthread { write (o1, 1); };
spawn_fthread { write (o2, 2); };
println$ read i3;
println$ read i3;
This particular code only handles two channels but is easily
generalised to an array or list. [Just remember closures built
on loops don't do what you might think!!!!!!]
Clearly the channels have to have the same type.
This multiplexer doesn't tell which channel provided
the data, but that is easy to fix (just make the output
channel type a pair: an identifier and the data)
--
john skaller
[email protected]
http://felix-lang.org
------------------------------------------------------------------------------
Keep yourself connected to Go Parallel:
TUNE You got it built. Now make it sing. Tune shows you how.
http://goparallel.sourceforge.net
_______________________________________________
Felix-language mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/felix-language