Add Array->each_n.
[gitmo/Moose-Autobox.git] / lib / Moose / Autobox / Array.pm
index ecc4127..ab28fbf 100644 (file)
@@ -3,7 +3,7 @@ use Moose::Role 'with';
 use Perl6::Junction;
 use Moose::Autobox;
 
-our $VERSION = '0.03';
+our $VERSION = '0.10';
 
 with 'Moose::Autobox::Ref',
      'Moose::Autobox::List',
@@ -117,30 +117,78 @@ sub kv {
     $array->keys->map(sub { [ $_, $array->[$_] ] });
 }
 
+sub each {
+    my ($array, $sub) = @_;
+    for my $i (0 .. $#$array) {
+      $sub->($i, $array->[ $i ]);
+    }
+}
+
+sub each_key {
+    my ($array, $sub) = @_;
+    $sub->($_) for (0 .. $#$array);
+}
+
+sub each_value {
+    my ($array, $sub) = @_;
+    $sub->($_) for @$array;
+}
+
+sub each_n {
+    my ($array, $n, $sub) = @_;
+    my $it = List::MoreUtils::natatime($n, @$array);
+
+    while (my @vals = $it->()) {
+        $sub->(@vals);
+    }
+
+    return;
+}
+
+# end indexed
+
 sub flatten {
     @{$_[0]}
 }
 
+sub _flatten_deep { 
+       my @array = @_;
+       my $depth = CORE::pop @array;
+       --$depth if (defined($depth));
+       
+       CORE::map {
+               (ref eq 'ARRAY')
+                       ? (defined($depth) && $depth == -1) ? $_ : _flatten_deep( @$_, $depth )
+                       : $_
+       } @array;
+
+}
+
+sub flatten_deep { 
+       my ($array, $depth) = @_;       
+       [ _flatten_deep(@$array, $depth) ];
+}
+
 ## Junctions
 
 sub all {
     my ($array) = @_;     
-    return Perl6::Junction::All->new(@$array);
+    return Perl6::Junction::all(@$array);
 }
 
 sub any {
     my ($array) = @_;     
-    return Perl6::Junction::Any->new(@$array);
+    return Perl6::Junction::any(@$array);
 }
 
 sub none {
     my ($array) = @_;     
-    return Perl6::Junction::None->new(@$array);
+    return Perl6::Junction::none(@$array);
 }
 
 sub one {
     my ($array) = @_; 
-    return Perl6::Junction::One->new(@$array);
+    return Perl6::Junction::one(@$array);
 }
 
 ## Print
@@ -196,6 +244,10 @@ This is a role to describe operations on the Array type.
 
 =item B<flatten>
 
+=item B<flatten_deep ($depth)>
+
+=item B<each_n ($n, $callback)>
+
 =back
 
 =head2 Indexed implementation
@@ -214,6 +266,12 @@ This is a role to describe operations on the Array type.
 
 =item B<kv>
 
+=item B<each>
+
+=item B<each_key>
+
+=item B<each_value>
+
 =back
 
 =head2 List implementation
@@ -232,6 +290,24 @@ This is a role to describe operations on the Array type.
 
 =item B<grep (\&block)>
 
+Note that, in both the above, $_ is in scope within the code block, as well as 
+being passed as $_[0]. As per CORE::map and CORE::grep, $_ is an alias to 
+the list value, so can be used to to modify the list, viz:
+
+    use Moose::Autobox;
+
+    my $foo = [1, 2, 3]; 
+    $foo->map( sub {$_++} ); 
+    print $foo->dump;
+
+yields
+
+   $VAR1 = [
+             2,
+             3,
+             4
+           ];
+        
 =item B<reverse>
 
 =item B<sort (?\&block)>