Skip to content

Commit 4be935c

Browse files
authored
Add a handy CallbackReader to read from Closure (#119)
* Add a handy CallbackReader to read from Closure * Add class comment to CallbackReader
1 parent 7906fd5 commit 4be935c

File tree

3 files changed

+74
-0
lines changed

3 files changed

+74
-0
lines changed

src/batch/docs/domain/item-job/item-reader.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ It can be any class implementing [ItemReaderInterface](../../../src/Job/Item/Ite
2121
read from multiple item reader, one after the other.
2222
- [StaticIterableReader](../../../src/Job/Item/Reader/StaticIterableReader.php):
2323
read from an iterable you provide during construction.
24+
- [CallbackReader](../../../src/Job/Item/Reader/CallbackReader.php):
25+
read from a `Closure` you provide during construction.
2426

2527
**Item readers from bridges:**
2628
- [FlatFileReader (`openspout/openspout`)](https://github.com/yokai-php/batch-openspout/blob/0.x/src/Reader/FlatFileReader.php):
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yokai\Batch\Job\Item\Reader;
6+
7+
use Yokai\Batch\Job\Item\ItemReaderInterface;
8+
9+
/**
10+
* An {@see ItemReaderInterface} that read from a {@see Closure} provided at construction.
11+
*
12+
* Provided {@see Closure} must accept no argument and must return an iterable of read items.
13+
*/
14+
final class CallbackReader implements ItemReaderInterface
15+
{
16+
public function __construct(
17+
/**
18+
* @var \Closure(): iterable<mixed>
19+
*/
20+
private readonly \Closure $callback,
21+
) {
22+
}
23+
24+
public function read(): iterable
25+
{
26+
return ($this->callback)();
27+
}
28+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Yokai\Batch\Tests\Job\Item\Reader;
6+
7+
use PHPUnit\Framework\TestCase;
8+
use Yokai\Batch\Job\Item\Reader\CallbackReader;
9+
10+
class CallbackReaderTest extends TestCase
11+
{
12+
/**
13+
* @dataProvider provider
14+
*/
15+
public function test(array $expected, \Closure $closure): void
16+
{
17+
$items = [];
18+
foreach ((new CallbackReader($closure))->read() as $item) {
19+
$items[] = $item;
20+
}
21+
22+
self::assertSame($expected, $items);
23+
}
24+
25+
public static function provider(): \Generator
26+
{
27+
yield 'array' => [
28+
[1, 2, 3],
29+
fn() => [1, 2, 3],
30+
];
31+
yield 'iterator' => [
32+
[1, 2, 3],
33+
fn() => new \ArrayIterator([1, 2, 3]),
34+
];
35+
yield 'generator' => [
36+
[1, 2, 3],
37+
function () {
38+
yield 1;
39+
yield 2;
40+
yield 3;
41+
},
42+
];
43+
}
44+
}

0 commit comments

Comments
 (0)