#!/usr/bin/perl -w

# El objetivo es hacer una subrutina que equivalga a un for(;;)
# loop, devuelva una lista de las iteraciones, y llame a otro loop
# sucesivamente hasta que se llegue a la dimensión de la primera 
# llamada y se pare. El fin último es poder hacer algo multidimensional,
# como una cuadrícula, sin tener que escribir todos los for loops.

use 5.030;

# use Data::Printer;

my $dimensions = 11_000;
my @init = (0) x $dimensions;
my @end = (1) x $dimensions;
my @step = (0.1) x $dimensions;

my $t = time();

my $results = loops(0);   # begin in 0

for my $dim (@$results){
    my %out;
    while (my ($k,$v) = each %$dim){
	$out{$v}{$k} = $v;
	print "$out{$v}{$k} ";
    }
    say "";
#   p %out;
}
say "Time elapsed ", time()-$t, " secs.";

exit 1;


sub loops {
    my ($d) = shift;
    state @r;
    for (my $i = $init[$d]; $i <= $end[$d]; $i += $step[$d]){
#	if ($d-1 > 0){
#	    $r[$d]{$i} = ($r[$d-1]{$i}+$step[$d] <= $end[$d]) ? ($r[$d-1]{$i}+$step[$d]) : $end[$d];
#	}else{
	    $r[$d]{$i} = $i;
#	}
    }
    if (++$d < $dimensions){
	loops($d);
    }
    return \@r;
}

