#!/usr/bin/pugs use v6; sub NL2 (++@loop) { coro { given (@loop.elems) { when 0 { yield [] } when 1 { @loop[0].map:{ yield [$^first] }; yield undef } default { for @loop[0] -> $first { my &rest = NL2(loop => @loop[1..Inf]); my @rest; while @rest = rest() { yield [$first, @rest]; } } yield undef; } } } } my &iter = NL2(loop => ([0..2], [3..5], [6..8])); my ($cnt, $item); say "ITER {++$cnt}: {$item.perl}" while $item = iter;