Skip to content

Commit

Permalink
[11.x] Add generics for Arr::last() (#53619)
Browse files Browse the repository at this point in the history
* Removed duplicate lines in existing types test

* PHPStan test: Arr::last

* Fix generics for Arr::last()

* PHPStan types test: Add first and last {array|iterable|traversable}
  • Loading branch information
talkinnl authored Nov 21, 2024
1 parent dbd312b commit a5ac6d5
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 4 deletions.
12 changes: 8 additions & 4 deletions src/Illuminate/Collections/Arr.php
Original file line number Diff line number Diff line change
Expand Up @@ -216,10 +216,14 @@ public static function first($array, ?callable $callback = null, $default = null
/**
* Return the last element in an array passing a given truth test.
*
* @param array $array
* @param callable|null $callback
* @param mixed $default
* @return mixed
* @template TKey
* @template TValue
* @template TLastDefault
*
* @param iterable<TKey, TValue> $array
* @param (callable(TValue, TKey): bool)|null $callback
* @param TLastDefault|(\Closure(): TLastDefault) $default
* @return TValue|TLastDefault
*/
public static function last($array, ?callable $callback = null, $default = null)
{
Expand Down
45 changes: 45 additions & 0 deletions types/Support/Arr.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,48 @@
assertType('string|User', Arr::first($traversable, null, function () {
return 'string';
}));

assertType('User|null', Arr::last($array));
assertType('User|null', Arr::last($array, function ($user) {
assertType('User', $user);

return true;
}));
assertType('string|User', Arr::last($array, function ($user) {
assertType('User', $user);

return false;
}, 'string'));
assertType('string|User', Arr::last($array, null, function () {
return 'string';
}));

assertType('User|null', Arr::last($iterable));
assertType('User|null', Arr::last($iterable, function ($user) {
assertType('User', $user);

return true;
}));
assertType('string|User', Arr::last($iterable, function ($user) {
assertType('User', $user);

return false;
}, 'string'));
assertType('string|User', Arr::last($iterable, null, function () {
return 'string';
}));

assertType('User|null', Arr::last($traversable));
assertType('User|null', Arr::last($traversable, function ($user) {
assertType('User', $user);

return true;
}));
assertType('string|User', Arr::last($traversable, function ($user) {
assertType('User', $user);

return false;
}, 'string'));
assertType('string|User', Arr::last($traversable, null, function () {
return 'string';
}));

0 comments on commit a5ac6d5

Please sign in to comment.