| 1 | efrain | 1 | <?php
 | 
        
           |  |  | 2 |   | 
        
           | 1441 | ariadna | 3 | declare(strict_types=1);
 | 
        
           |  |  | 4 |   | 
        
           | 1 | efrain | 5 | namespace GuzzleHttp\Promise;
 | 
        
           |  |  | 6 |   | 
        
           |  |  | 7 | final class Each
 | 
        
           |  |  | 8 | {
 | 
        
           |  |  | 9 |     /**
 | 
        
           |  |  | 10 |      * Given an iterator that yields promises or values, returns a promise that
 | 
        
           |  |  | 11 |      * is fulfilled with a null value when the iterator has been consumed or
 | 
        
           |  |  | 12 |      * the aggregate promise has been fulfilled or rejected.
 | 
        
           |  |  | 13 |      *
 | 
        
           |  |  | 14 |      * $onFulfilled is a function that accepts the fulfilled value, iterator
 | 
        
           |  |  | 15 |      * index, and the aggregate promise. The callback can invoke any necessary
 | 
        
           |  |  | 16 |      * side effects and choose to resolve or reject the aggregate if needed.
 | 
        
           |  |  | 17 |      *
 | 
        
           |  |  | 18 |      * $onRejected is a function that accepts the rejection reason, iterator
 | 
        
           |  |  | 19 |      * index, and the aggregate promise. The callback can invoke any necessary
 | 
        
           |  |  | 20 |      * side effects and choose to resolve or reject the aggregate if needed.
 | 
        
           |  |  | 21 |      *
 | 
        
           | 1441 | ariadna | 22 |      * @param mixed $iterable Iterator or array to iterate over.
 | 
        
           | 1 | efrain | 23 |      */
 | 
        
           |  |  | 24 |     public static function of(
 | 
        
           |  |  | 25 |         $iterable,
 | 
        
           | 1441 | ariadna | 26 |         ?callable $onFulfilled = null,
 | 
        
           |  |  | 27 |         ?callable $onRejected = null
 | 
        
           |  |  | 28 |     ): PromiseInterface {
 | 
        
           | 1 | efrain | 29 |         return (new EachPromise($iterable, [
 | 
        
           |  |  | 30 |             'fulfilled' => $onFulfilled,
 | 
        
           | 1441 | ariadna | 31 |             'rejected' => $onRejected,
 | 
        
           | 1 | efrain | 32 |         ]))->promise();
 | 
        
           |  |  | 33 |     }
 | 
        
           |  |  | 34 |   | 
        
           |  |  | 35 |     /**
 | 
        
           |  |  | 36 |      * Like of, but only allows a certain number of outstanding promises at any
 | 
        
           |  |  | 37 |      * given time.
 | 
        
           |  |  | 38 |      *
 | 
        
           |  |  | 39 |      * $concurrency may be an integer or a function that accepts the number of
 | 
        
           |  |  | 40 |      * pending promises and returns a numeric concurrency limit value to allow
 | 
        
           |  |  | 41 |      * for dynamic a concurrency size.
 | 
        
           |  |  | 42 |      *
 | 
        
           |  |  | 43 |      * @param mixed        $iterable
 | 
        
           |  |  | 44 |      * @param int|callable $concurrency
 | 
        
           |  |  | 45 |      */
 | 
        
           |  |  | 46 |     public static function ofLimit(
 | 
        
           |  |  | 47 |         $iterable,
 | 
        
           |  |  | 48 |         $concurrency,
 | 
        
           | 1441 | ariadna | 49 |         ?callable $onFulfilled = null,
 | 
        
           |  |  | 50 |         ?callable $onRejected = null
 | 
        
           |  |  | 51 |     ): PromiseInterface {
 | 
        
           | 1 | efrain | 52 |         return (new EachPromise($iterable, [
 | 
        
           | 1441 | ariadna | 53 |             'fulfilled' => $onFulfilled,
 | 
        
           |  |  | 54 |             'rejected' => $onRejected,
 | 
        
           |  |  | 55 |             'concurrency' => $concurrency,
 | 
        
           | 1 | efrain | 56 |         ]))->promise();
 | 
        
           |  |  | 57 |     }
 | 
        
           |  |  | 58 |   | 
        
           |  |  | 59 |     /**
 | 
        
           |  |  | 60 |      * Like limit, but ensures that no promise in the given $iterable argument
 | 
        
           |  |  | 61 |      * is rejected. If any promise is rejected, then the aggregate promise is
 | 
        
           |  |  | 62 |      * rejected with the encountered rejection.
 | 
        
           |  |  | 63 |      *
 | 
        
           |  |  | 64 |      * @param mixed        $iterable
 | 
        
           |  |  | 65 |      * @param int|callable $concurrency
 | 
        
           |  |  | 66 |      */
 | 
        
           |  |  | 67 |     public static function ofLimitAll(
 | 
        
           |  |  | 68 |         $iterable,
 | 
        
           |  |  | 69 |         $concurrency,
 | 
        
           | 1441 | ariadna | 70 |         ?callable $onFulfilled = null
 | 
        
           |  |  | 71 |     ): PromiseInterface {
 | 
        
           |  |  | 72 |         return self::ofLimit(
 | 
        
           | 1 | efrain | 73 |             $iterable,
 | 
        
           |  |  | 74 |             $concurrency,
 | 
        
           |  |  | 75 |             $onFulfilled,
 | 
        
           | 1441 | ariadna | 76 |             function ($reason, $idx, PromiseInterface $aggregate): void {
 | 
        
           | 1 | efrain | 77 |                 $aggregate->reject($reason);
 | 
        
           |  |  | 78 |             }
 | 
        
           |  |  | 79 |         );
 | 
        
           |  |  | 80 |     }
 | 
        
           |  |  | 81 | }
 |