autoboxing
[gitmo/Moose-Autobox.git] / lib / Moose / Autobox / Array.pm
index c58198e..a33c1b5 100644 (file)
@@ -1,12 +1,50 @@
 package Moose::Autobox::Array;
 use Moose::Role 'with';
+use autobox;
 
 our $VERSION = '0.01';
 
 with 'Moose::Autobox::Ref',
      'Moose::Autobox::List';
+    
+## Array Interface
+
+sub pop { 
+    my ($array) = @_;    
+    CORE::pop @$array; 
+}
+
+sub push { 
+    my ($array, @rest) = @_;
+    CORE::push @$array, @rest;  
+    $array; 
+}
+
+sub unshift { 
+    my ($array, @rest) = @_;    
+    CORE::unshift @$array, @rest; 
+    $array; 
+}
 
-## List interface
+sub delete { 
+    my ($array, $index) = @_;    
+    CORE::delete $array->[$index];
+}
+
+sub shift { 
+    my ($array) = @_;    
+    CORE::shift @$array; 
+}     
+
+# NOTE: 
+# sprintf args need to be reversed, 
+# because the invocant is the array
+sub sprintf { CORE::sprintf $_[1], @{$_[0]} }
+
+## ::List interface implementation
+
+sub head { $_[0]->[0] }
+sub tail { [ @{$_[0]}[ 1 .. $#{$_[0]} ] ] }
  
 sub length {
     my ($array) = @_;
@@ -24,7 +62,8 @@ sub map {
 }
 
 sub join { 
-    my ($array, $sep) = @_;     
+    my ($array, $sep) = @_;    
+    $sep ||= ''; 
     CORE::join $sep, @$array; 
 }
 
@@ -39,29 +78,16 @@ sub sort {
     [ CORE::sort { $sub->($a, $b) } @$array ]; 
 }    
 
-# ...
+# ::Value requirement
 
-sub reduce {
-    my ($array, $func) = @_;
-    my @a = @$array;
-    my $acc = CORE::shift @a;
-    $acc = $func->($acc, $_) foreach @a;
-    return $acc;
-}
+sub print { CORE::print @{$_[0]} }
 
-sub zip {
-    my ($array, $other) = @_;
-    [ 
-        CORE::map { 
-            [ $array->[$_], $other->[$_] ]        
-        } 0 .. $#{(
-            CORE::scalar @{$array} < CORE::scalar @{$other} 
-                ? $other : $array
-        )}
-    ];
-} 
+## ::Indexed implementation
 
-## 
+sub exists {
+    my ($array, $index) = @_;    
+    CORE::exists $array->[$index];    
+}
 
 sub keys { 
     my ($array) = @_;    
@@ -75,41 +101,7 @@ sub values {
 
 sub kv {
     my ($array) = @_;   
-    [ CORE::map { [ $_, $array->[$_] ] } (0 .. $#{$array}) ];
+    $array->keys->map(sub { [ $_, $array->[$_] ] });
 }
 
-## Array Interface
-
-sub pop { 
-    my ($array) = @_;    
-    CORE::pop @$array; 
-}
-
-sub push { 
-    my ($array, @rest) = @_;
-    CORE::push @$array, @rest;  
-    $array; 
-}
-
-sub unshift { 
-    my ($array, @rest) = @_;    
-    CORE::unshift @$array, @rest; 
-    $array; 
-}
-sub exists {
-    my ($array, $index) = @_;    
-    CORE::exists $array->[$index];    
-}
-
-sub delete { 
-    my ($array, $index) = @_;    
-    CORE::delete $array->[$index];
-}
-
-sub shift { 
-    my ($array) = @_;    
-    CORE::shift @$array; 
-}
-
-
 1;