1: | <?php declare(strict_types=1); |
2: | |
3: | namespace Salient\Collection; |
4: | |
5: | use Salient\Contract\Core\Arrayable; |
6: | |
7: | /** |
8: | * @api |
9: | * |
10: | * @template TKey of array-key |
11: | * @template TValue |
12: | */ |
13: | trait ReadOnlyCollectionTrait |
14: | { |
15: | /** @use HasItems<TKey,TValue> */ |
16: | use HasItems; |
17: | |
18: | /** |
19: | * @inheritDoc |
20: | */ |
21: | public function __construct($items = []) |
22: | { |
23: | $this->Items = $this->getItemsArray($items); |
24: | } |
25: | |
26: | /** |
27: | * @param Arrayable<TKey,TValue>|iterable<TKey,TValue> $items |
28: | * @return array<TKey,TValue> |
29: | */ |
30: | private function getItemsArray($items): array |
31: | { |
32: | $items = $this->getItems($items); |
33: | return is_array($items) |
34: | ? $items |
35: | : iterator_to_array($items); |
36: | } |
37: | |
38: | /** |
39: | * @param Arrayable<TKey,TValue>|iterable<TKey,TValue> $items |
40: | * @return iterable<TKey,TValue> |
41: | */ |
42: | private function getItems($items): iterable |
43: | { |
44: | if ($items instanceof self) { |
45: | /** @var array<TKey,TValue> */ |
46: | $items = $items->Items; |
47: | } elseif ($items instanceof Arrayable) { |
48: | /** @var array<TKey,TValue> */ |
49: | $items = $items->toArray(); |
50: | } |
51: | return $this->filterItems($items); |
52: | } |
53: | |
54: | /** |
55: | * Override to normalise items applied to the collection |
56: | * |
57: | * @param iterable<TKey,TValue> $items |
58: | * @return iterable<TKey,TValue> |
59: | */ |
60: | private function filterItems(iterable $items): iterable |
61: | { |
62: | return $items; |
63: | } |
64: | } |
65: |