NAME

List::Priority - Perl extension for a list that manipulates objects by their priority

SYNOPSIS

use List::Priority;

# Create an instance
my $list = List::Priority->new();

# Insert some elements, each with a unique priority
$list->insert(2,'World!');
$list->insert(5,'Hello');
$list->insert(3,' ');

# Print
print $list->size()			# prints 3
while (my $element = $list->pop()) {
	  print $element;
}

DESCRIPTION

If you want to handle multiple data items by their order of importance, this one's for you.

You may retrieve the highest-priority item from the list using pop(), or the lowest-priority item from the list using shift(). If two items have the same priority, they are returned in first-in, first-out order. New items are inserted using insert().

You can constrain the capacity of the list using the capacity parameter. Low-priority items are automatically evicted once the specified capacity is exceeded. By default the list's capacity is unlimited.

Currently insertion (in ordered or random order) is constant-time, but shift and pop are linear in the number of priorities. Hence List::Priority is a good choice if one of the following conditions is true:

  • you need one of its unusual features, like the ability to remove both high- and low-priority items, or to constrain the list's capacity,

  • you need to do a lot of inserting, but the list will never contain more than a few thousand different priority levels.

If neither of these describes your use case, another priority queue implementation like POE::XS::Queue::Array may perform better.

I'd like to thank Joseph N. Hall and Randal L. Schwartz for their excellent book "Effective Perl Programming" for one of the code hacks.

METHODS

new
$p_list = List::Priority->new();

new is the constructor for List::Priority objects. It accepts a key-value list with the list attributes.

  • capacity

    The maximum size of the list.

    Inserting after the capacity is reached will result either in a no-op, or the removal of the most recent lowest priority objects, according to the insert()'s priority.

    $list = List::Priority->new(capacity => 10);
insert
$result = $p_list->insert($priority, $scalar);

Inserts the scalar to the list. Time taken is approximately constant.

$priority must be numeric. $scalar can be any scalar, including references (objects).

Returns 1 on success, and a string describing the error upon failure.

pop
$object = $p_list->pop();

Extracts the highest-priority scalar from the list. Time taken is approximately linear in the number of priorities already in the list.

Returns the highest-priority object on success, and undef on failure.

shift
$object = $p_list->shift();

Extracts the lowest-priority scalar from the list. Time taken is approximately linear in the number of priorities already in the list.

Returns the lowest-priority object on success, undef on failure.

highest_priority
$priority = $p_list->highest_priority();

Returns the priority of the highest-priority item. Time taken is linear in the number of priorities in the list.

lowest_priority
$priority = $p_list->lowest_priority();

Returns the priority of the lowest-priority item. Time taken is linear in the number of priorities in the list.

size
$num_elts = $p_list->size();

Takes no arguments. Returns the number of elements in the priority queue. Time taken is constant.

capacity
my $capacity = $l->capacity();  # get capacity
$l->capacity($new_capacity);    # set capacity to $new_capacity
$l->capacity(undef);            # set capacity to infinity

Get/set the list's capacity. If called with an argument, sets the capacity to that value, discarding any excess low-priority items. To make the capacity infinite (the default for new lists), call capacity() with an explicit undefined argument. Time taken is O($old_capacity - $new_capacity) if $new_capacity < $old_capacity, constant otherwise.

Returns the (new) capacity.

EXPORT

None. All interfaces are OO.

TODO

More tests.

AUTHOR

Eyal Udassin, <eyaludassin@hotmail.com>

Currently maintained by Miles Gould, <miles@assyrian.org.uk>

Thanks to Maik Hentsche for bugfixes.

CONTRIBUTING

You can find the Git repository at http://github.com/pozorvlak/List-Priority.

SEE ALSO

Heap::Priority, List::PriorityQueue, Hash::PriorityQueue, POE::Queue, Timeout::Queue, Data::PrioQ::SkewBinomial.