Redis::List to tie perl arrays
[perl-Redis.git] / lib / Redis / List.pm
diff --git a/lib/Redis/List.pm b/lib/Redis/List.pm
new file mode 100644 (file)
index 0000000..6bbc093
--- /dev/null
@@ -0,0 +1,85 @@
+package Redis::List;
+
+use strict;
+use warnings;
+
+use base qw/Redis Tie::Array/;
+
+=head1 NAME
+
+Redis::List - tie perl arrays into Redis lists
+
+=head1 SYNOPSYS
+
+  tie @a, 'Redis::List', 'name';
+
+=cut
+
+# mandatory methods
+sub TIEARRAY {
+       my ($class,$name) = @_;
+       my $self = $class->new;
+       $self->{name} = $name;
+       bless $self => $class;
+}
+
+sub FETCH {
+       my ($self,$index) = @_;
+       $self->lindex( $self->{name}, $index );
+}
+
+sub FETCHSIZE {
+       my ($self) = @_;
+       $self->llen( $self->{name} );
+} 
+
+sub STORE {
+       my ($self,$index,$value) = @_;
+       $self->lset( $self->{name}, $index, $value );
+}
+
+sub STORESIZE {
+       my ($self,$count) = @_;
+       $self->ltrim( $self->{name}, 0, $count );
+#              if $count > $self->FETCHSIZE;
+}
+
+sub CLEAR {
+       my ($self) = @_;
+       $self->del( $self->{name} );
+}
+
+sub PUSH {
+       my $self = shift;
+       $self->rpush( $self->{name}, $_ ) foreach @_;
+}
+
+sub SHIFT {
+       my $self = shift;
+       $self->lpop( $self->{name} );
+}
+
+sub UNSHIFT {
+       my $self = shift;
+       $self->lpush( $self->{name}, $_ ) foreach @_;
+}
+
+sub SPLICE {
+       my $self = shift;
+       my $offset = shift;
+       my $length = shift;
+       $self->lrange( $self->{name}, $offset, $length );
+       # FIXME rest of @_ ?
+}
+
+sub EXTEND {
+       my ($self,$count) = @_;
+       $self->rpush( $self->{name}, '' ) foreach ( $self->FETCHSIZE .. ( $count - 1 ) );
+} 
+
+sub DESTROY {
+       my $self = shift;
+       $self->quit;
+}
+
+1;