14 lines
588 B
Text
14 lines
588 B
Text
fcn mergeStreams(s1,s2,etc){ //-->Walker
|
|
streams:=vm.arglist.pump(List(),fcn(s){ // prime and prune
|
|
if( (w:=s.walker())._next() ) return(w);
|
|
Void.Skip // stream is dry
|
|
});
|
|
Walker().tweak(fcn(streams){
|
|
if(not streams) return(Void.Stop); // all streams are dry
|
|
values:=streams.apply("value"); // head of the streams
|
|
v:=values.reduce('wrap(min,x){ if(min<=x) min else x });
|
|
n:=values.find(v); w:=streams[n]; w._next(); // read next value from min stream
|
|
if(w.atEnd) streams.del(n); // prune empty streams
|
|
v
|
|
}.fp(streams));
|
|
}
|