Version 1.04
[gitmo/Moose.git] / lib / Moose / Meta / Attribute / Native / MethodProvider / Array.pm
index 9a6dd13..790cbe1 100644 (file)
@@ -1,7 +1,10 @@
 package Moose::Meta::Attribute::Native::MethodProvider::Array;
 use Moose::Role;
 
-our $VERSION = '0.89';
+use List::Util;
+use List::MoreUtils;
+
+our $VERSION = '1.04';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 
@@ -12,7 +15,7 @@ sub count : method {
     };
 }
 
-sub empty : method {
+sub is_empty : method {
     my ( $attr, $reader, $writer ) = @_;
     return sub {
         scalar @{ $reader->( $_[0] ) } ? 0 : 1;
@@ -23,11 +26,7 @@ sub first : method {
     my ( $attr, $reader, $writer ) = @_;
     return sub {
         my ( $instance, $predicate ) = @_;
-        foreach my $val ( @{ $reader->($instance) } ) {
-            local $_ = $val;
-            return $val if $predicate->();
-        }
-        return;
+        List::Util::first { $predicate->() } @{ $reader->($instance) };
     };
 }
 
@@ -39,6 +38,15 @@ sub map : method {
     };
 }
 
+sub reduce : method {
+    my ( $attr, $reader, $writer ) = @_;
+    return sub {
+        my ( $instance, $f ) = @_;
+        our ($a, $b);
+        List::Util::reduce { $f->($a, $b) } @{ $reader->($instance) };
+    };
+}
+
 sub sort : method {
     my ( $attr, $reader, $writer ) = @_;
     return sub {
@@ -62,49 +70,43 @@ sub sort : method {
     };
 }
 
-sub grep : method {
+sub shuffle : method {
     my ( $attr, $reader, $writer ) = @_;
     return sub {
-        my ( $instance, $predicate ) = @_;
-        CORE::grep { $predicate->() } @{ $reader->($instance) };
-    };
-}
-
-sub elements : method {
-    my ( $attr, $reader, $writer ) = @_;
-    return sub {
-        my ($instance) = @_;
-        @{ $reader->($instance) };
+        my ( $instance ) = @_;
+        List::Util::shuffle @{ $reader->($instance) };
     };
 }
 
-sub join : method {
+sub grep : method {
     my ( $attr, $reader, $writer ) = @_;
     return sub {
-        my ( $instance, $separator ) = @_;
-        join $separator, @{ $reader->($instance) };
+        my ( $instance, $predicate ) = @_;
+        CORE::grep { $predicate->() } @{ $reader->($instance) };
     };
 }
 
-sub head : method {
+sub uniq : method {
     my ( $attr, $reader, $writer ) = @_;
     return sub {
-        $reader->( $_[0] )->[0];
+        my ( $instance ) = @_;
+        List::MoreUtils::uniq @{ $reader->($instance) };
     };
 }
 
-sub tail : method {
+sub elements : method {
     my ( $attr, $reader, $writer ) = @_;
     return sub {
-        my $arr = $reader->( $_[0] );
-        return @{ $arr }[1..$#{ $arr }];
+        my ($instance) = @_;
+        @{ $reader->($instance) };
     };
 }
 
-sub last : method {
+sub join : method {
     my ( $attr, $reader, $writer ) = @_;
     return sub {
-        $reader->( $_[0] )->[-1];
+        my ( $instance, $separator ) = @_;
+        join $separator, @{ $reader->($instance) };
     };
 }
 
@@ -339,6 +341,21 @@ sub sort_in_place : method {
     };
 }
 
+sub natatime : method {
+    my ( $attr, $reader, $writer ) = @_;
+    return sub {
+        my ( $instance, $n, $f ) = @_;
+        my $it = List::MoreUtils::natatime($n, @{ $reader->($instance) });
+        return $it unless $f;
+
+        while (my @vals = $it->()) {
+            $f->(@vals);
+        }
+
+        return;
+    };
+}
+
 1;
 
 __END__
@@ -347,12 +364,12 @@ __END__
 
 =head1 NAME
 
-Moose::Meta::Attribute::Native::MethodProvider::Array
+Moose::Meta::Attribute::Native::MethodProvider::Array - role providing method generators for Array trait
 
 =head1 DESCRIPTION
 
 This is a role which provides the method generators for
-L<Moose::Meta::Attribute::Trait::Native::Array>. Please check there for
+L<Moose::Meta::Attribute::Native::Trait::Array>. Please check there for
 documentation on what methods are provided.
 
 =head1 METHODS
@@ -365,9 +382,7 @@ documentation on what methods are provided.
 
 =head1 BUGS
 
-All complex software has bugs lurking in it, and this module is no
-exception. If you find a bug please either email me, or add the bug
-to cpan-RT.
+See L<Moose/BUGS> for details on reporting bugs.
 
 =head1 AUTHOR