FileResultCollection::includeFiles()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 5
c 1
b 0
f 0
nc 2
nop 1
dl 0
loc 10
rs 9.4285
1
<?php
2
3
/**
4
 * This file is part of cloak.
5
 *
6
 * (c) Noritaka Horio <[email protected]>
7
 *
8
 * This source file is subject to the MIT license that is bundled
9
 * with this source code in the file LICENSE.
10
 */
11
12
namespace cloak\analyzer\result\collection;
13
14
use cloak\analyzer\result\FileResult;
15
use PhpCollection\Map;
16
use PhpCollection\AbstractMap;
17
use PhpOption\Option;
18
use \Closure;
19
use \IteratorAggregate;
20
use \Countable;
21
22
23
/**
24
 * Class FileResultCollection
25
 * @package cloak\analyzer\result\collection
26
 */
27
class FileResultCollection implements Countable, IteratorAggregate
28
{
29
30
31
    /**
32
     * @var \PhpCollection\Map
33
     */
34
    private $collection;
35
36
    /**
37
     * @param array<string, \cloak\analyzer\result\FileResult> $files
38
     */
39
    public function __construct(array $files = [])
40
    {
41
        $this->collection = new Map($files);
42
    }
43
44
    /**
45
     * @param FileResult $file
46
     */
47
    public function add(FileResult $file)
48
    {
49
        $this->collection->set($file->getPath(), $file);
50
    }
51
52
    /**
53
     * @return array
54
     */
55
    public function all()
56
    {
57
        return $this->toArray();
58
    }
59
60
    /**
61
     * @return mixed|null
62
     */
63
    public function first()
64
    {
65
        $first = $this->collection->first();
66
        return $this->returnValue($first);
67
    }
68
69
    /**
70
     * @return mixed|null
71
     */
72
    public function last()
73
    {
74
        $last = $this->collection->last();
75
        return $this->returnValue($last);
76
    }
77
78
    /**
79
     * @param Option $value
80
     * @return mixed|null
81
     */
82
    private function returnValue(Option $value)
83
    {
84
        if ($value->isEmpty()) {
85
            return null;
86
        }
87
        $kv = $value->get();
88
89
        return array_pop($kv);
90
    }
91
92
    /**
93
     * @return array
94
     */
95
    public function toArray()
96
    {
97
        return $this->createArray($this->collection);
98
    }
99
100
    /**
101
     * @param AbstractMap $collection
102
     * @return array
103
     */
104
    protected function createArray(AbstractMap $collection)
105
    {
106
        $keys = $collection->keys();
107
        $values = $collection->values();
108
109
        return array_combine($keys, $values);
110
    }
111
112
    /**
113
     * @return int
114
     */
115
    public function isEmpty()
116
    {
117
        return $this->collection->isEmpty();
118
    }
119
120
    /**
121
     * @return int
122
     */
123
    public function count()
124
    {
125
        return $this->collection->count();
126
    }
127
128
    /**
129
     * @return \ArrayIterator|\Traversable
130
     */
131
    public function getIterator()
132
    {
133
        return $this->collection->getIterator();
134
    }
135
136
    /**
137
     * @param callable $filter
138
     * @return FileResultCollection
139
     */
140
    public function includeFile(Closure $filter)
141
    {
142
        $files = $this->collection->filter($filter);
143
        return $this->createNew($files);
144
    }
145
146
    /**
147
     * @param array $filters
148
     * @return FileResultCollection
149
     */
150
    public function includeFiles(array $filters)
151
    {
152
        $result = $this;
153
154
        foreach ($filters as $filter) {
155
            $result = $result->includeFile($filter);
156
        }
157
158
        return $result;
159
    }
160
161
    /**
162
     * @param callable $filter
163
     * @return FileResultCollection
164
     */
165
    public function excludeFile(Closure $filter)
166
    {
167
        $files = $this->collection->filterNot($filter);
168
        return $this->createNew($files);
169
    }
170
171
    /**
172
     * @param array $filters
173
     * @return FileResultCollection
174
     */
175
    public function excludeFiles(array $filters)
176
    {
177
        $result = $this;
178
179
        foreach ($filters as $filter) {
180
            $result = $result->excludeFile($filter);
181
        }
182
183
        return $result;
184
    }
185
186
    /**
187
     * @param \PhpCollection\AbstractMap $files
188
     * @return FileResultCollection
189
     */
190
    private function createNew(AbstractMap $files)
191
    {
192
        $values = $this->createArray($files);
193
        return new self($values);
194
    }
195
196
}
197