RosettaCodeData/Task/Priority-queue/Zkl/priority-queue-1.zkl

21 lines
805 B
Plaintext

class PQ{
fcn init(numLevels=10){ // 0..numLevels, bigger # == lower priorty
var [const] queue=(1).pump(numLevels+1,List.createLong(numLevels).write,L().copy);
}
fcn add(item,priorty){ queue[priorty].append(item); }
fcn peek{ if(q:=queue.filter1()) return(q[-1]); Void }// -->Void if empty
fcn pop { if(q:=queue.filter1()) return(q.pop()); Void }// -->Void if empty
var [private] state=L();
fcn [private] next{ // iterate
qi,ii:=state;
foreach n in ([qi..queue.len()-1]){
q:=queue[n];
if(ii>=q.len()) ii=0;
else{ state.clear().append(n,ii+1); return(q[ii]) }
}
Void.Stop
}
fcn walker{ state.clear().append(0,0); Walker(next) } // iterator front end
fcn toString{ "PQ(%d) items".fmt(queue.reduce(fcn(sum,q){ sum+q.len() },0)) }
}