Algorithm-Loops
view release on metacpan or search on metacpan
lib/Algorithm/Loops.pm view on Meta::CPAN
} while( $sub =~ /^_/ );
if( eval { require Carp; 1; }
&& defined &Carp::croak ) {
unshift @_, "$sub: ";
goto &Carp::croak;
}
die "$sub: ", @_, ".\n";
}
sub Filter(&@)
{
my( $code, @vals )= @_;
isa($code,"CODE") or _Croak(
"No code reference given" );
# local( $_ ); # Done by the loop.
for( @vals ) {
$code->();
}
wantarray ? @vals : join "", @vals;
}
sub MapCarE(&@)
{
my $sub= shift(@_);
isa($sub,"CODE") or _Croak(
"No code reference given" );
my $size= -1;
for my $av ( @_ ) {
isa( $av, "ARRAY" ) or _Croak(
"Not an array reference (", _Type($av), ")" );
if( $size < 0 ) {
$size= @$av;
lib/Algorithm/Loops.pm view on Meta::CPAN
}
}
my @ret;
for( my $i= 0; $i < $size; $i++ ) {
push @ret, &$sub( map { $_->[$i] } @_ );
}
return wantarray ? @ret : \@ret;
}
sub MapCarMin(&@)
{
my $sub= shift(@_);
isa($sub,"CODE") or _Croak(
"No code reference given" );
my $min= -1;
for my $av ( @_ ) {
isa( $av, "ARRAY" ) or _Croak(
"Not an array reference (", _Type($av), ")" );
$min= @$av if $min < 0 || @$av < $min;
}
my @ret;
for( my $i= 0; $i < $min; $i++ ) {
push @ret, &$sub( map { $_->[$i] } @_ );
}
return wantarray ? @ret : \@ret;
}
sub MapCarU(&@)
{
my $sub= shift(@_);
isa($sub,"CODE") or _Croak(
"No code reference given" );
my $max= 0;
for my $av ( @_ ) {
isa( $av, "ARRAY" ) or _Croak(
"Not an array reference (", _Type($av), ")" );
$max= @$av if $max < @$av;
}
my @ret;
for( my $i= 0; $i < $max; $i++ ) {
push @ret, &$sub( map { $_->[$i] } @_ );
}
return wantarray ? @ret : \@ret;
}
sub MapCar(&@)
{
my $sub= shift(@_);
isa($sub,"CODE") or _Croak(
"No code reference given" );
my $max= 0;
for my $av ( @_ ) {
isa( $av, "ARRAY" ) or _Croak(
"Not an array reference (", _Type($av), ")" );
$max= @$av if $max < @$av;
}
my @ret;
for( my $i= 0; $i < $max; $i++ ) {
push @ret, &$sub( map { $i < @$_ ? $_->[$i] : () } @_ );
# If we assumed Want.pm, we could consider an early return.
}
return wantarray ? @ret : \@ret;
}
sub NextPermute(\@)
{
my( $vals )= @_;
my $last= $#{$vals};
return !1 if $last < 1;
# Find last item not in reverse-sorted order:
my $i= $last-1;
$i-- while 0 <= $i && $vals->[$i] ge $vals->[$i+1];
# If complete reverse sort, we are done!
if( -1 == $i ) {
# Reset to starting/sorted order:
lib/Algorithm/Loops.pm view on Meta::CPAN
if $vals->[$i+1] gt $vals->[$last];
# Find next item that will make us "greater":
my $j= $i+1;
$j++ while $vals->[$i] ge $vals->[$j];
# Swap:
@{$vals}[$i,$j]= @{$vals}[$j,$i];
return 1;
}
sub NextPermuteNum(\@)
{
my( $vals )= @_;
my $last= $#{$vals};
return !1 if $last < 1;
# Find last item not in reverse-sorted order:
my $i= $last-1;
$i-- while 0 <= $i && $vals->[$i+1] <= $vals->[$i];
# If complete reverse sort, we are done!
if( -1 == $i ) {
# Reset to starting/sorted order:
( run in 0.450 second using v1.01-cache-2.11-cpan-3cd7ad12f66 )