Collection   A
last analyzed

Complexity

Total Complexity 17

Size/Duplication

Total Lines 133
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 3
Bugs 0 Features 0
Metric Value
eloc 27
c 3
b 0
f 0
dl 0
loc 133
ccs 40
cts 40
cp 1
rs 10
wmc 17

15 Methods

Rating   Name   Duplication   Size   Complexity  
A __toString() 0 3 1
A count() 0 3 1
A shuffle() 0 5 1
A limit() 0 3 1
A make() 0 3 1
A toJson() 0 3 1
A first() 0 3 1
A last() 0 4 1
A random() 0 4 1
A filter() 0 3 1
A toArray() 0 5 2
A all() 0 3 1
A sortBy() 0 10 2
A isEmpty() 0 3 1
A map() 0 3 1
1
<?php
2
3
namespace Guillermoandrae\Common;
4
5
final class Collection extends AbstractAggregate implements CollectionInterface
6
{
7
    /**
8
     * {@inheritDoc}
9
     */
10 1
    public static function make(array $items = []): CollectionInterface
11
    {
12 1
        return new Collection($items);
13
    }
14
15
    /**
16
     * {@inheritDoc}
17
     */
18 3
    public function all(): array
19
    {
20 3
        return $this->items;
21
    }
22
23
    /**
24
     * {@inheritDoc}
25
     */
26 3
    public function first(): mixed
27
    {
28 3
        return $this->items[0];
29
    }
30
31
    /**
32
     * {@inheritDoc}
33
     */
34 3
    public function last(): mixed
35
    {
36 3
        $key = array_key_last($this->items);
37 3
        return $this->items[$key];
38
    }
39
40
    /**
41
     * {@inheritDoc}
42
     */
43 1
    public function random(): mixed
44
    {
45 1
        $key = array_rand($this->items);
46 1
        return $this->get($key);
47
    }
48
49
    /**
50
     * {@inheritDoc}
51
     */
52 2
    public function sortBy(string $fieldName, bool $reverse = false): CollectionInterface
53
    {
54 2
        $results = $this->items;
55
        usort($results, static function ($item1, $item2) use ($fieldName) {
56 2
            return $item1[$fieldName] <=> $item2[$fieldName];
57 2
        });
58 2
        if ($reverse) {
59 1
            $results = array_reverse($results);
60
        }
61 2
        return new Collection($results);
62
    }
63
64
    /**
65
     * {@inheritDoc}
66
     */
67 5
    public function count(): int
68
    {
69 5
        return count($this->items);
70
    }
71
72
    /**
73
     * {@inheritDoc}
74
     */
75 2
    public function isEmpty(): bool
76
    {
77 2
        return empty($this->items);
78
    }
79
80
    /**
81
     * {@inheritDoc}
82
     */
83 1
    public function shuffle(): CollectionInterface
84
    {
85 1
        $items = $this->items;
86 1
        shuffle($items);
87 1
        return new Collection($items);
88
    }
89
90
    /**
91
     * {@inheritDoc}
92
     */
93 1
    public function limit(int $offset = 0, ?int $limit = null): CollectionInterface
94
    {
95 1
        return new Collection(array_slice($this->items, $offset, $limit));
96
    }
97
98
    /**
99
     * {@inheritDoc}
100
     */
101 1
    public function filter(callable $callback): CollectionInterface
102
    {
103 1
        return new Collection(array_filter($this->items, $callback));
104
    }
105
106
    /**
107
     * {@inheritDoc}
108
     */
109 1
    public function map(callable $callback): CollectionInterface
110
    {
111 1
        return new Collection(array_map($callback, $this->items));
112
    }
113
114
    /**
115
     * {@inheritDoc}
116
     */
117 2
    public function toArray(): array
118
    {
119
        return array_map(static function ($value) {
120 2
            return $value instanceof ArrayableInterface ? $value->toArray() : $value;
121 2
        }, $this->items);
122
    }
123
124
    /**
125
     * {@inheritDoc}
126
     */
127 1
    public function toJson(): string
128
    {
129 1
        return json_encode($this->toArray());
130
    }
131
132
    /**
133
     * {@inheritDoc}
134
     */
135 1
    public function __toString(): string
136
    {
137 1
        return $this->toJson();
138
    }
139
}
140