foo
[gitmo/Moose-Autobox.git] / lib / Moose / Autobox / Array.pm
index 37cc777..6144e6f 100644 (file)
@@ -1,10 +1,14 @@
 package Moose::Autobox::Array;
 use Moose::Role 'with';
+use autobox;
 
 our $VERSION = '0.01';
 
-with 'Moose::Autobox::Ref';
+with 'Moose::Autobox::Ref',
+     'Moose::Autobox::List';
 
+## List interface
 sub length {
     my ($array) = @_;
     CORE::scalar @$array;
@@ -21,24 +25,65 @@ sub map {
 }
 
 sub join { 
-    my ($array, $sep) = @_;     
+    my ($array, $sep) = @_;    
+    $sep ||= ''; 
     CORE::join $sep, @$array; 
 }
 
 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->values;
+    my $acc = $a->shift;
+    $a->map(sub { $acc = $func->($acc, $_) });
+    return $acc;
+}
+
+sub zip {
+    my ($array, $other) = @_;
+    ($array->length < $other->length 
+        ? $other 
+        : $array)
+            ->keys
+            ->map(sub {
+                [ $array->[$_], $other->[$_] ]
+            });
+}
+
+## 
+
+sub keys { 
+    my ($array) = @_;    
+    [ 0 .. $#{$array} ];
+}
+
+sub values { 
+    my ($array) = @_;    
+    [ @$array ];
 }
 
+sub kv {
+    my ($array) = @_;   
+    $array->keys->map(sub { [ $_, $array->[$_] ] });
+}
+
+## Array Interface
+
 sub pop { 
     my ($array) = @_;    
-    CORE::pop @{$array}; 
+    CORE::pop @$array; 
 }
 
 sub push { 
@@ -49,7 +94,7 @@ sub push {
 
 sub unshift { 
     my ($array, @rest) = @_;    
-    CORE::unshift @{$array}, @rest; 
+    CORE::unshift @$array, @rest; 
     $array; 
 }
 sub exists {