Lines 97.05% 33 / 34
Methods 95.65% 22 / 23
Classes 0.00% 0 / 1
Name Lines Methods CRAP
 keyedByLabelId 100.00% 1 / 1 100.00% 1 / 1 1
 find 100.00% 1 / 1 100.00% 1 / 1 1
 [Stewart\Contracts\Collection\KeyedCollection] keyedBy 100.00% 4 / 4 100.00% 1 / 1 2
 [Stewart\Contracts\Collection\KeyedCollection] fromElementsByKey 100.00% 1 / 1 100.00% 1 / 1 1
 [Stewart\Contracts\Collection\KeyedCollection] withElementAt 100.00% 3 / 3 100.00% 1 / 1 1
 [Stewart\Contracts\Collection\KeyedCollection] withoutKey 100.00% 3 / 3 100.00% 1 / 1 1
 [Stewart\Contracts\Collection\KeyedCollection] elementAt 100.00% 1 / 1 100.00% 1 / 1 1
 [Stewart\Contracts\Collection\KeyedCollection] hasKey 0.00% 0 / 1 0.00% 0 / 1 2
 [Stewart\Contracts\Collection\KeyedCollection] arrangeElements 100.00% 1 / 1 100.00% 1 / 1 1
 [Stewart\Contracts\Collection\TypedCollection] __construct 100.00% 1 / 1 100.00% 1 / 1 1
 [Stewart\Contracts\Collection\TypedCollection] empty 100.00% 1 / 1 100.00% 1 / 1 1
 [Stewart\Contracts\Collection\TypedCollection] count 100.00% 1 / 1 100.00% 1 / 1 1
 [Stewart\Contracts\Collection\TypedCollection] isEmpty 100.00% 1 / 1 100.00% 1 / 1 1
 [Stewart\Contracts\Collection\TypedCollection] getFirst 100.00% 2 / 2 100.00% 1 / 1 2
 [Stewart\Contracts\Collection\TypedCollection] getLast 100.00% 2 / 2 100.00% 1 / 1 2
 [Stewart\Contracts\Collection\TypedCollection] listValues 100.00% 1 / 1 100.00% 1 / 1 1
 [Stewart\Contracts\Collection\TypedCollection] filter 100.00% 1 / 1 100.00% 1 / 1 1
 [Stewart\Contracts\Collection\TypedCollection] mapToList 100.00% 1 / 1 100.00% 1 / 1 1
 [Stewart\Contracts\Collection\TypedCollection] containsWhere 100.00% 1 / 1 100.00% 1 / 1 1
 [Stewart\Contracts\Collection\TypedCollection] findFirstWhere 100.00% 1 / 1 100.00% 1 / 1 1
 [Stewart\Contracts\Collection\TypedCollection] sortedBy 100.00% 3 / 3 100.00% 1 / 1 1
 [Stewart\Contracts\Collection\TypedCollection] getIterator 100.00% 1 / 1 100.00% 1 / 1 1
 [Stewart\Contracts\Collection\TypedCollection] elements 100.00% 1 / 1 100.00% 1 / 1 1
12final readonly class LabelCollection extends KeyedCollection
13{
14    /** @param iterable<Label> $entries */
15    public static function keyedByLabelId(iterable $entries): self
16    {
17        return self::keyedBy($entries, static fn(Label $entry): string => $entry->labelId->value);
18    }
19
20    public function find(LabelId $labelId): ?Label
21    {
22        return $this->elementAt($labelId->value);
23    }
24}

Inherited from Stewart\Contracts\Collection\KeyedCollection

20    protected static function keyedBy(iterable $elements, Closure $keyOf): static
21    {
22        $keyed = [];
23
24        foreach ($elements as $element) {
25            $keyed[$keyOf($element)] = $element;
26        }
27
28        return new static($keyed);
29    }
32    protected static function fromElementsByKey(array $elementsByKey): static
33    {
34        return new static($elementsByKey);
35    }
41    protected function withElementAt(int|string $key, mixed $element): static
42    {
43        $elements = $this->elements();
44        $elements[$key] = $element;
45
46        return new static($elements);
47    }
50    protected function withoutKey(int|string $key): static
51    {
52        $elements = $this->elements();
53        unset($elements[$key]);
54
55        return new static($elements);
56    }
62    protected function elementAt(int|string $key): mixed
63    {
64        return $this->elements()[$key] ?? null;
65    }
68    protected function hasKey(int|string $key): bool
69    {
70        return \array_key_exists($key, $this->elements());
71    }
77    protected function arrangeElements(array $elements): array
78    {
79        return $elements;
80    }

Inherited from Stewart\Contracts\Collection\TypedCollection

21    final protected function __construct(private array $elements = []) {}
23    public static function empty(): static
24    {
25        return new static();
26    }
28    public function count(): int
29    {
30        return \count($this->elements);
31    }
33    public function isEmpty(): bool
34    {
35        return $this->elements === [];
36    }
39    public function getFirst(): mixed
40    {
41        $key = array_key_first($this->elements);
42
43        return $key === null ? null : $this->elements[$key];
44    }
47    public function getLast(): mixed
48    {
49        $key = array_key_last($this->elements);
50
51        return $key === null ? null : $this->elements[$key];
52    }
55    public function listValues(): array
56    {
57        return array_values($this->elements);
58    }
61    public function filter(Closure $predicate): static
62    {
63        return new static($this->arrangeElements(array_filter($this->elements, $predicate)));
64    }
71    public function mapToList(Closure $transform): array
72    {
73        return array_values(array_map($transform, $this->elements));
74    }
77    public function containsWhere(Closure $predicate): bool
78    {
79        return array_any($this->elements, $predicate);
80    }
86    public function findFirstWhere(Closure $predicate): mixed
87    {
88        return array_find($this->elements, $predicate);
89    }
92    public function sortedBy(Closure $comparator): static
93    {
94        $sorted = $this->elements;
95        uasort($sorted, $comparator);
96
97        return new static($this->arrangeElements($sorted));
98    }
101    public function getIterator(): Traversable
102    {
103        return new ArrayIterator($this->elements);
104    }
113    protected function elements(): array
114    {
115        return $this->elements;
116    }