-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathBaseCollection.php
131 lines (115 loc) · 2.7 KB
/
BaseCollection.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
<?php
declare(strict_types=1);
namespace Inspirum\Arrayable;
use ArrayAccess;
use ArrayIterator;
use Countable;
use IteratorAggregate;
use JsonSerializable;
use Stringable;
use Traversable;
use function array_key_exists;
use function array_map;
use function count;
use function json_encode;
use const JSON_THROW_ON_ERROR;
/**
* @template TItemKey of array-key
* @template TItemValue
* @template TKey of array-key
* @template TValue of \Inspirum\Arrayable\Arrayable<TItemKey, TItemValue>
* @implements \ArrayAccess<TKey, TValue>
* @implements \IteratorAggregate<TKey, TValue>
* @implements \Inspirum\Arrayable\Arrayable<TKey, array<TItemKey, TItemValue>>
*/
abstract class BaseCollection implements ArrayAccess, Countable, IteratorAggregate, Arrayable, JsonSerializable, Stringable
{
/**
* @param array<TKey, TValue> $items
*/
public function __construct(
protected array $items,
) {
}
/**
* @param TKey $key
*/
public function offsetExists(mixed $key): bool
{
return array_key_exists($key, $this->items);
}
/**
* @param TKey $key
*
* @return TValue
*/
public function offsetGet(mixed $key): mixed
{
return $this->items[$key];
}
/**
* @param TKey $key
* @param TValue $value
*/
public function offsetSet(mixed $key, mixed $value): void
{
$this->items[$key] = $value;
}
/**
* @param TValue $value
*/
public function offsetAdd(mixed $value): void
{
$this->items[] = $value;
}
/**
* @param TKey $key
*/
public function offsetUnset(mixed $key): void
{
unset($this->items[$key]);
}
public function count(): int
{
return count($this->items);
}
/**
* @return \Traversable<TKey, TValue>
*/
public function getIterator(): Traversable
{
return new ArrayIterator($this->items);
}
/**
* @return array<TKey, TValue>
*/
public function getItems(): array
{
return $this->items;
}
/**
* @return array<TKey, array<TItemKey, TItemValue>>
*/
public function __toArray(): array
{
return array_map(static fn(Arrayable $item): array => $item->__toArray(), $this->items);
}
/**
* @return array<TKey, array<TItemKey, TItemValue>>
*/
public function toArray(): array
{
return $this->__toArray();
}
/**
* @return array<TKey, array<TItemKey, TItemValue>>
*/
public function jsonSerialize(): array
{
return $this->__toArray();
}
public function __toString(): string
{
return json_encode($this->jsonSerialize(), JSON_THROW_ON_ERROR);
}
}