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.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; }
Cheers - L~R
In reply to Re: Perl6 Contest #2: P6 That Doesn't Look Like P5
by Limbic~Region
in thread Perl6 Contest #2: P6 That Doesn't Look Like P5
by Limbic~Region
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |