$mapFn has signature ($item, $mapEmit) where $item is item from data and $mapEmit is emit function
$reduceFn has signature ($key, $items, $reduceEmit) where $key is the key the data are grouped by,
$items is the group and $reduce emit is an emit function
$mapEmit has signature ($key, $value) where $key is the key the data are grouped by and $value is
a transformed item
$reduceEmit has signature ($obj) where $obj is the transformed group
private function groupBulkActions($changeInfoList) { $bulkChangeInfoClasses = $this->bulkChangeInfoClasses; $groupedChangeInfos = ArrayUtils::mapreduce($changeInfoList, function (TrackedChangeInfo $item, $mapEmit) { $key = "{$item->getEntityName()}/{$item->getAction()}"; $mapEmit($key, $item); }, function ($key, $items, $reduceEmit) use($bulkChangeInfoClasses) { /** @var TrackedChangeInfo[] $items */ if (count($items) > 1) { $entityName = $items[0]->getEntityName(); if (isset($bulkChangeInfoClasses[$entityName])) { $reduceEmit(new $bulkChangeInfoClasses[$entityName]($items)); } else { $reduceEmit($items); } } else { $reduceEmit($items[0]); } }); $changeInfos = array(); foreach ($groupedChangeInfos as $changeInfoGroup) { if (is_array($changeInfoGroup)) { foreach ($changeInfoGroup as $changeInfo) { $changeInfos[] = $changeInfo; } } else { $changeInfos[] = $changeInfoGroup; } } return $changeInfos; }
private function groupBulkActions($changeInfoList) { $groupedChangeInfos = ArrayUtils::mapreduce($changeInfoList, function (ChangeInfo $item, $mapEmit) { if ($item instanceof TrackedChangeInfo) { $key = "{$item->getScope()}/{$item->getAction()}"; $mapEmit($key, $item); } else { $mapEmit(spl_object_hash($item), $item); } }, function ($key, $items, $reduceEmit) { /** @var TrackedChangeInfo[] $items */ if (count($items) > 1) { $reduceEmit(new BulkChangeInfo($items)); } else { $reduceEmit($items[0]); } }); $changeInfos = []; foreach ($groupedChangeInfos as $changeInfoGroup) { if (is_array($changeInfoGroup)) { foreach ($changeInfoGroup as $changeInfo) { $changeInfos[] = $changeInfo; } } else { $changeInfos[] = $changeInfoGroup; } } return $changeInfos; }