foo
[gitmo/Moose-Autobox.git] / lib / Moose / Autobox / Array.pm
index 37cc777..c58198e 100644 (file)
@@ -3,8 +3,11 @@ use Moose::Role 'with';
 
 our $VERSION = '0.01';
 
-with 'Moose::Autobox::Ref';
+with 'Moose::Autobox::Ref',
+     'Moose::Autobox::List';
 
+## List interface
 sub length {
     my ($array) = @_;
     CORE::scalar @$array;
@@ -27,18 +30,59 @@ sub join {
 
 sub reverse { 
     my ($array) = @_;
-    [ CORE::reverse @{$array} ];
+    [ CORE::reverse @$array ];
 }
 
 sub sort { 
     my ($array, $sub) = @_;     
     $sub ||= sub { $a cmp $b }; 
     [ CORE::sort { $sub->($a, $b) } @$array ]; 
+}    
+
+# ...
+
+sub reduce {
+    my ($array, $func) = @_;
+    my @a = @$array;
+    my $acc = CORE::shift @a;
+    $acc = $func->($acc, $_) foreach @a;
+    return $acc;
+}
+
+sub zip {
+    my ($array, $other) = @_;
+    [ 
+        CORE::map { 
+            [ $array->[$_], $other->[$_] ]        
+        } 0 .. $#{(
+            CORE::scalar @{$array} < CORE::scalar @{$other} 
+                ? $other : $array
+        )}
+    ];
+} 
+
+## 
+
+sub keys { 
+    my ($array) = @_;    
+    [ 0 .. $#{$array} ];
 }
 
+sub values { 
+    my ($array) = @_;    
+    [ @$array ];
+}
+
+sub kv {
+    my ($array) = @_;   
+    [ CORE::map { [ $_, $array->[$_] ] } (0 .. $#{$array}) ];
+}
+
+## Array Interface
+
 sub pop { 
     my ($array) = @_;    
-    CORE::pop @{$array}; 
+    CORE::pop @$array; 
 }
 
 sub push { 
@@ -49,7 +93,7 @@ sub push {
 
 sub unshift { 
     my ($array, @rest) = @_;    
-    CORE::unshift @{$array}, @rest; 
+    CORE::unshift @$array, @rest; 
     $array; 
 }
 sub exists {
@@ -67,4 +111,5 @@ sub shift {
     CORE::shift @$array; 
 }
 
+
 1;