All,
I hacked in support for
OnlyWhen and
\&Code from
Algorithm::Loops.
use v6;
sub NestedLoop (++@loop, +$OnlyWhen, +$code) returns Ref{
my @pos = 0 xx (@loop.elems - 1), -1;
return sub {
my @group;
loop {
if ++@pos[-1] > @loop[-1].end {
for reverse 0 .. @pos.end - 1 -> $i {
next if @pos[$i] == @loop[$i].end;
++@pos[$i];
@pos = (@pos[0..$i], 0 xx (@pos.end - $i)) and las
+t;
}
}
return () if @pos[-1] > @loop[-1].end;
@group = map -> $i { @loop[$i][@pos[$i]] } 0 .. @pos.end;
if $OnlyWhen.does(Code) { $OnlyWhen(@group) or next }
$code(@group) if $code.does(Code);
last;
}
return @group;
};
};
my $next = NestedLoop(loop => ([0..2], [0..2], [0..2]));
my @group;
while @group = $next() { say ~@group; }
If anyone is having a hard time following my logic in order to come up with alternatives, ask and I will provide an explanation. The basic idea is counting where each position relates to an anonymous array and the base to count in for that position is dependent on that array.