Create an iterator that returns values from multiple iterators in
cartesian product fashion. That is, they are combined the manner
of nested for loops.
Usage
product(...)
Arguments
...
Named iterables to iterate over. The right-most iterables
change more quickly, like an odometer.
# Simulate a doubly-nested loop with a single while loopit <- ihasNext(product(a=1:3, b=1:2))
while (hasNext(it)) {
x <- nextElem(it)
cat(sprintf('a = %d, b = %d\n', x$a, x$b))
}