Skip to content

Commit dc87eb0

Browse files
committed
(WIP)
1 parent c0f7d1d commit dc87eb0

File tree

4 files changed

+156
-14
lines changed

4 files changed

+156
-14
lines changed

src/Type/Php/ArgumentBasedFunctionReturnTypeExtension.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,12 @@ final class ArgumentBasedFunctionReturnTypeExtension implements DynamicFunctionR
2525
'array_diff' => 0,
2626
'array_udiff_assoc' => 0,
2727
'array_udiff_uassoc' => 0,
28-
'array_udiff' => 0,
2928
'array_intersect_assoc' => 0,
3029
'array_intersect_uassoc' => 0,
3130
'array_intersect_ukey' => 0,
3231
'array_intersect' => 0,
3332
'array_uintersect_assoc' => 0,
3433
'array_uintersect_uassoc' => 0,
35-
'array_uintersect' => 0,
3634
];
3735

3836
public function isFunctionSupported(FunctionReflection $functionReflection): bool

stubs/arrayFunctions.stub

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -58,30 +58,32 @@ function uksort(array &$array, callable $callback): bool
5858
}
5959

6060
/**
61-
* @template T
62-
* @template U
63-
* @param array<T> $one
64-
* @param array<U> $two
65-
* @param callable(T, U): int $three
61+
* @template T of array
62+
* @template U of array
63+
* @param T $one
64+
* @param U $two
65+
* @param callable(value-of<T>, value-of<U>): int $three
66+
* @return array<key-of<T>, value-of<T>>
6667
*/
6768
function array_udiff(
6869
array $one,
6970
array $two,
7071
callable $three
71-
): int {}
72+
): array {}
7273

7374
/**
74-
* @template T
75-
* @template U
76-
* @param array<T> $one
77-
* @param array<U> $two
78-
* @param callable(T, U): int $three
75+
* @template T of array
76+
* @template U of array
77+
* @param T $one
78+
* @param U $two
79+
* @param callable(value-of<T>, value-of<U>): int $three
80+
* @return array<key-of<T>, value-of<T>>
7981
*/
8082
function array_uintersect(
8183
array $one,
8284
array $two,
8385
callable $three
84-
): int {}
86+
): array {}
8587

8688
/**
8789
* @param array<array-key, mixed> $value
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
namespace ArrayUdiff;
4+
5+
use function PHPStan\Testing\assertType;
6+
7+
/**
8+
* @param array<int> $array1
9+
* @param array<string> $array2
10+
* @param array<int, int> $array3
11+
* @param list<string> $list
12+
* @param non-empty-array<int> $nonEmptyArray
13+
*/
14+
function test(array $array1, array $array2, array $array3, array $list, array $nonEmptyArray): void
15+
{
16+
assertType('array<int|string, int>', array_udiff($array1, $array2, static function (mixed $a, mixed $b) {
17+
assertType('int', $a);
18+
assertType('string', $b);
19+
20+
return strcasecmp((string) $a, $b);
21+
}));
22+
23+
assertType('array<int|string, string>', array_udiff($array2, $array1, static function (mixed $a, mixed $b) {
24+
assertType('string', $a);
25+
assertType('int', $b);
26+
27+
return strcasecmp($a, (string) $b);
28+
}));
29+
30+
assertType('array<int|string, int>', array_udiff($array1, $array3, static function (mixed $a, mixed $b) {
31+
assertType('int', $a);
32+
assertType('int', $b);
33+
34+
return $a <=> $b;
35+
}));
36+
37+
assertType('array<int, int>', array_udiff($array3, $array1, static function (mixed $a, mixed $b) {
38+
assertType('int', $a);
39+
assertType('int', $b);
40+
41+
return $a <=> $b;
42+
}));
43+
44+
assertType('array<int|string, int>', array_udiff($array1, $list, static function (mixed $a, mixed $b) {
45+
assertType('int', $a);
46+
assertType('string', $b);
47+
48+
return strcasecmp((string) $a, $b);
49+
}));
50+
51+
assertType('array<int, string>', array_udiff($list, $array1, static function (mixed $a, mixed $b) {
52+
assertType('string', $a);
53+
assertType('int', $b);
54+
55+
return strcasecmp($a, (string) $b);
56+
}));
57+
58+
assertType('array<int|string, int>', array_udiff($nonEmptyArray, $array1, static function (mixed $a, mixed $b) {
59+
assertType('int', $a);
60+
assertType('int', $b);
61+
62+
return $a <=> $b;
63+
}));
64+
65+
assertType('array<int|string, int>', array_udiff($array1, $nonEmptyArray, static function (mixed $a, mixed $b) {
66+
assertType('int', $a);
67+
assertType('int', $b);
68+
69+
return $a <=> $b;
70+
}));
71+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
namespace ArrayUintersect;
4+
5+
use function PHPStan\Testing\assertType;
6+
7+
/**
8+
* @param array<int> $array1
9+
* @param array<string> $array2
10+
* @param array<int, int> $array3
11+
* @param list<string> $list
12+
* @param non-empty-array<int> $nonEmptyArray
13+
*/
14+
function test(array $array1, array $array2, array $array3, array $list, array $nonEmptyArray): void
15+
{
16+
assertType('array<int|string, int>', array_uintersect($array1, $array2, static function (mixed $a, mixed $b) {
17+
assertType('int', $a);
18+
assertType('string', $b);
19+
20+
return strcasecmp((string) $a, $b);
21+
}));
22+
23+
assertType('array<int|string, string>', array_uintersect($array2, $array1, static function (mixed $a, mixed $b) {
24+
assertType('string', $a);
25+
assertType('int', $b);
26+
27+
return strcasecmp($a, (string) $b);
28+
}));
29+
30+
assertType('array<int|string, int>', array_uintersect($array1, $array3, static function (mixed $a, mixed $b) {
31+
assertType('int', $a);
32+
assertType('int', $b);
33+
34+
return $a <=> $b;
35+
}));
36+
37+
assertType('array<int, int>', array_uintersect($array3, $array1, static function (mixed $a, mixed $b) {
38+
assertType('int', $a);
39+
assertType('int', $b);
40+
41+
return $a <=> $b;
42+
}));
43+
44+
assertType('array<int|string, int>', array_uintersect($array1, $list, static function (mixed $a, mixed $b) {
45+
assertType('int', $a);
46+
assertType('string', $b);
47+
48+
return strcasecmp((string) $a, $b);
49+
}));
50+
51+
assertType('array<int, string>', array_uintersect($list, $array1, static function (mixed $a, mixed $b) {
52+
assertType('string', $a);
53+
assertType('int', $b);
54+
55+
return strcasecmp($a, (string) $b);
56+
}));
57+
58+
assertType('array<int|string, int>', array_uintersect($nonEmptyArray, $array1, static function (mixed $a, mixed $b) {
59+
assertType('int', $a);
60+
assertType('int', $b);
61+
62+
return $a <=> $b;
63+
}));
64+
65+
assertType('array<int|string, int>', array_uintersect($array1, $nonEmptyArray, static function (mixed $a, mixed $b) {
66+
assertType('int', $a);
67+
assertType('int', $b);
68+
69+
return $a <=> $b;
70+
}));
71+
}

0 commit comments

Comments
 (0)