X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FAutobox%2FArray.pm;h=6144e6faa30d8ae50b93e4469f98d0a0fd7a0ac6;hb=feffe00c3c1456347355662d6da3c6a676129712;hp=37cc777808d6a6e2ad1a04ec803aaf2dd90624c2;hpb=5f654d8ec893246d215ae8a3b0fa9b467d50b3b9;p=gitmo%2FMoose-Autobox.git diff --git a/lib/Moose/Autobox/Array.pm b/lib/Moose/Autobox/Array.pm index 37cc777..6144e6f 100644 --- a/lib/Moose/Autobox/Array.pm +++ b/lib/Moose/Autobox/Array.pm @@ -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 {