Skip to content

Commit feb27c9

Browse files
committed
Add template types
Requires: ReactiveX/RxPHP#218
1 parent 59fefc0 commit feb27c9

5 files changed

Lines changed: 91 additions & 5 deletions

File tree

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
"php": "^8.4",
1313
"react/async": "^4.3.0",
1414
"react/promise": "^2.10 || ^3.3.0",
15-
"reactivex/rxphp": "^2.1.0"
15+
"reactivex/rxphp": "^2.1.0",
16+
"wyrihaximus/react-event-loop-rx-scheduler-hook-up": "^0.1.1"
1617
},
1718
"require-dev": {
1819
"wyrihaximus/async-test-utilities": "^12.0.0",

composer.lock

Lines changed: 55 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/AwaitingIterator.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,27 @@
1313

1414
use function React\Async\await;
1515

16+
/**
17+
* @template T
18+
* @template-implements Iterator<T>
19+
*/
1620
final class AwaitingIterator implements Iterator
1721
{
22+
/** @var SplQueue<T> */
1823
private readonly SplQueue $queue;
1924
private readonly DisposableInterface $disposable;
25+
26+
/** @var Deferred<bool>|null */
2027
private Deferred|null $valid = null;
2128
private bool $completed = false;
2229
private int $key = 0;
2330

31+
/** @param ObservableInterface<T> $observable */
2432
public function __construct(ObservableInterface $observable)
2533
{
2634
$this->queue = new SplQueue();
2735
$this->disposable = $observable->subscribe(
36+
/** @param T $value */
2837
function (mixed $value): void {
2938
$this->push($value);
3039
},
@@ -43,6 +52,7 @@ public function break(): void
4352
$this->completed = true;
4453
}
4554

55+
/** @param T $value */
4656
private function push(mixed $value): void
4757
{
4858
$this->queue->enqueue($value);
@@ -69,7 +79,7 @@ private function complete(): void
6979

7080
// phpcs:disable
7181
/**
72-
* @return mixed
82+
* @return T
7383
*/
7484
public function current(): mixed
7585
{
@@ -99,7 +109,10 @@ public function valid(): bool
99109
}
100110

101111
if (! $this->completed) {
102-
$this->valid = new Deferred();
112+
/** @var Deferred<bool> $deferred */
113+
$deferred = new Deferred();
114+
$this->valid = $deferred;
115+
unset($deferred);
103116

104117
return await($this->valid->promise());
105118
}

src/functions.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,13 @@
66

77
use Rx\Observable;
88

9-
/** @return iterable<mixed> */
9+
/**
10+
* @param Observable<T> $observable
11+
*
12+
* @return iterable<T>
13+
*
14+
* @template T
15+
*/
1016
function awaitObservable(Observable $observable): iterable
1117
{
1218
return new AwaitingIterator($observable);

tests/types/iterable.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Rx\Observable;
6+
7+
use function PHPStan\Testing\assertType;
8+
use function WyriHaximus\React\awaitObservable;
9+
10+
assertType('iterable<bool>', awaitObservable(Observable::fromArray([true, false])));
11+
assertType('iterable<int>', awaitObservable(Observable::fromArray([time()])));
12+
assertType('iterable<bool|int>', awaitObservable(Observable::fromArray([true, false, time()])));

0 commit comments

Comments
 (0)