use v6; sub NestedLoop (++@loop, +%opt, +$code) returns Ref{ my @pos = 0 xx (@loop.elems - 1), -1; return sub { 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 last; } } return () if @pos[-1] > @loop[-1].end; return map -> $i { @loop[$i][@pos[$i]] } 0 .. @pos.end; }; }; my $next = NestedLoop(loop => ([0..2], [0..2], [0..2])); my @group; while @group = $next() { say ~@group; }