Add Array->each_n.
Florian Ragwitz [Mon, 1 Feb 2010 02:52:18 +0000 (03:52 +0100)]
Makefile.PL
lib/Moose/Autobox/Array.pm
t/011_each_n.t [new file with mode: 0644]

index e14ec21..cde3758 100644 (file)
@@ -10,7 +10,7 @@ requires 'autobox'         => '2.23';
 requires 'Moose'           => '0.42';
 requires 'Perl6::Junction' => '1.40000';
 
-test_requires 'Test::More'      => '0.62';
+test_requires 'Test::More'      => '0.89';
 test_requires 'Test::Exception' => '0.21';
 
 auto_manifest;
index e43c893..ab28fbf 100644 (file)
@@ -134,6 +134,17 @@ sub each_value {
     $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 {
@@ -235,6 +246,8 @@ This is a role to describe operations on the Array type.
 
 =item B<flatten_deep ($depth)>
 
+=item B<each_n ($n, $callback)>
+
 =back
 
 =head2 Indexed implementation
diff --git a/t/011_each_n.t b/t/011_each_n.t
new file mode 100644 (file)
index 0000000..396f446
--- /dev/null
@@ -0,0 +1,29 @@
+use strict;
+use warnings;
+use Test::More;
+
+use Moose::Autobox;
+
+{
+    my @array = ('a' .. 'z');
+
+    my $aref = [ @array ];
+
+    {
+        my @vals;
+        @array->each_n(2, sub { push @vals, [@_] });
+        is(scalar @vals, 13);
+        is(scalar @$_, 2) for @vals;
+        is_deeply(@vals->map(sub { @{ $_ } }), [@array]);
+    }
+
+    {
+        my @vals;
+        $aref->each_n(2, sub { push @vals, [@_] });
+        is(scalar @vals, 13);
+        is(scalar @$_, 2) for @vals;
+        is_deeply(@vals->map(sub { @{ $_ } }), $aref);
+    }
+}
+
+done_testing;