public static function map($promisesOrValues, callable $mapFunc)
{
$cancellationQueue = new CancellationQueue();
return new Promise(function ($resolve, $reject, $cancel) use($promisesOrValues, $mapFunc, $cancellationQueue) {
self::doResolve($promisesOrValues)->done(function ($array) use($resolve, $reject, $cancel, $mapFunc, $cancellationQueue) {
if (!is_array($array) || !$array) {
$resolve([]);
return;
}
$toResolve = count($array);
$values = [];
foreach ($array as $i => $promiseOrValue) {
$cancellationQueue->enqueue($promiseOrValue);
self::doResolve($promiseOrValue)->then($mapFunc)->done(function ($mapped) use($i, &$values, &$toResolve, $resolve) {
$values[$i] = $mapped;
if (0 === --$toResolve) {
$resolve($values);
}
}, $reject, $cancel);
}
}, $reject, $cancel);
}, $cancellationQueue);
}