Skip to content

Commit 409b975

Browse files
committed
Add functions and make When a proxy for them for BC
1 parent 5dd458b commit 409b975

3 files changed

Lines changed: 167 additions & 128 deletions

File tree

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
"autoload": {
1212
"psr-0": {
1313
"React\\Promise": "src/"
14-
}
14+
},
15+
"files": ["src/React/Promise/functions.php"]
1516
},
1617
"extra": {
1718
"branch-alias": {

src/React/Promise/When.php

Lines changed: 7 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ class When
66
{
77
public static function resolve($promiseOrValue = null)
88
{
9-
return Util::promiseFor($promiseOrValue);
9+
return resolve($promiseOrValue);
1010
}
1111

1212
public static function reject($promiseOrValue = null)
1313
{
14-
return Util::rejectedPromiseFor($promiseOrValue);
14+
return reject($promiseOrValue);
1515
}
1616

1717
public static function lazy($factory)
@@ -21,146 +21,26 @@ public static function lazy($factory)
2121

2222
public static function all($promisesOrValues, $fulfilledHandler = null, $errorHandler = null, $progressHandler = null)
2323
{
24-
$promise = static::map($promisesOrValues, function ($val) {
25-
return $val;
26-
});
27-
28-
return $promise->then($fulfilledHandler, $errorHandler, $progressHandler);
24+
return all($promisesOrValues)->then($fulfilledHandler, $errorHandler, $progressHandler);
2925
}
3026

3127
public static function any($promisesOrValues, $fulfilledHandler = null, $errorHandler = null, $progressHandler = null)
3228
{
33-
$promise = static::some($promisesOrValues, 1)->then(function($val) {
34-
return array_shift($val);
35-
});
36-
37-
return $promise->then($fulfilledHandler, $errorHandler, $progressHandler);
29+
return any($promisesOrValues)->then($fulfilledHandler, $errorHandler, $progressHandler);
3830
}
3931

4032
public static function some($promisesOrValues, $howMany, $fulfilledHandler = null, $errorHandler = null, $progressHandler = null)
4133
{
42-
return When::resolve($promisesOrValues)->then(function ($array) use ($howMany, $fulfilledHandler, $errorHandler, $progressHandler) {
43-
if (!is_array($array)) {
44-
$array = array();
45-
}
46-
47-
$len = count($array);
48-
$toResolve = max(0, min($howMany, $len));
49-
$values = array();
50-
$deferred = new Deferred();
51-
52-
if (!$toResolve) {
53-
$deferred->resolve($values);
54-
} else {
55-
$toReject = ($len - $toResolve) + 1;
56-
$reasons = array();
57-
58-
$progress = array($deferred, 'progress');
59-
60-
$fulfillOne = function ($val, $i) use (&$values, &$toResolve, $deferred) {
61-
$values[$i] = $val;
62-
63-
if (0 === --$toResolve) {
64-
$deferred->resolve($values);
65-
66-
return true;
67-
}
68-
};
69-
70-
$rejectOne = function ($reason, $i) use (&$reasons, &$toReject, $deferred) {
71-
$reasons[$i] = $reason;
72-
73-
if (0 === --$toReject) {
74-
$deferred->reject($reasons);
75-
76-
return true;
77-
}
78-
};
79-
80-
foreach ($array as $i => $promiseOrValue) {
81-
$fulfiller = function ($val) use ($i, &$fulfillOne, &$rejectOne) {
82-
$reset = $fulfillOne($val, $i);
83-
84-
if (true === $reset) {
85-
$fulfillOne = $rejectOne = function () {};
86-
}
87-
};
88-
89-
$rejecter = function ($val) use ($i, &$fulfillOne, &$rejectOne) {
90-
$reset = $rejectOne($val, $i);
91-
92-
if (true === $reset) {
93-
$fulfillOne = $rejectOne = function () {};
94-
}
95-
};
96-
97-
When::resolve($promiseOrValue)->then($fulfiller, $rejecter, $progress);
98-
}
99-
}
100-
101-
return $deferred->then($fulfilledHandler, $errorHandler, $progressHandler);
102-
});
34+
return some($promisesOrValues, $howMany)->then($fulfilledHandler, $errorHandler, $progressHandler);
10335
}
10436

10537
public static function map($promisesOrValues, $mapFunc)
10638
{
107-
return When::resolve($promisesOrValues)->then(function ($array) use ($mapFunc) {
108-
if (!is_array($array)) {
109-
$array = array();
110-
}
111-
112-
$toResolve = count($array);
113-
$results = array();
114-
$deferred = new Deferred();
115-
116-
if (!$toResolve) {
117-
$deferred->resolve($results);
118-
} else {
119-
$resolve = function ($item, $i) use ($mapFunc, &$results, &$toResolve, $deferred) {
120-
When::resolve($item)
121-
->then($mapFunc)
122-
->then(
123-
function ($mapped) use (&$results, $i, &$toResolve, $deferred) {
124-
$results[$i] = $mapped;
125-
126-
if (0 === --$toResolve) {
127-
$deferred->resolve($results);
128-
}
129-
},
130-
array($deferred, 'reject')
131-
);
132-
};
133-
134-
foreach ($array as $i => $item) {
135-
$resolve($item, $i);
136-
}
137-
}
138-
139-
return $deferred->promise();
140-
});
39+
return map($promisesOrValues, $mapFunc);
14140
}
14241

14342
public static function reduce($promisesOrValues, $reduceFunc , $initialValue = null)
14443
{
145-
return When::resolve($promisesOrValues)->then(function ($array) use ($reduceFunc, $initialValue) {
146-
if (!is_array($array)) {
147-
$array = array();
148-
}
149-
150-
$total = count($array);
151-
$i = 0;
152-
153-
// Wrap the supplied $reduceFunc with one that handles promises and then
154-
// delegates to the supplied.
155-
$wrappedReduceFunc = function ($current, $val) use ($reduceFunc, $total, &$i) {
156-
return When::resolve($current)->then(function ($c) use ($reduceFunc, $total, &$i, $val) {
157-
return When::resolve($val)->then(function ($value) use ($reduceFunc, $total, &$i, $c) {
158-
return call_user_func($reduceFunc, $c, $value, $i++, $total);
159-
});
160-
});
161-
};
162-
163-
return array_reduce($array, $wrappedReduceFunc, $initialValue);
164-
});
44+
return reduce($promisesOrValues, $reduceFunc, $initialValue);
16545
}
16646
}

src/React/Promise/functions.php

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
<?php
2+
3+
namespace React\Promise;
4+
5+
if (function_exists('React\Promise\resolve')) {
6+
return;
7+
}
8+
9+
function resolve($promiseOrValue = null)
10+
{
11+
return Util::promiseFor($promiseOrValue);
12+
}
13+
14+
function reject($promiseOrValue = null)
15+
{
16+
return Util::rejectedPromiseFor($promiseOrValue);
17+
}
18+
19+
function all($promisesOrValues)
20+
{
21+
return map($promisesOrValues, function ($val) {
22+
return $val;
23+
});
24+
}
25+
26+
function any($promisesOrValues)
27+
{
28+
return some($promisesOrValues, 1)->then(function($val) {
29+
return array_shift($val);
30+
});
31+
}
32+
33+
function some($promisesOrValues, $howMany)
34+
{
35+
return resolve($promisesOrValues)->then(function ($array) use ($howMany) {
36+
if (!is_array($array)) {
37+
$array = array();
38+
}
39+
40+
$len = count($array);
41+
$toResolve = max(0, min($howMany, $len));
42+
$values = array();
43+
$deferred = new Deferred();
44+
45+
if (!$toResolve) {
46+
$deferred->resolve($values);
47+
} else {
48+
$toReject = ($len - $toResolve) + 1;
49+
$reasons = array();
50+
51+
$progress = array($deferred, 'progress');
52+
53+
$fulfillOne = function ($val, $i) use (&$values, &$toResolve, $deferred) {
54+
$values[$i] = $val;
55+
56+
if (0 === --$toResolve) {
57+
$deferred->resolve($values);
58+
59+
return true;
60+
}
61+
};
62+
63+
$rejectOne = function ($reason, $i) use (&$reasons, &$toReject, $deferred) {
64+
$reasons[$i] = $reason;
65+
66+
if (0 === --$toReject) {
67+
$deferred->reject($reasons);
68+
69+
return true;
70+
}
71+
};
72+
73+
foreach ($array as $i => $promiseOrValue) {
74+
$fulfiller = function ($val) use ($i, &$fulfillOne, &$rejectOne) {
75+
$reset = $fulfillOne($val, $i);
76+
77+
if (true === $reset) {
78+
$fulfillOne = $rejectOne = function () {};
79+
}
80+
};
81+
82+
$rejecter = function ($val) use ($i, &$fulfillOne, &$rejectOne) {
83+
$reset = $rejectOne($val, $i);
84+
85+
if (true === $reset) {
86+
$fulfillOne = $rejectOne = function () {};
87+
}
88+
};
89+
90+
resolve($promiseOrValue)->then($fulfiller, $rejecter, $progress);
91+
}
92+
}
93+
94+
return $deferred->promise();
95+
});
96+
}
97+
98+
function map($promisesOrValues, $mapFunc)
99+
{
100+
return resolve($promisesOrValues)->then(function ($array) use ($mapFunc) {
101+
if (!is_array($array)) {
102+
$array = array();
103+
}
104+
105+
$toResolve = count($array);
106+
$results = array();
107+
$deferred = new Deferred();
108+
109+
if (!$toResolve) {
110+
$deferred->resolve($results);
111+
} else {
112+
$resolve = function ($item, $i) use ($mapFunc, &$results, &$toResolve, $deferred) {
113+
resolve($item)
114+
->then($mapFunc)
115+
->then(
116+
function ($mapped) use (&$results, $i, &$toResolve, $deferred) {
117+
$results[$i] = $mapped;
118+
119+
if (0 === --$toResolve) {
120+
$deferred->resolve($results);
121+
}
122+
},
123+
array($deferred, 'reject')
124+
);
125+
};
126+
127+
foreach ($array as $i => $item) {
128+
$resolve($item, $i);
129+
}
130+
}
131+
132+
return $deferred->promise();
133+
});
134+
}
135+
136+
function reduce($promisesOrValues, $reduceFunc , $initialValue = null)
137+
{
138+
return resolve($promisesOrValues)->then(function ($array) use ($reduceFunc, $initialValue) {
139+
if (!is_array($array)) {
140+
$array = array();
141+
}
142+
143+
$total = count($array);
144+
$i = 0;
145+
146+
// Wrap the supplied $reduceFunc with one that handles promises and then
147+
// delegates to the supplied.
148+
$wrappedReduceFunc = function ($current, $val) use ($reduceFunc, $total, &$i) {
149+
return resolve($current)->then(function ($c) use ($reduceFunc, $total, &$i, $val) {
150+
return resolve($val)->then(function ($value) use ($reduceFunc, $total, &$i, $c) {
151+
return call_user_func($reduceFunc, $c, $value, $i++, $total);
152+
});
153+
});
154+
};
155+
156+
return array_reduce($array, $wrappedReduceFunc, $initialValue);
157+
});
158+
}

0 commit comments

Comments
 (0)