Priority queue: Difference between revisions

Content added Content deleted
(→‎{{header|Rust}}: Added rust)
Line 2,969: Line 2,969:
Sleep
Sleep
Exercise</pre>
Exercise</pre>

=={{header|Phix}}==
Dictionary based solution. Allows duplicate tasks, FIFO within priority, and uses a callback-style method of performing tasks.<br>
Assumes 5 is the highest priority and should be done first, for 1 first just delete the ",true" on traverse_dict calls.
<lang Phix>integer tasklist = new_dict()

procedure add_task(integer priority, string desc)
integer k = getd_index(priority,tasklist)
if k=0 then
putd(priority,{desc},tasklist)
else
sequence descs = getd_by_index(k,tasklist)
putd(priority,append(descs,desc),tasklist)
end if
end procedure

function list_task_visitor(integer priority, sequence descs, integer /*user_data*/)
?{priority,descs}
return 1
end function

procedure list_tasks()
traverse_dict(routine_id("list_task_visitor"), 0, tasklist,true)
end procedure

function pop_task_visitor(integer priority, sequence descs, integer rid)
string desc = descs[1]
descs = descs[2..$]
if length(descs)=0 then
deld(priority,tasklist)
else
putd(priority,descs,tasklist)
end if
call_proc(rid,{priority,desc})
return 0
end function

procedure pop_task(integer rid)
if dict_size(tasklist)!=0 then
traverse_dict(routine_id("pop_task_visitor"), rid, tasklist,true)
end if
end procedure

add_task(3,"Clear drains")
add_task(4,"Feed cat")
add_task(5,"Make tea")
add_task(1,"Solve RC tasks")
add_task(2,"Tax return")

procedure do_task(integer priority, string desc)
?{priority,desc}
end procedure

list_tasks()
?"==="
pop_task(routine_id("do_task"))
?"==="
list_tasks()</lang>
{{out}}
<pre>
{5,{"Make tea"}}
{4,{"Feed cat"}}
{3,{"Clear drains"}}
{2,{"Tax return"}}
{1,{"Solve RC tasks"}}
"==="
{5,"Make tea"}
"==="
{4,{"Feed cat"}}
{3,{"Clear drains"}}
{2,{"Tax return"}}
{1,{"Solve RC tasks"}}
</pre>


=={{header|PHP}}==
=={{header|PHP}}==