/
array-slice.php
68 lines (56 loc) · 2.61 KB
/
array-slice.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php
namespace ArraySlice;
use function PHPStan\Testing\assertType;
class Foo
{
/**
* @param non-empty-array $a
*/
public function nonEmpty(array $a): void
{
assertType('array', array_slice($a, 1));
}
/**
* @param mixed $arr
*/
public function fromMixed($arr): void
{
assertType('array', array_slice($arr, 1, 2));
}
public function preserveTypes(array $arr): void
{
/** @var array<int, bool> $arr */
assertType('array<int, bool>', array_slice($arr, 1, 2));
assertType('array<int, bool>', array_slice($arr, 1, 2, true));
/** @var array<string, int> $arr */
assertType('array<string, int>', array_slice($arr, 1, 2));
assertType('array<string, int>', array_slice($arr, 1, 2, true));
/** @var array{17: 'foo', b: 'bar', 19: 'baz'} $arr */
assertType('array{b: \'bar\', 0: \'baz\'}', array_slice($arr, 1, 2));
assertType('array{b: \'bar\', 19: \'baz\'}', array_slice($arr, 1, 2, true));
assertType('array{0: \'foo\', b: \'bar\'}', array_slice($arr, 0, -1));
assertType('array{17: \'foo\', b: \'bar\'}', array_slice($arr, 0, -1, true));
assertType('array{b: \'bar\', 0: \'baz\'}', array_slice($arr, -2, null));
assertType('array{b: \'bar\', 19: \'baz\'}', array_slice($arr, -2, null, true));
/** @var array{17: 'foo', 19: 'bar', 21: 'baz'}|array{foo: 17, bar: 19, baz: 21} $arr */
assertType('array{\'bar\', \'baz\'}|array{bar: 19, baz: 21}', array_slice($arr, 1, 2));
assertType('array{19: \'bar\', 21: \'baz\'}|array{bar: 19, baz: 21}', array_slice($arr, 1, 2, true));
/** @var array{foo?: 17, bar: 19} $arr */
assertType('array{}', array_slice($arr, 0, 0));
assertType('array{}', array_slice($arr, -1, 0));
assertType('array{}', array_slice($arr, 1, 0));
assertType('array{}', array_slice($arr, 1, 1));
assertType('array{foo?: 17, bar?: 19}', array_slice($arr, 0, 1));
assertType('array{foo?: 17, bar: 19}', array_slice($arr, 0));
assertType('array{foo?: 17, bar: 19}', array_slice($arr, -99));
assertType('array{foo?: 17, bar: 19}', array_slice($arr, 0, 99));
/** @var array{foo: 17, bar?: 19, baz: 21, foobar?: 23, barfoo: 25} $arr */
assertType('array{bar?: 19, baz: 21, foobar?: 23, barfoo?: 25}', array_slice($arr, 1, 2));
assertType('array{foo: 17, bar?: 19, baz?: 21}', array_slice($arr, 0, 2));
assertType('array{foo: 17}', array_slice($arr, 0, 1));
assertType('array{bar?: 19, baz?: 21}', array_slice($arr, 1, 1));
assertType('array{foobar?: 23, barfoo?: 25}', array_slice($arr, 2, 1));
assertType('array{foo: 17, bar?: 19, baz?: 21}', array_slice($arr, 0, -1));
assertType('array{bar?: 19, baz: 21, foobar?: 23, barfoo: 25}', array_slice($arr, -2, null));
}
}