-
-
Notifications
You must be signed in to change notification settings - Fork 117
/
AbstractReflectionCollection.php
150 lines (128 loc) · 2.94 KB
/
AbstractReflectionCollection.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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
<?php
namespace Phpactor\WorseReflection\Core\Reflection\Collection;
use Phpactor\WorseReflection\Core\Exception\ItemNotFound;
use ArrayIterator;
use Traversable;
/**
* @template T
* @implements ReflectionCollection<T>
*/
abstract class AbstractReflectionCollection implements ReflectionCollection
{
/**
* @param array<array-key,T> $items
*/
final protected function __construct(protected array $items)
{
}
public function count(): int
{
return count($this->items);
}
/**
* @return array-key[]
*/
public function keys(): array
{
return array_keys($this->items);
}
/**
* @return static
* @param T[] $reflections
*/
public static function fromReflections(array $reflections): self
{
return new static($reflections);
}
/**
* @return static
*/
public static function empty(): self
{
return new static([]);
}
/**
* @return static
* @param AbstractReflectionCollection<T> $collection
*/
public function merge(ReflectionCollection $collection): self
{
$items = $this->items;
foreach ($collection as $key => $value) {
$items[$key] = $value;
}
return new static($items);
}
/**
* @return T
*/
public function get(string $name)
{
if (!isset($this->items[$name])) {
throw new ItemNotFound(sprintf(
'Unknown item "%s", known items: "%s"',
$name,
implode('", "', array_keys($this->items))
));
}
return $this->items[$name];
}
/**
* @return T
*/
public function first()
{
if ($this->items === []) {
throw new ItemNotFound(
'Collection is empty, cannot get the first item'
);
}
return reset($this->items);
}
/**
* @return T|null
*/
public function firstOrNull()
{
return reset($this->items) ?: null;
}
/**
* @return T
*/
public function last()
{
if (empty($this->items)) {
throw new ItemNotFound(
'Collection is empty, cannot get the last item'
);
}
return end($this->items);
}
/**
* @return T|null
*/
public function lastOrNull()
{
if (empty($this->items)) {
return null;
}
return end($this->items);
}
public function has(string $name): bool
{
return isset($this->items[$name]);
}
public function getIterator(): Traversable
{
return new ArrayIterator($this->items);
}
/**
* @return static
*/
public function byMemberClass(string $fqn): ReflectionCollection
{
return new static(array_filter($this->items, function ($member) use ($fqn) {
return $member instanceof $fqn;
}));
}
}