public function walk(callable $function)
{
$data = $this->beforeOuterLoopData();
foreach ($this->outerIterator as $outerKey => &$outerValue) {
foreach ($this->innerGenerator($outerKey, $outerValue, $data) as $innerKey => &$innerValue) {
$function($outerValue, $innerValue, $outerKey, $innerKey);
}
}
}