Redis::List to tie perl arrays
authorDobrica Pavlinusic <dpavlin@rot13.org>
Sun, 22 Mar 2009 16:16:11 +0000 (16:16 +0000)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Sun, 22 Mar 2009 16:16:11 +0000 (16:16 +0000)
git-svn-id: svn+ssh://llin/home/dpavlin/private/svn/Redis@29 447b33ff-793d-4489-8442-9bea7d161be5

lib/Redis/List.pm [new file with mode: 0644]
t/10-Redis-List.t [new file with mode: 0755]

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;
diff --git a/t/10-Redis-List.t b/t/10-Redis-List.t
new file mode 100755 (executable)
index 0000000..478cc46
--- /dev/null
@@ -0,0 +1,30 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+
+use Test::More tests => 9;
+use lib 'lib';
+use Data::Dump qw/dump/;
+
+BEGIN {
+       use_ok( 'Redis::List' );
+}
+
+my @a;
+
+ok( my $o = tie( @a, 'Redis::List', 'test-redis-list' ), 'tie' );
+
+isa_ok( $o, 'Redis::List' );
+
+ok( $o->CLEAR, 'CLEAR' );
+
+ok( ! @a, 'empty list' );
+
+ok( @a = ( 'foo', 'bar', 'baz' ), '=' );
+is_deeply( [ @a ], [ 'foo', 'bar', 'baz' ] );
+
+ok( push( @a, 'push' ), 'push' );
+is_deeply( [ @a ], [ 'foo', 'bar', 'baz', 'push' ] );
+
+diag dump( @a );