function cp(lists){ if (size(lists) == 1){ yield project(lists[0], {_x->{_x}}) } else { for (r : cp(lists[1..])){ for (m:r){ for (a:project(lists[0], {e-> {e}+ m})) yield {a} } } } } function listcp(lists) list(project(cp(lists), {x->x[0]})) println(listcp([[1,2,3,4], "abc"]))