Algorithm-LatticePoints
view release on metacpan or search on metacpan
lib/Algorithm/LatticePoints.pm view on Meta::CPAN
package Algorithm::LatticePoints;
use 5.008001;
use strict;
use warnings;
require Exporter;
our $VERSION = sprintf "%d.%02d", q$Revision: 0.1 $ =~ /(\d+)/g;
sub new($&){
my $class = shift;
my $coderef = shift;
bless $coderef, $class;
}
sub visit{
my $self = shift;
my ( $start, $end ) = @_;
my $loop = 'LOOP';
$loop =~ s{LOOP}{
"for my \$i$_ (\$start->[$_]..\$end->[$_]){LOOP}"
}ex for ( 0 .. @$start - 1 );
my $args = join ",", map { '$i' . $_ } reverse( 0 .. @$start - 1 );
$loop =~ s{LOOP}{\$self->($args)};
eval $loop;
}
if ( $0 eq __FILE__ ) {
my $al = Algorithm::LatticePoints->new(
sub {
printf "[%s]\n", join( ", ", @_ );
}
);
$al->visit( [ 0, 0, 0 ], [ 9, 9, 9 ] );
}
1;
__END__
=head1 NAME
Algorithm::LatticePoints - Run code for each lattice points
=head1 SYNOPSIS
use Algorithm::LatticePoints;
my $al = Algorithm::LatticePoints->new(
sub {
printf "[%s]\n", join( ", ", @_ );
}
);
$al->visit( [0,0,0,0], [9,9,9,9] );
# instead of
for my $t (0..9){
for my $z (0..9){
for my $y (0..9){
for my $x (0..9){
print "[$x, $y, $z, $t]\n";
}
}
}
}
=head1 DESCRIPTION
Lattice-point handling is a common chore. You do it for image
processing, 3-d processing, and more. Usually you do it via nested
for loops but it is boring and tedious. This module loops for you
instead.
=head2 METHODS
( run in 1.870 second using v1.01-cache-2.11-cpan-5b529ec07f3 )