PageRenderTime 48ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/src/community/vendor/react/promise/src/functions.php

https://bitbucket.org/ke2083/transfans.co.uk-website
PHP | 244 lines | 194 code | 47 blank | 3 comment | 25 complexity | 050a88994b36ad4484a0d77c4cd3efe0 MD5 | raw file
  1. <?php
  2. namespace React\Promise;
  3. function resolve($promiseOrValue = null)
  4. {
  5. if ($promiseOrValue instanceof ExtendedPromiseInterface) {
  6. return $promiseOrValue;
  7. }
  8. if (method_exists($promiseOrValue, 'then')) {
  9. $canceller = null;
  10. if (method_exists($promiseOrValue, 'cancel')) {
  11. $canceller = [$promiseOrValue, 'cancel'];
  12. }
  13. return new Promise(function ($resolve, $reject, $notify) use ($promiseOrValue) {
  14. $promiseOrValue->then($resolve, $reject, $notify);
  15. }, $canceller);
  16. }
  17. return new FulfilledPromise($promiseOrValue);
  18. }
  19. function reject($promiseOrValue = null)
  20. {
  21. if ($promiseOrValue instanceof PromiseInterface) {
  22. return resolve($promiseOrValue)->then(function ($value) {
  23. return new RejectedPromise($value);
  24. });
  25. }
  26. return new RejectedPromise($promiseOrValue);
  27. }
  28. function all($promisesOrValues)
  29. {
  30. return map($promisesOrValues, function ($val) {
  31. return $val;
  32. });
  33. }
  34. function race($promisesOrValues)
  35. {
  36. $cancellationQueue = new CancellationQueue();
  37. $cancellationQueue->enqueue($promisesOrValues);
  38. return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $cancellationQueue) {
  39. resolve($promisesOrValues)
  40. ->done(function ($array) use ($cancellationQueue, $resolve, $reject, $notify) {
  41. if (!is_array($array) || !$array) {
  42. $resolve();
  43. return;
  44. }
  45. foreach ($array as $promiseOrValue) {
  46. $cancellationQueue->enqueue($promiseOrValue);
  47. resolve($promiseOrValue)
  48. ->done($resolve, $reject, $notify);
  49. }
  50. }, $reject, $notify);
  51. }, $cancellationQueue);
  52. }
  53. function any($promisesOrValues)
  54. {
  55. return some($promisesOrValues, 1)
  56. ->then(function ($val) {
  57. return array_shift($val);
  58. });
  59. }
  60. function some($promisesOrValues, $howMany)
  61. {
  62. $cancellationQueue = new CancellationQueue();
  63. $cancellationQueue->enqueue($promisesOrValues);
  64. return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $howMany, $cancellationQueue) {
  65. resolve($promisesOrValues)
  66. ->done(function ($array) use ($howMany, $cancellationQueue, $resolve, $reject, $notify) {
  67. if (!is_array($array) || $howMany < 1) {
  68. $resolve([]);
  69. return;
  70. }
  71. $len = count($array);
  72. if ($len < $howMany) {
  73. throw new Exception\LengthException(
  74. sprintf(
  75. 'Input array must contain at least %d item%s but contains only %s item%s.',
  76. $howMany,
  77. 1 === $howMany ? '' : 's',
  78. $len,
  79. 1 === $len ? '' : 's'
  80. )
  81. );
  82. }
  83. $toResolve = $howMany;
  84. $toReject = ($len - $toResolve) + 1;
  85. $values = [];
  86. $reasons = [];
  87. foreach ($array as $i => $promiseOrValue) {
  88. $fulfiller = function ($val) use ($i, &$values, &$toResolve, $toReject, $resolve) {
  89. if ($toResolve < 1 || $toReject < 1) {
  90. return;
  91. }
  92. $values[$i] = $val;
  93. if (0 === --$toResolve) {
  94. $resolve($values);
  95. }
  96. };
  97. $rejecter = function ($reason) use ($i, &$reasons, &$toReject, $toResolve, $reject) {
  98. if ($toResolve < 1 || $toReject < 1) {
  99. return;
  100. }
  101. $reasons[$i] = $reason;
  102. if (0 === --$toReject) {
  103. $reject($reasons);
  104. }
  105. };
  106. $cancellationQueue->enqueue($promiseOrValue);
  107. resolve($promiseOrValue)
  108. ->done($fulfiller, $rejecter, $notify);
  109. }
  110. }, $reject, $notify);
  111. }, $cancellationQueue);
  112. }
  113. function map($promisesOrValues, callable $mapFunc)
  114. {
  115. $cancellationQueue = new CancellationQueue();
  116. $cancellationQueue->enqueue($promisesOrValues);
  117. return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $mapFunc, $cancellationQueue) {
  118. resolve($promisesOrValues)
  119. ->done(function ($array) use ($mapFunc, $cancellationQueue, $resolve, $reject, $notify) {
  120. if (!is_array($array) || !$array) {
  121. $resolve([]);
  122. return;
  123. }
  124. $toResolve = count($array);
  125. $values = [];
  126. foreach ($array as $i => $promiseOrValue) {
  127. $cancellationQueue->enqueue($promiseOrValue);
  128. $values[$i] = null;
  129. resolve($promiseOrValue)
  130. ->then($mapFunc)
  131. ->done(
  132. function ($mapped) use ($i, &$values, &$toResolve, $resolve) {
  133. $values[$i] = $mapped;
  134. if (0 === --$toResolve) {
  135. $resolve($values);
  136. }
  137. },
  138. $reject,
  139. $notify
  140. );
  141. }
  142. }, $reject, $notify);
  143. }, $cancellationQueue);
  144. }
  145. function reduce($promisesOrValues, callable $reduceFunc, $initialValue = null)
  146. {
  147. $cancellationQueue = new CancellationQueue();
  148. $cancellationQueue->enqueue($promisesOrValues);
  149. return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $reduceFunc, $initialValue, $cancellationQueue) {
  150. resolve($promisesOrValues)
  151. ->done(function ($array) use ($reduceFunc, $initialValue, $cancellationQueue, $resolve, $reject, $notify) {
  152. if (!is_array($array)) {
  153. $array = [];
  154. }
  155. $total = count($array);
  156. $i = 0;
  157. // Wrap the supplied $reduceFunc with one that handles promises and then
  158. // delegates to the supplied.
  159. $wrappedReduceFunc = function ($current, $val) use ($reduceFunc, $cancellationQueue, $total, &$i) {
  160. $cancellationQueue->enqueue($val);
  161. return $current
  162. ->then(function ($c) use ($reduceFunc, $total, &$i, $val) {
  163. return resolve($val)
  164. ->then(function ($value) use ($reduceFunc, $total, &$i, $c) {
  165. return $reduceFunc($c, $value, $i++, $total);
  166. });
  167. });
  168. };
  169. $cancellationQueue->enqueue($initialValue);
  170. array_reduce($array, $wrappedReduceFunc, resolve($initialValue))
  171. ->done($resolve, $reject, $notify);
  172. }, $reject, $notify);
  173. }, $cancellationQueue);
  174. }
  175. // Internal functions
  176. function _checkTypehint(callable $callback, $object)
  177. {
  178. if (!is_object($object)) {
  179. return true;
  180. }
  181. if (is_array($callback)) {
  182. $callbackReflection = new \ReflectionMethod($callback[0], $callback[1]);
  183. } elseif (is_object($callback) && !$callback instanceof \Closure) {
  184. $callbackReflection = new \ReflectionMethod($callback, '__invoke');
  185. } else {
  186. $callbackReflection = new \ReflectionFunction($callback);
  187. }
  188. $parameters = $callbackReflection->getParameters();
  189. if (!isset($parameters[0])) {
  190. return true;
  191. }
  192. $expectedException = $parameters[0];
  193. if (!$expectedException->getClass()) {
  194. return true;
  195. }
  196. return $expectedException->getClass()->isInstance($object);
  197. }