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()