TL;DR

Let’s look at a simplified implementation for what NestedLoops does.

In the previous post about Algorithm::Loops we took a look at NestedLoops, a fine sub that allows building nested iterations over a variable number of dimensions.

A possible implementation that is compatible in interface but only offers a subset of the functionalities is the following:

It’s coded recursively, which in my opinion simplifies the implementation and figuring out what’s going on. Basically:

  • lines 8 to 18 implment the modulino trick
  • line 25 tests whether there are still new levels to iterate to, if not then the callback is called in line 26 and the call returns;
  • oterhwise, lines 29 to 33 implement one of the nested loops for the specifi level, then recurse (line 31). The recursive call has $accumulator with all elements currently generated at the available levels.

The implementation is simplified in the sense that:

  • hash reference $opts is supported in the interface but ignored
  • the iteration only accounts for arrays of items and does not support code references
  • there is no support for returning an iterator.