Skip to content

Commit d9db57b

Browse files
committed
PHPStan and Pslam and static analysis improvements.
1 parent f9b55e8 commit d9db57b

19 files changed

Lines changed: 172 additions & 51 deletions

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
.PHONY : lint tests style phpstan psalm phpmd coverage composer-unused composer-require-checker composer-audit
22

3-
all : lint tests style phpstan psalm phpmd composer-unused composer-require-checker
3+
all : lint tests style phpstan psalm composer-unused composer-require-checker
44

55
tests :
66
vendor/bin/phpunit tests/ --configuration=tests/phpunit.xml

src/Math.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ public static function runningTotal(iterable $numbers, int|float|null $initialVa
9898

9999
$total = $initialValue ?? 0;
100100
foreach ($numbers as $number) {
101+
/** @psalm-suppress InvalidOperand */
101102
$total += $number;
102103
yield $total;
103104
}
@@ -119,6 +120,7 @@ public static function runningProduct(iterable $numbers, int|float|null $initial
119120

120121
$product = $initialValue ?? 1;
121122
foreach ($numbers as $number) {
123+
/** @psalm-suppress InvalidOperand */
122124
$product *= $number;
123125
yield $product;
124126
}
@@ -140,6 +142,7 @@ public static function runningDifference(iterable $numbers, int|float|null $init
140142

141143
$difference = $initialValue ?? 0;
142144
foreach ($numbers as $number) {
145+
/** @psalm-suppress InvalidOperand */
143146
$difference -= $number;
144147
yield $difference;
145148
}
@@ -200,6 +203,7 @@ public static function runningAverage(iterable $numbers, int|float|null $initial
200203
$n = 0;
201204
foreach (Math::runningTotal($numbers, $initialValue) as $runningTotal) {
202205
$n++;
206+
/** @psalm-suppress InvalidOperand */
203207
yield $runningTotal / $n;
204208
}
205209
}

src/Multi.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ public static function zipEqual(iterable ...$iterables): \Generator
9898
{
9999
$zippedIterator = new StrictMultipleIterator(\MultipleIterator::MIT_NEED_ALL);
100100
foreach ($iterables as $iterable) {
101+
/** @psalm-suppress MixedArgumentTypeCoercion */
101102
$zippedIterator->attachIterator(Transform::toIterator($iterable));
102103
}
103104
$zippedIterator->setFlags(\MultipleIterator::MIT_NEED_ALL);
@@ -120,6 +121,7 @@ public static function chain(iterable ...$iterables): \Generator
120121
{
121122
foreach ($iterables as $iterable) {
122123
foreach ($iterable as $item) {
124+
/** @var mixed $item */
123125
yield $item;
124126
}
125127
}

src/Reduce.php

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,15 @@ final class Reduce
2222
*/
2323
public static function toValue(iterable $data, callable $reducer, mixed $initialValue = null): mixed
2424
{
25+
/** @var mixed $carry */
2526
$carry = $initialValue;
2627

2728
foreach ($data as $datum) {
29+
/** @var mixed $datum */
2830
$carry = $reducer($carry, $datum);
2931
}
3032

33+
/** @var T */
3134
return $carry;
3235
}
3336

@@ -49,13 +52,13 @@ public static function toMin(iterable $data, ?callable $compareBy = null): mixed
4952
if ($compareBy !== null) {
5053
return static::toValue(
5154
$data,
52-
fn ($carry, $datum) => $compareBy($datum) < $compareBy($carry ?? $datum)
55+
fn (mixed $carry, mixed $datum): mixed => $compareBy($datum) < $compareBy($carry ?? $datum)
5356
? $datum
5457
: $carry ?? $datum
5558
);
5659
}
5760

58-
return static::toValue($data, fn ($carry, $datum) => \min($carry ?? $datum, $datum));
61+
return static::toValue($data, fn (mixed $carry, mixed $datum): mixed => \min($carry ?? $datum, $datum));
5962
}
6063

6164
/**
@@ -76,13 +79,13 @@ public static function toMax(iterable $data, ?callable $compareBy = null): mixed
7679
if ($compareBy !== null) {
7780
return static::toValue(
7881
$data,
79-
fn ($carry, $datum) => $compareBy($datum) > $compareBy($carry ?? $datum)
82+
fn (mixed $carry, mixed $datum): mixed => $compareBy($datum) > $compareBy($carry ?? $datum)
8083
? $datum
8184
: $carry ?? $datum
8285
);
8386
}
8487

85-
return static::toValue($data, fn ($carry, $datum) => \max($carry ?? $datum, $datum));
88+
return static::toValue($data, fn (mixed $carry, mixed $datum): mixed => \max($carry ?? $datum, $datum));
8689
}
8790

8891
/**
@@ -103,7 +106,7 @@ public static function toMax(iterable $data, ?callable $compareBy = null): mixed
103106
public static function toMinMax(iterable $numbers, ?callable $compareBy = null): array
104107
{
105108
if ($compareBy !== null) {
106-
return static::toValue($numbers, static function (array $carry, $datum) use ($compareBy) {
109+
return static::toValue($numbers, static function (array $carry, mixed $datum) use ($compareBy): array {
107110
return [
108111
$compareBy($datum) <= $compareBy($carry[0] ?? $datum)
109112
? $datum
@@ -118,7 +121,7 @@ public static function toMinMax(iterable $numbers, ?callable $compareBy = null):
118121
return static::toValue(
119122
$numbers,
120123
/** @param array{numeric|null, numeric|null} $carry */
121-
fn (array $carry, $datum) => [
124+
fn (array $carry, mixed $datum): array => [
122125
\min($carry[0] ?? $datum, $datum),
123126
\max($carry[1] ?? $datum, $datum)
124127
],
@@ -139,7 +142,7 @@ public static function toCount(iterable $data): int
139142
return \count($data);
140143
}
141144

142-
return static::toValue($data, fn (int $carry) => $carry + 1, 0);
145+
return static::toValue($data, fn (int $carry): int => $carry + 1, 0);
143146
}
144147

145148
/**
@@ -152,8 +155,8 @@ public static function toCount(iterable $data): int
152155
*/
153156
public static function toSum(iterable $data): int|float
154157
{
155-
/** @phpstan-ignore binaryOp.invalid */
156-
return static::toValue($data, fn ($carry, $datum) => $carry + $datum, 0);
158+
/** @psalm-suppress MixedOperand */
159+
return static::toValue($data, fn (int|float $carry, mixed $datum): int|float => $carry + $datum, 0); // @phpstan-ignore binaryOp.invalid
157160
}
158161

159162
/**
@@ -168,8 +171,8 @@ public static function toSum(iterable $data): int|float
168171
*/
169172
public static function toProduct(iterable $data): int|float|null
170173
{
171-
/** @phpstan-ignore binaryOp.invalid */
172-
return static::toValue($data, fn ($carry, $datum) => ($carry ?? 1) * $datum);
174+
/** @psalm-suppress MixedOperand */
175+
return static::toValue($data, fn (int|float|null $carry, mixed $datum): int|float => ($carry ?? 1) * $datum); // @phpstan-ignore binaryOp.invalid
173176
}
174177

175178
/**
@@ -188,16 +191,20 @@ public static function toAverage(iterable $data): int|float|null
188191
* @param int|float $datum
189192
* @return array{int, int|float}
190193
*/
194+
/** @psalm-suppress MixedOperand */
191195
$accumulator = static function (array $carry, mixed $datum): array {
196+
/** @var int $count */
197+
/** @var int|float $sum */
192198
[$count, $sum] = $carry;
193-
/** @phpstan-ignore binaryOp.invalid, binaryOp.invalid */
199+
/** @phpstan-ignore binaryOp.invalid */
194200
return [$count + 1, $sum + $datum];
195201
};
196202

197203
/** @var array{int, int|float} $result */
198204
$result = static::toValue($data, $accumulator, [0, 0]);
199205
[$count, $sum] = $result;
200206

207+
/** @psalm-suppress InvalidOperand */
201208
return $count ? ($sum / $count) : null;
202209
}
203210

@@ -215,8 +222,10 @@ public static function toAverage(iterable $data): int|float|null
215222
*/
216223
public static function toString(iterable $data, string $separator = '', string $prefix = '', string $suffix = ''): string
217224
{
225+
/** @var list<string|int|float> $items */
218226
$items = [];
219227
foreach ($data as $datum) {
228+
/** @var string|int|float $datum */
220229
$items[] = $datum;
221230
}
222231

@@ -237,6 +246,7 @@ public static function toRange(iterable $numbers): int|float
237246
{
238247
[$min, $max] = static::toMinMax($numbers);
239248

249+
/** @psalm-suppress InvalidOperand */
240250
return ($max ?? 0) - ($min ?? 0);
241251
}
242252

@@ -251,6 +261,7 @@ public static function toRange(iterable $numbers): int|float
251261
public static function toFirst(iterable $data): mixed
252262
{
253263
foreach ($data as $datum) {
264+
/** @var mixed $datum */
254265
return $datum;
255266
}
256267

@@ -268,7 +279,7 @@ public static function toFirst(iterable $data): mixed
268279
public static function toLast(iterable $data): mixed
269280
{
270281
/** @var mixed|NoValueMonad $result */
271-
$result = static::toValue($data, fn ($carry, $datum) => $datum, NoValueMonad::getInstance());
282+
$result = static::toValue($data, fn (mixed $carry, mixed $datum): mixed => $datum, NoValueMonad::getInstance());
272283

273284
if ($result instanceof NoValueMonad) {
274285
throw new \LengthException('collection is empty');
@@ -310,6 +321,7 @@ public static function toRandomValue(iterable $data): mixed
310321

311322
$index = 0;
312323
foreach ($data as $datum) {
324+
/** @var mixed $datum */
313325
if ($targetIndex === $index) {
314326
return $datum;
315327
}

src/Single.php

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ public static function compress(iterable $data, iterable $selectors): \Generator
7575
public static function compressAssociative(iterable $data, array $keys): \Generator
7676
{
7777
$keyMap = \array_flip($keys);
78+
/** @var mixed $datum */
7879
foreach ($data as $key => $datum) {
7980
if (\array_key_exists($key, $keyMap)) {
8081
yield $key => $datum;
@@ -153,11 +154,11 @@ public static function filter(iterable $data, callable $predicate): \Generator
153154
public static function filterFalse(iterable $data, ?callable $predicate = null): \Generator
154155
{
155156
if ($predicate === null) {
156-
$predicate = fn($datum): bool => \boolval($datum);
157+
$predicate = fn(mixed $datum): bool => \boolval($datum);
157158
}
158159

159160
foreach ($data as $key => $datum) {
160-
if (!$predicate($datum)) {
161+
if (!(bool) $predicate($datum)) {
161162
yield $key => $datum;
162163
}
163164
}
@@ -176,11 +177,11 @@ public static function filterFalse(iterable $data, ?callable $predicate = null):
176177
public static function filterTrue(iterable $data, ?callable $predicate = null): \Generator
177178
{
178179
if ($predicate === null) {
179-
$predicate = fn($datum): bool => \boolval($datum);
180+
$predicate = fn(mixed $datum): bool => \boolval($datum);
180181
}
181182

182183
foreach ($data as $key => $datum) {
183-
if ($predicate($datum)) {
184+
if ((bool) $predicate($datum)) {
184185
yield $key => $datum;
185186
}
186187
}
@@ -246,7 +247,7 @@ public static function groupBy(
246247
callable $groupKeyFunction,
247248
?callable $itemKeyFunction = null
248249
): \Generator {
249-
$itemKeyFunction ??= fn ($x) => null;
250+
$itemKeyFunction ??= fn (mixed $_x): mixed => null;
250251
$groups = [];
251252

252253
foreach ($data as $item) {
@@ -469,9 +470,9 @@ public static function reverse(iterable $data): \Generator
469470
* @template T
470471
*
471472
* @param iterable<T> $data
472-
* @param int<0, max> $start
473-
* @param int<0, max>|null $count
474-
* @param positive-int $step
473+
* @param int $start
474+
* @param int|null $count
475+
* @param int $step
475476
*
476477
* @return \Generator<T>
477478
*/
@@ -496,9 +497,10 @@ public static function slice(iterable $data, int $start = 0, ?int $count = null,
496497
continue;
497498
}
498499

499-
if ($count !== null && $yielded++ === $count) {
500+
if ($count !== null && $yielded === $count) {
500501
break;
501502
}
503+
$yielded++;
502504

503505
yield $datum;
504506
}
@@ -508,8 +510,8 @@ public static function slice(iterable $data, int $start = 0, ?int $count = null,
508510
* Skip n elements in the iterable after optional offset offset.
509511
*
510512
* @param iterable<mixed> $data
511-
* @param int<0, max> $count
512-
* @param int<0, max> $offset
513+
* @param int $count
514+
* @param int $offset
513515
*
514516
* @return \Generator
515517
*/

src/Stream.php

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,7 @@ public function relativeFrequencies(bool $strict = true): self
535535
*
536536
* If comparator is null, then elements of the iterable source must be comparable.
537537
*
538-
* @param callable|null $comparator (optional) function to determine how to sort elements if default sort is not appropriate.
538+
* @param (callable(mixed, mixed):int)|null $comparator (optional) function to determine how to sort elements if default sort is not appropriate.
539539
*
540540
* @return Stream
541541
*
@@ -552,7 +552,7 @@ public function sort(?callable $comparator = null): self
552552
*
553553
* If comparator is null, then elements of the iterable source must be comparable.
554554
*
555-
* @param callable|null $comparator (optional) function to determine how to sort elements if default sort is not appropriate.
555+
* @param (callable(mixed, mixed):int)|null $comparator (optional) function to determine how to sort elements if default sort is not appropriate.
556556
*
557557
* @return Stream
558558
*
@@ -1072,8 +1072,8 @@ public function toArray(): array
10721072
/**
10731073
* Converts iterable source to an associative array.
10741074
*
1075-
* @param callable|null $keyFunc fn ($value, $key) => Custom Logic
1076-
* @param callable|null $valueFunc fn ($value, $key) => Custom logic
1075+
* @param (callable(mixed, mixed):mixed)|null $keyFunc fn ($value, $key) => Custom Logic
1076+
* @param (callable(mixed, mixed):mixed)|null $valueFunc fn ($value, $key) => Custom logic
10771077
*
10781078
* @return array<mixed>
10791079
*
@@ -1128,8 +1128,8 @@ public function toFile(mixed $fileResource, string $newlineSeparator = \PHP_EOL,
11281128
}
11291129

11301130
foreach ($this->iterable as $line) {
1131-
/** @phpstan-ignore argument.type */
1132-
$line = \is_float($line) && \is_nan($line) ? 'NAN' : \strval($line);
1131+
/** @psalm-suppress MixedArgument */
1132+
$line = \is_float($line) && \is_nan($line) ? 'NAN' : \strval($line); // @phpstan-ignore argument.type
11331133

11341134
if ($firstIteration) {
11351135
$firstIteration = false;
@@ -1690,6 +1690,7 @@ public function printR(): void
16901690
public function varDump(): void
16911691
{
16921692
foreach ($this->iterable as $item) {
1693+
/** @psalm-suppress ForbiddenCode */
16931694
\var_dump($item);
16941695
}
16951696
}

src/Summary.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,12 +205,12 @@ public static function exactlyN(iterable $data, int $n, ?callable $predicate = n
205205
}
206206

207207
if ($predicate === null) {
208-
$predicate = fn($datum): bool => boolval($datum);
208+
$predicate = fn(mixed $datum): bool => boolval($datum);
209209
}
210210

211211
$count = 0;
212212
foreach ($data as $datum) {
213-
if ($predicate($datum)) {
213+
if ((bool) $predicate($datum)) {
214214
$count++;
215215
if ($count > $n) {
216216
return false;
@@ -320,12 +320,12 @@ private static function arePermutationsInternal(bool $strict, iterable ...$itera
320320
*/
321321
public static function isPartitioned(iterable $data, ?callable $predicate = null): bool
322322
{
323-
$predicate ??= fn ($item): bool => \boolval($item);
323+
$predicate ??= fn (mixed $item): bool => \boolval($item);
324324

325325
$allTrueSoFar = true;
326326

327327
foreach ($data as $datum) {
328-
$currentItemTrue = $predicate($datum);
328+
$currentItemTrue = (bool) $predicate($datum);
329329

330330
if ($allTrueSoFar && !$currentItemTrue) {
331331
$allTrueSoFar = false;

0 commit comments

Comments
 (0)