summaryrefslogtreecommitdiffstats
path: root/Net/IRC/EventQueue.pm
diff options
context:
space:
mode:
authorLibravatarWilliam Heimbigner <william.heimbigner@gmail.com>2014-04-23 18:36:38 +0400
committerLibravatarWilliam Heimbigner <william.heimbigner@gmail.com>2014-04-23 18:36:38 +0400
commit87cf6352810c00952a79e58a1d418a28be01b33c (patch)
tree350ee3c59f8c1e69b642801b0561e2ad34bb44c9 /Net/IRC/EventQueue.pm
parent534ca688d9c9c6ecd6584e53dca5cf0b3d996632 (diff)
Added Net-IRC to the repo
Diffstat (limited to 'Net/IRC/EventQueue.pm')
-rw-r--r--Net/IRC/EventQueue.pm73
1 files changed, 73 insertions, 0 deletions
diff --git a/Net/IRC/EventQueue.pm b/Net/IRC/EventQueue.pm
new file mode 100644
index 0000000..fdb7b44
--- /dev/null
+++ b/Net/IRC/EventQueue.pm
@@ -0,0 +1,73 @@
+package Net::IRC::EventQueue;
+
+use Net::IRC::EventQueue::Entry;
+
+use strict;
+
+sub new {
+ my $class = shift;
+
+ my $self = {
+ 'queue' => {},
+ };
+
+ bless $self, $class;
+}
+
+sub queue {
+ my $self = shift;
+ return $self->{'queue'};
+}
+
+sub enqueue {
+ my $self = shift;
+ my $time = shift;
+ my $content = shift;
+
+ my $entry = new Net::IRC::EventQueue::Entry($time, $content);
+ $self->queue->{$entry->id} = $entry;
+ return $entry->id;
+}
+
+sub dequeue {
+ my $self = shift;
+ my $event = shift;
+ my $result;
+
+ if(!$event) { # we got passed nothing, so return the first event
+ $event = $self->head();
+ delete $self->queue->{$event->id};
+ $result = $event;
+ } elsif(!ref($event)) { # we got passed an id
+ $result = $self->queue->{$event};
+ delete $self->queue->{$event};
+ } else { # we got passed an actual event object
+ ref($event) eq 'Net::IRC::EventQueue::Entry'
+ or die "Cannot delete event type of " . ref($event) . "!";
+
+ $result = $self->queue->{$event->id};
+ delete $self->queue->{$event->id};
+ }
+
+ return $result;
+}
+
+sub head {
+ my $self = shift;
+
+ return undef if $self->is_empty;
+
+ no warnings; # because we want to numerically sort strings...
+ my $headkey = (sort {$a <=> $b} (keys(%{$self->queue})))[0];
+ use warnings;
+
+ return $self->queue->{$headkey};
+}
+
+sub is_empty {
+ my $self = shift;
+
+ return keys(%{$self->queue}) ? 0 : 1;
+}
+
+1;