X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FAutobox%2FArray.pm;h=62344356ca1c4ce4fdc26f8409125e9496a9966b;hb=09a0196c32a63189d212a905146e0271861255b7;hp=defa83bb04b5ad90f152f52026388ac78101646d;hpb=252ab1a26175a028754adbe4589cd87bc5240ce6;p=gitmo%2FMoose-Autobox.git diff --git a/lib/Moose/Autobox/Array.pm b/lib/Moose/Autobox/Array.pm index defa83b..6234435 100644 --- a/lib/Moose/Autobox/Array.pm +++ b/lib/Moose/Autobox/Array.pm @@ -1,13 +1,57 @@ package Moose::Autobox::Array; use Moose::Role 'with'; -use autobox; +use Perl6::Junction; +use Moose::Autobox; -our $VERSION = '0.01'; +our $VERSION = '0.03'; with 'Moose::Autobox::Ref', - 'Moose::Autobox::List'; + 'Moose::Autobox::List', + 'Moose::Autobox::Indexed'; + +## 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 delete { + my ($array, $index) = @_; + CORE::delete $array->[$index]; +} + +sub shift { + my ($array) = @_; + CORE::shift @$array; +} -## List interface +sub slice { + my ($array, $indicies) = @_; + [ @{$array}[ @{$indicies} ] ]; +} + +# 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) = @_; @@ -25,7 +69,8 @@ sub map { } sub join { - my ($array, $sep) = @_; + my ($array, $sep) = @_; + $sep ||= ''; CORE::join $sep, @$array; } @@ -40,28 +85,22 @@ sub sort { [ CORE::sort { $sub->($a, $b) } @$array ]; } -# ... +## ::Indexed implementation -sub reduce { - my ($array, $func) = @_; - my $a = $array->values; - my $acc = $a->shift; - $a->map(sub { $acc = $func->($acc, $_) }); - return $acc; -} +sub at { + my ($array, $index) = @_; + $array->[$index]; +} -sub zip { - my ($array, $other) = @_; - ($array->length < $other->length - ? $other - : $array) - ->keys - ->map(sub { - [ $array->[$_], $other->[$_] ] - }); +sub put { + my ($array, $index, $value) = @_; + $array->[$index] = $value; } -## +sub exists { + my ($array, $index) = @_; + CORE::exists $array->[$index]; +} sub keys { my ($array) = @_; @@ -75,40 +114,189 @@ 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 flatten { + @{$_[0]} } -sub push { - my ($array, @rest) = @_; - CORE::push @$array, @rest; - $array; -} +## Junctions -sub unshift { - my ($array, @rest) = @_; - CORE::unshift @$array, @rest; - $array; +sub all { + my ($array) = @_; + return Perl6::Junction::all(@$array); } -sub exists { - my ($array, $index) = @_; - CORE::exists $array->[$index]; + +sub any { + my ($array) = @_; + return Perl6::Junction::any(@$array); } -sub delete { - my ($array, $index) = @_; - CORE::delete $array->[$index]; +sub none { + my ($array) = @_; + return Perl6::Junction::none(@$array); } -sub shift { - my ($array) = @_; - CORE::shift @$array; +sub one { + my ($array) = @_; + return Perl6::Junction::one(@$array); } +## Print + +sub print { CORE::print @{$_[0]} } +sub say { CORE::print @{$_[0]}, "\n" } + 1; + +__END__ + +=pod + +=head1 NAME + +Moose::Autobox::Array - the Array role + +=head1 SYNOPOSIS + + use Moose::Autobox; + + [ 1..5 ]->isa('ARRAY'); # true + [ a..z ]->does('Moose::Autobox::Array'); # true + [ 0..2 ]->does('Moose::Autobox::List'); # true + + print "Squares: " . [ 1 .. 10 ]->map(sub { $_ * $_ })->join(', '); + + print [ 1, 'number' ]->sprintf('%d is the loneliest %s'); + + print ([ 1 .. 5 ]->any == 3) ? 'true' : 'false'; # prints 'true' + +=head1 DESCRIPTION + +This is a role to describe operations on the Array type. + +=head1 METHODS + +=over 4 + +=item B + +=item B + +=item B + +=item B + +=item B + +=item B + +=item B + +=item B + +=back + +=head2 Indexed implementation + +=over 4 + +=item B + +=item B + +=item B + +=item B + +=item B + +=item B + +=back + +=head2 List implementation + +=over 4 + +=item B + +=item B + +=item B + +=item B + +=item B + +=item B + +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 + +=item B + +=back + +=head2 Junctions + +=over 4 + +=item B + +=item B + +=item B + +=item B + +=back + +=over 4 + +=item B + +=item B + +=item B + +=back + +=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. + +=head1 AUTHOR + +Stevan Little Estevan@iinteractive.comE + +=head1 COPYRIGHT AND LICENSE + +Copyright 2006-2008 by Infinity Interactive, Inc. + +L + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut