Skip to content

Commit 769eebb

Browse files
committed
Change to use functional API instead of static Util class
1 parent 3dccf8c commit 769eebb

8 files changed

+161
-131
lines changed

README.md

+31-8
Original file line numberDiff line numberDiff line change
@@ -25,24 +25,48 @@ whatsoever!*
2525
**Table of Contents**
2626

2727
* [Usage](#usage)
28-
* [Parallel](#parallel)
29-
* [Waterfall](#waterfall)
28+
* [parallel()](#parallel)
29+
* [waterfall()](#waterfall)
3030
* [Todo](#todo)
3131
* [Install](#install)
3232
* [Tests](#tests)
3333
* [License](#license)
3434

3535
## Usage
3636

37-
### Parallel
37+
This lightweight library consists only of a few simple functions.
38+
All functions reside under the `React\Async` namespace.
39+
40+
The below examples refer to all functions with their fully-qualified names like this:
41+
42+
```php
43+
React\Async\parallel(…);
44+
```
45+
46+
As of PHP 5.6+ you can also import each required function into your code like this:
47+
48+
```php
49+
use function React\Async\parallel;
50+
51+
parallel(…);
52+
```
53+
54+
Alternatively, you can also use an import statement similar to this:
55+
56+
```php
57+
use React\Async;
58+
59+
Async\parallel(…);
60+
```
61+
62+
### parallel()
3863

3964
```php
4065
<?php
4166

42-
use React\Async\Util as Async;
4367
use React\EventLoop\Loop;
4468

45-
Async::parallel(
69+
React\Async\parallel(
4670
array(
4771
function ($callback, $errback) {
4872
Loop::addTimer(1, function () use ($callback) {
@@ -71,12 +95,11 @@ Async::parallel(
7195
);
7296
```
7397

74-
### Waterfall
98+
### waterfall()
7599

76100
```php
77101
<?php
78102

79-
use React\Async\Util as Async;
80103
use React\EventLoop\Loop;
81104

82105
$addOne = function ($prev, $callback = null) {
@@ -90,7 +113,7 @@ $addOne = function ($prev, $callback = null) {
90113
});
91114
};
92115

93-
Async::waterfall(array(
116+
React\Async\waterfall(array(
94117
$addOne,
95118
$addOne,
96119
$addOne,

composer.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@
3636
"react/event-loop": "You need an event loop for this to make sense."
3737
},
3838
"autoload": {
39-
"psr-4": { "React\\Async\\": "src/" }
39+
"files": [
40+
"src/functions_include.php"
41+
]
4042
},
4143
"autoload-dev": {
4244
"psr-4": { "React\\Tests\\Async\\": "tests/" }

src/Util.php

-106
This file was deleted.

src/functions.php

+103
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
<?php
2+
3+
namespace React\Async;
4+
5+
function parallel($tasks, $callback = null, $errback = null)
6+
{
7+
$results = array();
8+
$errors = array();
9+
10+
$taskErrback = function ($error) use (&$errors, &$checkDone) {
11+
$errors[] = $error;
12+
$checkDone();
13+
};
14+
15+
$done = function () use (&$results, &$errors, $callback, $errback) {
16+
if (!$callback) {
17+
return;
18+
}
19+
20+
if (count($errors)) {
21+
$errback(array_shift($errors));
22+
return;
23+
}
24+
25+
$callback($results);
26+
};
27+
28+
$numTasks = count($tasks);
29+
30+
if (0 === $numTasks) {
31+
$done();
32+
return;
33+
}
34+
35+
$checkDone = function () use (&$results, &$errors, $numTasks, $done) {
36+
if ($numTasks === count($results) + count($errors)) {
37+
$done();
38+
}
39+
};
40+
41+
foreach ($tasks as $i => $task) {
42+
$taskCallback = function ($result) use (&$results, $i, $checkDone) {
43+
$results[$i] = $result;
44+
$checkDone();
45+
};
46+
47+
call_user_func($task, $taskCallback, $taskErrback);
48+
}
49+
}
50+
51+
function series($tasks, $callback = null, $errback = null)
52+
{
53+
$results = array();
54+
55+
$taskCallback = function ($result) use (&$results, &$next) {
56+
$results[] = $result;
57+
$next();
58+
};
59+
60+
$done = function () use (&$results, $callback) {
61+
if ($callback) {
62+
call_user_func($callback, $results);
63+
}
64+
};
65+
66+
$next = function () use (&$tasks, $taskCallback, $errback, $done) {
67+
if (0 === count($tasks)) {
68+
$done();
69+
return;
70+
}
71+
72+
$task = array_shift($tasks);
73+
call_user_func($task, $taskCallback, $errback);
74+
};
75+
76+
$next();
77+
}
78+
79+
function waterfall($tasks, $callback = null, $errback = null)
80+
{
81+
$taskCallback = function () use (&$next) {
82+
call_user_func_array($next, func_get_args());
83+
};
84+
85+
$done = function () use ($callback) {
86+
if ($callback) {
87+
call_user_func_array($callback, func_get_args());
88+
}
89+
};
90+
91+
$next = function () use (&$tasks, $taskCallback, $errback, $done) {
92+
if (0 === count($tasks)) {
93+
call_user_func_array($done, func_get_args());
94+
return;
95+
}
96+
97+
$task = array_shift($tasks);
98+
$args = array_merge(func_get_args(), array($taskCallback, $errback));
99+
call_user_func_array($task, $args);
100+
};
101+
102+
$next();
103+
}

src/functions_include.php

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace React\Async;
4+
5+
// @codeCoverageIgnoreStart
6+
if (!function_exists(__NAMESPACE__ . '\\parallel')) {
7+
require __DIR__ . '/functions.php';
8+
}

tests/UtilParallelTest.php renamed to tests/ParallelTest.php

+6-6
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
namespace React\Tests\Async;
44

5-
use React\Async\Util;
5+
use React;
66
use React\EventLoop\Loop;
77

8-
class UtilParallelTest extends TestCase
8+
class ParallelTest extends TestCase
99
{
1010
public function testParallelWithoutTasks()
1111
{
@@ -14,7 +14,7 @@ public function testParallelWithoutTasks()
1414
$callback = $this->expectCallableOnceWith(array());
1515
$errback = $this->expectCallableNever();
1616

17-
Util::parallel($tasks, $callback, $errback);
17+
React\Async\parallel($tasks, $callback, $errback);
1818
}
1919

2020
public function testParallelWithTasks()
@@ -35,7 +35,7 @@ function ($callback, $errback) {
3535
$callback = $this->expectCallableOnceWith(array('foo', 'bar'));
3636
$errback = $this->expectCallableNever();
3737

38-
Util::parallel($tasks, $callback, $errback);
38+
React\Async\parallel($tasks, $callback, $errback);
3939

4040
$timer = new Timer($this);
4141
$timer->start();
@@ -68,7 +68,7 @@ function ($callback, $errback) use (&$called) {
6868
$callback = $this->expectCallableNever();
6969
$errback = $this->expectCallableOnce();
7070

71-
Util::parallel($tasks, $callback, $errback);
71+
React\Async\parallel($tasks, $callback, $errback);
7272

7373
$this->assertSame(2, $called);
7474
}
@@ -97,7 +97,7 @@ function ($callback, $errback) use (&$called) {
9797
$callback = $this->expectCallableNever();
9898
$errback = $this->expectCallableOnce();
9999

100-
Util::parallel($tasks, $callback, $errback);
100+
React\Async\parallel($tasks, $callback, $errback);
101101

102102
Loop::run();
103103

tests/UtilSeriesTest.php renamed to tests/SeriesTest.php

+5-5
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
namespace React\Tests\Async;
44

5-
use React\Async\Util;
5+
use React;
66
use React\EventLoop\Loop;
77

8-
class UtilSeriesTest extends TestCase
8+
class SeriesTest extends TestCase
99
{
1010
public function testSeriesWithoutTasks()
1111
{
@@ -14,7 +14,7 @@ public function testSeriesWithoutTasks()
1414
$callback = $this->expectCallableOnceWith(array());
1515
$errback = $this->expectCallableNever();
1616

17-
Util::series($tasks, $callback, $errback);
17+
React\Async\series($tasks, $callback, $errback);
1818
}
1919

2020
public function testSeriesWithTasks()
@@ -35,7 +35,7 @@ function ($callback, $errback) {
3535
$callback = $this->expectCallableOnceWith(array('foo', 'bar'));
3636
$errback = $this->expectCallableNever();
3737

38-
Util::series($tasks, $callback, $errback);
38+
React\Async\series($tasks, $callback, $errback);
3939

4040
$timer = new Timer($this);
4141
$timer->start();
@@ -68,7 +68,7 @@ function ($callback, $errback) use (&$called) {
6868
$callback = $this->expectCallableNever();
6969
$errback = $this->expectCallableOnce();
7070

71-
Util::series($tasks, $callback, $errback);
71+
React\Async\series($tasks, $callback, $errback);
7272

7373
$this->assertSame(1, $called);
7474
}

0 commit comments

Comments
 (0)