Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
functions.php
001 <?php
002
003 namespace React\Promise;
004
005 function resolve($promiseOrValue = null)
006 {
007 if ($promiseOrValue instanceof ExtendedPromiseInterface) {
008 return $promiseOrValue;
009 }
010
011 if (method_exists($promiseOrValue, 'then')) {
012 $canceller = null;
013
014 if (method_exists($promiseOrValue, 'cancel')) {
015 $canceller = [$promiseOrValue, 'cancel'];
016 }
017
018 return new Promise(function ($resolve, $reject, $notify) use ($promiseOrValue) {
019 $promiseOrValue->then($resolve, $reject, $notify);
020 }, $canceller);
021 }
022
023 return new FulfilledPromise($promiseOrValue);
024 }
025
026 function reject($promiseOrValue = null)
027 {
028 if ($promiseOrValue instanceof PromiseInterface) {
029 return resolve($promiseOrValue)->then(function ($value) {
030 return new RejectedPromise($value);
031 });
032 }
033
034 return new RejectedPromise($promiseOrValue);
035 }
036
037 function all($promisesOrValues)
038 {
039 return map($promisesOrValues, function ($val) {
040 return $val;
041 });
042 }
043
044 function race($promisesOrValues)
045 {
046 $cancellationQueue = new CancellationQueue();
047 $cancellationQueue->enqueue($promisesOrValues);
048
049 return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $cancellationQueue) {
050 resolve($promisesOrValues)
051 ->done(function ($array) use ($cancellationQueue, $resolve, $reject, $notify) {
052 if (!is_array($array) || !$array) {
053 $resolve();
054 return;
055 }
056
057 $fulfiller = function ($value) use ($cancellationQueue, $resolve) {
058 $cancellationQueue();
059 $resolve($value);
060 };
061
062 $rejecter = function ($reason) use ($cancellationQueue, $reject) {
063 $cancellationQueue();
064 $reject($reason);
065 };
066
067 foreach ($array as $promiseOrValue) {
068 $cancellationQueue->enqueue($promiseOrValue);
069
070 resolve($promiseOrValue)
071 ->done($fulfiller, $rejecter, $notify);
072 }
073 }, $reject, $notify);
074 }, $cancellationQueue);
075 }
076
077 function any($promisesOrValues)
078 {
079 return some($promisesOrValues, 1)
080 ->then(function ($val) {
081 return array_shift($val);
082 });
083 }
084
085 function some($promisesOrValues, $howMany)
086 {
087 $cancellationQueue = new CancellationQueue();
088 $cancellationQueue->enqueue($promisesOrValues);
089
090 return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $howMany, $cancellationQueue) {
091 resolve($promisesOrValues)
092 ->done(function ($array) use ($howMany, $cancellationQueue, $resolve, $reject, $notify) {
093 if (!is_array($array) || $howMany < 1) {
094 $resolve([]);
095 return;
096 }
097
098 $len = count($array);
099
100 if ($len < $howMany) {
101 throw new Exception\LengthException(
102 sprintf(
103 'Input array must contain at least %d item%s but contains only %s item%s.',
104 $howMany,
105 1 === $howMany ? '' : 's',
106 $len,
107 1 === $len ? '' : 's'
108 )
109 );
110 }
111
112 $toResolve = $howMany;
113 $toReject = ($len - $toResolve) + 1;
114 $values = [];
115 $reasons = [];
116
117 foreach ($array as $i => $promiseOrValue) {
118 $fulfiller = function ($val) use ($i, &$values, &$toResolve, $toReject, $resolve, $cancellationQueue) {
119 if ($toResolve < 1 || $toReject < 1) {
120 return;
121 }
122
123 $values[$i] = $val;
124
125 if (0 === --$toResolve) {
126 $cancellationQueue();
127 $resolve($values);
128 }
129 };
130
131 $rejecter = function ($reason) use ($i, &$reasons, &$toReject, $toResolve, $reject, $cancellationQueue) {
132 if ($toResolve < 1 || $toReject < 1) {
133 return;
134 }
135
136 $reasons[$i] = $reason;
137
138 if (0 === --$toReject) {
139 $cancellationQueue();
140 $reject($reasons);
141 }
142 };
143
144 $cancellationQueue->enqueue($promiseOrValue);
145
146 resolve($promiseOrValue)
147 ->done($fulfiller, $rejecter, $notify);
148 }
149 }, $reject, $notify);
150 }, $cancellationQueue);
151 }
152
153 function map($promisesOrValues, callable $mapFunc)
154 {
155 $cancellationQueue = new CancellationQueue();
156 $cancellationQueue->enqueue($promisesOrValues);
157
158 return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $mapFunc, $cancellationQueue) {
159 resolve($promisesOrValues)
160 ->done(function ($array) use ($mapFunc, $cancellationQueue, $resolve, $reject, $notify) {
161 if (!is_array($array) || !$array) {
162 $resolve([]);
163 return;
164 }
165
166 $toResolve = count($array);
167 $values = [];
168
169 foreach ($array as $i => $promiseOrValue) {
170 $cancellationQueue->enqueue($promiseOrValue);
171
172 resolve($promiseOrValue)
173 ->then($mapFunc)
174 ->done(
175 function ($mapped) use ($i, &$values, &$toResolve, $resolve) {
176 $values[$i] = $mapped;
177
178 if (0 === --$toResolve) {
179 $resolve($values);
180 }
181 },
182 $reject,
183 $notify
184 );
185 }
186 }, $reject, $notify);
187 }, $cancellationQueue);
188 }
189
190 function reduce($promisesOrValues, callable $reduceFunc, $initialValue = null)
191 {
192 $cancellationQueue = new CancellationQueue();
193 $cancellationQueue->enqueue($promisesOrValues);
194
195 return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $reduceFunc, $initialValue, $cancellationQueue) {
196 resolve($promisesOrValues)
197 ->done(function ($array) use ($reduceFunc, $initialValue, $cancellationQueue, $resolve, $reject, $notify) {
198 if (!is_array($array)) {
199 $array = [];
200 }
201
202 $total = count($array);
203 $i = 0;
204
205 // Wrap the supplied $reduceFunc with one that handles promises and then
206 // delegates to the supplied.
207 $wrappedReduceFunc = function ($current, $val) use ($reduceFunc, $cancellationQueue, $total, &$i) {
208 $cancellationQueue->enqueue($val);
209
210 return $current
211 ->then(function ($c) use ($reduceFunc, $total, &$i, $val) {
212 return resolve($val)
213 ->then(function ($value) use ($reduceFunc, $total, &$i, $c) {
214 return $reduceFunc($c, $value, $i++, $total);
215 });
216 });
217 };
218
219 $cancellationQueue->enqueue($initialValue);
220
221 array_reduce($array, $wrappedReduceFunc, resolve($initialValue))
222 ->done($resolve, $reject, $notify);
223 }, $reject, $notify);
224 }, $cancellationQueue);
225 }
226
227 // Internal functions
228 function _checkTypehint(callable $callback, $object)
229 {
230 if (!is_object($object)) {
231 return true;
232 }
233
234 if (is_array($callback)) {
235 $callbackReflection = new \ReflectionMethod($callback[0], $callback[1]);
236 } elseif (is_object($callback) && !$callback instanceof \Closure) {
237 $callbackReflection = new \ReflectionMethod($callback, '__invoke');
238 } else {
239 $callbackReflection = new \ReflectionFunction($callback);
240 }
241
242 $parameters = $callbackReflection->getParameters();
243
244 if (!isset($parameters[0])) {
245 return true;
246 }
247
248 $expectedException = $parameters[0];
249
250 if (!$expectedException->getClass()) {
251 return true;
252 }
253
254 return $expectedException->getClass()->isInstance($object);
255 }
256